0

我正在尝试使用 SpriteKit 创建 2d 平台游戏。游戏包含 21 个关卡,这意味着 21 个场景和 21 个图块集。每个场景包含几个 tilenodes,所有这些 tilenodes 只使用 1 个tileset。在某些时候,我发现我的游戏消耗了将近 2GB 的内存,有时由于内存问题而被终止。

在此处输入图像描述

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

在此处输入图像描述

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

最后我的项目包含:

  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。

在此处输入图像描述

我的猜测是 SpriteKit 将所有图块集加载到内存中,尽管场景的所有图块节点仅使用 1 个图块集。

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

我的问题是如何妥善处理这种情况?

谢谢!

更新1:附上内存图更新2:提供GameViewController代码

在此处输入图像描述

4

2 回答 2

0

我找到了那个问题的原因。我所有的图块集都在不同的文件中,每个图块集都有自己的 sks 文件。当我将所有图块集移动到一个 sks 文件中时,问题就消失了。我假设在某些时候游戏会尝试为每个 sks 文件加载所有现有的图块集并占用太多内存。

于 2020-02-05T13:17:20.643 回答
0

尝试这个:

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

键:“PrefersOpenGL”类型:“布尔”值:“是”

于 2019-05-27T16:24:00.650 回答