【发布时间】:2018-04-02 17:43:47
【问题描述】:
我正在尝试使用 Swift、SpriteKit 和 SKTileMaps 创建一个简单的 2d 平台游戏。但是每次我在包含 SKTileMaps 的场景之间切换时,我都会在 Xcode Instruments 中看到很多内存泄漏。
我已经尽可能简单地重现了这个问题。我正在使用 .sks 文件创建场景,该文件仅包含 1 个填充了一些图块的 tileMap。
视图控制器中用于呈现场景的代码:
if let view = self.view as! SKView? {
let scene = LoadingScene(size: CGSize(width: 2048, height: 1536))
scene.scaleMode = .aspectFill
view.presentScene(scene)
场景代码:
import SpriteKit
import GameplayKit
class GameScene: SKScene {
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
guard let scene = GameScene(fileNamed: "WorldScene") else{fatalError("Could not open world scene")}
view?.presentScene(scene)
}
}
我选择 GameScene 作为 .sks 场景文件中的自定义类。
这会导致我每次更改场景时都会出现很多小的内存泄漏:
picture of memory leak in Instruments
这只是一个场景变化的泄漏。我做错了什么还是这是一个 SpriteKit 错误?
编辑1
每次加载瓦片地图时都会发生 SKCTileMapNode::_ensureChunkForTileIndex(unsigned int) 泄漏,而其余的仅在更改场景时出现
编辑2
更改了 GameViewController 以跳过 LoadingScene 并直接进入 GameScene。内存泄漏依然存在:
if let view = self.view as! SKView? {
guard let scene = GameScene(fileNamed: "WorldScene") else{fatalError("Could not open world scene")}
scene.scaleMode = .aspectFill
view.presentScene(scene)
}
【问题讨论】:
-
没有代码很难说,但你的场景中可能有太多强引用,GC 可能无法打破一些引用循环......
-
第二个代码块是 all 用于 GameScene 的代码。每次触摸屏幕时,它本质上都会呈现一个新的自身实例。它不包含直接引用和子类 SKScene。每次触摸屏幕并呈现新场景时,我仍然会出现内存泄漏。
标签: sprite-kit skscene sktilemapnode