SpriteKit Tileset内存泄漏

时间:2019-03-09 14:26:03

标签: ios swift sprite-kit sktilemapnode

我正在尝试使用SpriteKit创建2D平台游戏。游戏包含21个关卡,这意味着21个场景和21个图块。 每个场景都包含多个tilenode,所有节点仅使用1个tileet。 在某个时候,我发现我的游戏消耗了将近2GB的内存,有时由于内存问题而终止。

enter image description here

我开始使用仪器调查这种内存泄漏的原因。我发现有4个泄漏,显示在所附的屏幕截图中。 负责的库是JavaScriptCore,我不知道这到底意味着什么。

enter image description here

因此,我继续进行调查,并尝试从项目中删除代码块和资产,以了解发生的情况。

最后,我的项目包含:

  1. GameViewController,它与XCode模板中的GameViewController完全一样。
  2. SKScene的空子类
  3. 1个场景
  4. 21个图块集

GameViewController的代码:

class GameViewController: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()
    if let scene = GKScene(fileNamed: "GameScene") {
        if let sceneNode = scene.rootNode as! SKScene? {
            sceneNode.scaleMode = .aspectFill
            if let view = self.view as! SKView? {
                view.presentScene(sceneNode)
                view.ignoresSiblingOrder = true
            }
        }
    }
}


override var shouldAutorotate: Bool {
    return true
}


override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
    if UIDevice.current.userInterfaceIdiom == .phone {
        return .allButUpsideDown
    } else {
        return .all
    }
}


override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Release any cached data, images, etc that aren't in use.
}


override var prefersStatusBarHidden: Bool {
    return true
}

}

因此,没有任何代码可能导致泄漏,并且游戏峰值仍消耗2GB。 而且只有当我从项目中删除所有平铺集时(级别所需的一个除外)时,内存消耗才恢复正常,例如〜200mb。

enter image description here

我猜想,尽管场景中的所有tilenode仅使用1个tileset,但SpriteKit会将所有tileset加载到内存中。

此外,如果我将图块集放回项目并从场景中删除所有图块节点,则游戏效果很好。

我的问题是如何正确处理这种情况?

谢谢!

Update1:​​已附加内存图 Update2:提供了GameViewController代码

enter image description here

2 个答案:

答案 0 :(得分:0)

尝试一下:

打开Info.plist文件,添加新行,

键:“首选OpenGL” 类型:“布尔值” 值:“是”

答案 1 :(得分:0)

我找到了这个问题的原因。我所有的磁贴集都在不同的文件中,每个磁贴集都有自己的sks文件。当我将所有tileset移入一个sks文件时,问题消失了。我认为游戏有时会尝试为每个sks文件加载所有现有的tileset,并占用太多内存。