Я пытаюсь создать 2d платформенную игру, используя SpriteKit. Игра содержит 21 уровень, то есть 21 сцену и 21 набор плиток.
Каждая сцена содержит несколько плиточных узлов, каждый из которых использует только 1 мозаичный набор.
В какой-то момент я обнаружил, что моя игра потребляет почти 2 ГБ памяти и иногда прерывается из-за проблем с памятью.
Я начал исследовать причины утечек памяти с помощью инструментов. Я нашел 4 утечки, которые показаны на скриншоте.
Ответственная библиотека - JavaScriptCore, я понятия не имею, что, черт возьми, это значит.
Итак, я продолжаю расследование и пытаюсь удалить блоки кода и ресурсы из проекта, чтобы понять, что происходит.
В конце мой проект содержал:
- GameViewController, который выглядит в точности как GameViewController из шаблона XCode.
- Пустой подкласс SKScene
- 1 Сцена
- 21 Tilesets
Код контроллера GameView:
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
}
}
Итак, нет кода, который может вызвать утечки, и игра по-прежнему потребляет 2 ГБ в пиках.
И только когда я удаляю все наборы плиток из проекта, кроме одного, который требуется для уровня - потребление памяти стало нормальным, например ~ 200 МБ.
Я предполагаю, что SpriteKit загружает все наборы плиток в память, несмотря на то, что все наборы плиток в сцене используют только 1 набор плиток.
Кроме того, игра работает хорошо, если я возвращаю наборы плиток обратно в проект и удаляю все узлы плиток со сцены.
Мой вопрос: как правильно справиться с этой ситуацией?
Спасибо!
Обновление 1: график памяти прилагается
Обновление 2: предоставляется код GameViewController