SKTextureAtlas остается в памяти - PullRequest
0 голосов
/ 06 октября 2018

Я сделал быстрый проект, чтобы понять, как 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")

        }

    }

}

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

Ответы [ 2 ]

0 голосов
/ 07 октября 2018

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

 for texture in self.textureNames {
        SKTexture(imageNamed: texture).size()
    }
0 голосов
/ 06 октября 2018

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

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

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

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

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

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

...