Бесплатный 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. Работа со спрайтами:

-

  1. Предварительная загрузка текстур в память
  2. Удаление текстуры из памяти

Тогда, если память не освобождена, это может быть потому, что все еще существуют ссылки на SKTexture как указано вторым пунктом:

После загрузки текстуры в память графического оборудования она остается в памяти до обращения к ней. SKTexture объект удален Это означает, что между уровнями (или в динамической игре) вам может потребоваться удалить текстурный объект. Удалить SKTexture объект объекта, удалив любые сильные ссылки на него, в том числе:

  • Все ссылки на текстуры от SKSpriteNode а также SKEffectNode объекты в вашей игре
  • Любые сильные ссылки на текстуру в вашем собственном коде
  • SKTextureAtlas объект, который был использован для создания объекта текстуры
Другие вопросы по тегам