You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SpriteKit Tileset内存泄漏求助:多tileset致内存占用过高崩溃

SpriteKit 2D平台游戏内存占用过高问题求助

我正在用SpriteKit开发一款2D平台游戏,游戏包含21个关卡,对应21个SKScene场景和21个tileset。每个场景里有若干TileNode,而且每个场景只会用到对应的一个tileset。

最近碰到个头疼的问题:游戏运行时内存占用峰值接近2GB,偶尔还会因为内存不足被系统强制终止。我用Instruments工具排查内存泄漏,结果发现有4处泄漏,责任库居然是JavaScriptCore,这完全让我摸不着头脑——我根本没在项目里用到相关的东西啊。

为了定位问题,我一步步移除代码和资源,最后项目里只剩这些内容:和XCode默认模板几乎一致的GameViewController、一个空的SKScene子类、1个场景文件,以及全部21个tileset。我的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。不过我发现两个关键现象:

  • 只保留当前场景需要的1个tileset时,内存占用就恢复正常了(大概200MB);
  • 如果保留所有21个tileset,但把场景里的所有TileNode都删掉,游戏运行也完全正常。

我推测是SpriteKit把项目里所有的tileset都预加载到内存里了,哪怕当前场景只用到其中一个。

想请教各位大佬,这种情况该怎么妥善处理?感谢!

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

内容的提问来源于stack exchange,提问作者acidbeast

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:12:01