Здравствуйте!
Уважаемые соратники прошу помочь кто может!
При разработке игры на SpriteKit столкнулся с неизвестной проблемой.
Связано с переходами между сценами.
Кратко опишу:
В игре есть несколько сцен, такие как меню, игровая сцена и сцена покупок.
Так вот, после запуска приложения на реальном устройстве (iPhone 8+) и старта игры объем использованной памяти равняется примерно 74-75 MB, а процессор занят процентов 45-50. В процессе игры эти значения меняются незначительно и остаются примерно на этом же уровне.
Проблема начинается, когда начинаешь менять сцены. Например перешел в основное меню а потом обратно в игру или перезапустил игру заново (рестарт создает сцену заново).
Если так делать несколько раз, неважно, подряд или нет, поиграл или посидел в меню, то отладчик показывает увеличение объема используемой памяти и загрузки процессора. На пятом или шестом переходе загрузка процессора доходит до 100 процентов, а объем используемой памяти вырастает почти в два раза (примерно до 145 - 150 MB). Игра начинает лагать и играть почти невозможно.
Для перехода между сценами используется стандартный метод
let transition = SKTransition.crossFade(withDuration: 1.0)
let gameScene = GameScene(size: self.size)
gameScene.scaleMode = .fill
self.scene!.view?.presentScene(gameScene, transition: transition)
Самое печальное, что игра уже выложена в AppStore, выполнено первое обновление, а я только сейчас это заметил. И не знаю где копать - искать корни проблемы.
Как временное решение я добавил инициализатор в класс GameScene для сохранения ссылки на предыдущую сцену, а в GameScene я применяю к ней методы .removeAllActions(), .removeAllChildren(), .removeFromParent().
class GameScene: ParentScene {
var previosScene = SKScene()
init(size: CGSize, previosScene: SKScene){
super.init(size: size)
self.previosScene = previosScene
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func didMove(to view: SKView) {
previosScene.removeAllActions()
previosScene.removeAllChildren()
previosScene.removeFromParent()
physicsWorld.contactDelegate = self
physicsWorld.gravity = CGVector(dx: 0, dy: -9.8)
...
}
Это увеличивает количество переходов до 20 - 25 до проявления глюков. Но проблему не решает.
Что бы вы полностью ознакомились с кодом и возможно нашли проблему, даю ссылку на проект на GitHub.
Это полный исходный код игры, доступной в AppStore
Заранее благодарен за любую помощь.