SpriteKit Tileset 内存泄漏
SpriteKit Tileset Memory Leak
我正在尝试使用 SpriteKit 创建 2d 平台游戏。游戏包含 21 个级别,这意味着 21 个场景和 21 个图块集。
每个场景包含多个 tilenode,所有这些仅使用 1 个 tileset。
在某些时候,我发现我的游戏消耗了将近 2GB 的内存,有时由于内存问题而被终止。
我开始使用仪器调查内存泄漏的原因。我发现了 4 个漏洞,显示在随附的屏幕截图中。
负责的库是 JavaScriptCore,我不知道这到底是什么意思。
因此,我继续调查并尝试从项目中删除代码块和资产,以了解发生了什么。
最后我的项目包含:
- GameViewController 看起来与 XCode 模板中的 GameViewController 完全一样。
- SKScene 的空子类
- 1 个场景
- 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 个图块集。
此外,如果我将 tilesets 放回项目并从场景中删除所有 tilenodes,游戏运行良好。
我的问题是如何正确处理这种情况?
谢谢!
更新 1:已附加内存图
Update2:提供GameViewController代码
试试这个:
打开Info.plist
文件,添加一个新行,
键:"PrefersOpenGL"
类型:"Boolean"
值:"YES"
我找到了那个问题的原因。我所有的 tilesets 都在不同的文件中,每个 tileset 都有自己的 sks 文件。当我将所有 tilesets 移动到一个 sks 文件中时,问题就消失了。我假设在某些时候游戏会尝试为每个 sks 文件加载所有现有的图块集并占用太多内存。
我正在尝试使用 SpriteKit 创建 2d 平台游戏。游戏包含 21 个级别,这意味着 21 个场景和 21 个图块集。 每个场景包含多个 tilenode,所有这些仅使用 1 个 tileset。 在某些时候,我发现我的游戏消耗了将近 2GB 的内存,有时由于内存问题而被终止。
我开始使用仪器调查内存泄漏的原因。我发现了 4 个漏洞,显示在随附的屏幕截图中。 负责的库是 JavaScriptCore,我不知道这到底是什么意思。
因此,我继续调查并尝试从项目中删除代码块和资产,以了解发生了什么。
最后我的项目包含:
- GameViewController 看起来与 XCode 模板中的 GameViewController 完全一样。
- SKScene 的空子类
- 1 个场景
- 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 个图块集。
此外,如果我将 tilesets 放回项目并从场景中删除所有 tilenodes,游戏运行良好。
我的问题是如何正确处理这种情况?
谢谢!
更新 1:已附加内存图 Update2:提供GameViewController代码
试试这个:
打开Info.plist
文件,添加一个新行,
键:"PrefersOpenGL" 类型:"Boolean" 值:"YES"
我找到了那个问题的原因。我所有的 tilesets 都在不同的文件中,每个 tileset 都有自己的 sks 文件。当我将所有 tilesets 移动到一个 sks 文件中时,问题就消失了。我假设在某些时候游戏会尝试为每个 sks 文件加载所有现有的图块集并占用太多内存。