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
相关产品推荐
相关产品推荐

