Проблемы с управлением памятью в SpriteKit

spritekit

#1

Здравствуйте!

Уважаемые соратники прошу помочь кто может!

При разработке игры на 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

Заранее благодарен за любую помощь.