SKTextureAtlas оставаясь в памяти

Я сделал быстрый проект, чтобы понять, как SpriteKit освобождает атласы из памяти. При каждом нажатии на экран создается атлас и загружается в память. Единственная ссылка на атлас - это то, что вы видите в приведенном ниже коде, и я подумал, что, поскольку var находится внутри неэкранирующей функции, он не содержит строгой ссылки. Моя цель состояла в том, чтобы предыдущие атласы, загруженные в память, были в конечном итоге освобождены, однако память накапливается и в конечном итоге дает сбой.

Я понимаю, что атласы должны загружаться только один раз, и три замечания, которые Apple делает здесь ( Работа со спрайтами) о том, почему текстуры не будут освобождены

Может ли кто-нибудь помочь мне понять, почему это так?

class GameScene: SKScene {

     override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {

        var atlas:SKTextureAtlas? = SKTextureAtlas(named: "Title")

        atlas?.preload {

            atlas = nil

            print("Loaded")

        }

    }

}

Новая ступенька памяти создается каждый раз при обнаружении касания

2 ответа

Решение

Пошёл копаться в других постах ( 2-й ответ) и, похоже, есть ошибка утечки памяти с atlas.preload и нашел способ обойти предварительную загрузку всего SKTextureAtlas - это вызвать что-то вроде

 for texture in self.textureNames {
        SKTexture(imageNamed: texture).size()
    }

Вы выделяете и инициализируете новую текстуру каждый раз, когда вы касаетесь экрана, что означает, что у вас не будет ссылки во второй раз, когда функция запускается, потому что она получает замену новым указателем текстуры

Чтобы решить эту проблему, добавьте static перед объявлением var, что предотвратит перезапись переменной новым указателем до завершения программы

например, если вы вставите эту функцию

var nm = 5 
print(nm)  // will print 5 every time

nm += 1
print(nm)  // will print 6 every time 

НМ перезаписывается каждый раз, когда ставится статический перед объявлением static var nm = 5Решит проблему, и число будет увеличиваться при каждом запуске функции

Другие вопросы по тегам