Утечка памяти в SpriteKit Tileset - PullRequest
0 голосов
/ 09 марта 2019

Я пытаюсь создать 2d платформенную игру, используя SpriteKit. Игра содержит 21 уровень, то есть 21 сцену и 21 набор плиток. Каждая сцена содержит несколько плиточных узлов, каждый из которых использует только 1 мозаичный набор. В какой-то момент я обнаружил, что моя игра потребляет почти 2 ГБ памяти и иногда прерывается из-за проблем с памятью.

enter image description here

Я начал исследовать причины утечек памяти с помощью инструментов. Я нашел 4 утечки, которые показаны на скриншоте. Ответственная библиотека - JavaScriptCore, я понятия не имею, что, черт возьми, это значит.

enter image description here

Итак, я продолжаю расследование и пытаюсь удалить блоки кода и ресурсы из проекта, чтобы понять, что происходит.

В конце мой проект содержал:

  1. GameViewController, который выглядит в точности как GameViewController из шаблона XCode.
  2. Пустой подкласс SKScene
  3. 1 Сцена
  4. 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 МБ.

enter image description here

Я предполагаю, что SpriteKit загружает все наборы плиток в память, несмотря на то, что все наборы плиток в сцене используют только 1 набор плиток.

Кроме того, игра работает хорошо, если я возвращаю наборы плиток обратно в проект и удаляю все узлы плиток со сцены.

Мой вопрос: как правильно справиться с этой ситуацией?

Спасибо!

Обновление 1: график памяти прилагается Обновление 2: предоставляется код GameViewController

enter image description here

1 Ответ

0 голосов
/ 27 мая 2019

Попробуйте:

открыть Info.plist файл, добавить новую строку,

ключ: тип "PrefersOpenGL": "логическое" значение: "ДА"

...