Бесплатный SKTextureAtlas From Memory
У меня проблема с получением атласа текстуры бесплатно. В настоящее время у меня есть игра SpriteKit, в которой игрок может изменить своего персонажа. Прямо сейчас у меня есть атлас в глобальном общем экземпляре, вот так.
let char0Atlas: SKTextureAtlas = SKTextureAtlas(named: "Atlas/iPhone/char0")
let char1Atlas: SKTextureAtlas = SKTextureAtlas(named: "Atlas/iPhone/char1")
let char2Atlas: SKTextureAtlas = SKTextureAtlas(named: "Atlas/iPhone/char2")
Каждый персонаж, которого вы можете изменить, имеет свой собственный атлас текстуры. Я получаю анимацию движения, ожидания и прыжка игрока из атласа этого персонажа с помощью метода, подобного этому:
func charAnimation(char: CharEnum) -> [SKTexture] {
var temp: [SKTexture] = []
var name: String = ""
let atlas: SKTextureAtlas = char.atlasForChar()
for i in 1...20 {
if i > 9 { name = "char_\(charId)_idle_00\(i)" }
else { name = "char_\(charId)_idle_000\(i)" }
temp.append(atlas.textureNamed(name))
}
return temp
}
И это хранится в переменной экземпляра массива в классе узла спрайта игрока. Таким образом, каждый раз, когда персонаж меняется, эти кадры заменяются новыми, поэтому старые должны быть освобождены правильно?
class PlayerNode: SpriteNode {
private var currentAnimation: [SKTexture] = []
private var animations: (idle: [SKTexture], run: [SKTexture], jump: [SKTexture]) = PlayerController.animationsForHero(.CharOne)
}
Также, когда игрок меняет персонажей, я использую это для предварительной загрузки атласа текстуры:
SKTextureAtlas.preloadTextureAtlases([char.atlasForHero()], withCompletionHandler: { () -> Void in
updateChar()
})
Почему SpriteKit никогда не освобождает память от предыдущих анимаций персонажей? Если игрок переключается на новых персонажей, память постоянно увеличивается и вылетает приложение. Если персонаж, который уже был выбран в этом сеансе, выбирается снова, память не увеличивается. Это показывает утечку памяти. Анимация персонажей не освобождается. Зачем?
Я понимаю, что SpriteKit должен сам позаботиться об этом, поэтому это сбивает с толку. Разве нет абсолютно никакого способа самостоятельно освободить атлас текстуры вручную?
Спасибо!
1 ответ
@dragoneye первый пункт правильный: вы должны предварительно загрузить SKTextureAtlas
только однажды.
Взгляните на документацию Apple. Работа со спрайтами:
-
- Предварительная загрузка текстур в память
- Удаление текстуры из памяти
Тогда, если память не освобождена, это может быть потому, что все еще существуют ссылки на SKTexture
как указано вторым пунктом:
После загрузки текстуры в память графического оборудования она остается в памяти до обращения к ней.
SKTexture
объект удален Это означает, что между уровнями (или в динамической игре) вам может потребоваться удалить текстурный объект. УдалитьSKTexture
объект объекта, удалив любые сильные ссылки на него, в том числе:
- Все ссылки на текстуры от
SKSpriteNode
а такжеSKEffectNode
объекты в вашей игре- Любые сильные ссылки на текстуру в вашем собственном коде
SKTextureAtlas
объект, который был использован для создания объекта текстуры