0

我做了一个快速项目来了解 SpriteKit 如何从内存中释放地图集。每次点击屏幕时,都会创建一个图集并将其加载到内存中。对图集的唯一引用是您在下面的代码中看到的内容,我认为由于 var 位于非转义函数内部,因此它不具有强引用。我的目标是最终释放加载到内存中的先前地图集,但是内存堆积并最终崩溃。

我知道地图集只应该加载一次,Apple 在这里提出的三点(使用 Sprites)关于为什么不释放纹理

有人可以帮我理解为什么会这样吗?

class GameScene: SKScene {

     override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {

        var atlas:SKTextureAtlas? = SKTextureAtlas(named: "Title")

        atlas?.preload {

            atlas = nil

            print("Loaded")

        }

    }

}

在此处输入图像描述 每次检测到触摸时都会创建一个新的内存阶梯

4

2 回答 2

0

每次触摸屏幕时都会分配和初始化一个新纹理,这意味着函数第二次运行时将没有引用,因为它被新的纹理指针替换

为了解决这个问题,在 var 声明之前添加静态,这将防止变量被新指针覆盖,直到程序完成

例如,如果您输入该功能

var nm = 5 
print(nm)  // will print 5 every time

nm += 1
print(nm)  // will print 6 every time 

nm 每次在声明它之前放置 static 都会被覆盖 static var nm = 5 将解决问题,您会看到每次函数运行时数字都会增加

于 2018-10-06T18:35:37.423 回答
0

去挖掘其他帖子(第二个答案),似乎 atlas.preload 存在内存泄漏错误,并发现预加载整个 SKTextureAtlas 的工作是调用类似

 for texture in self.textureNames {
        SKTexture(imageNamed: texture).size()
    }
于 2018-10-07T16:07:31.263 回答