2014-01-09 5 views
1

Возможно, это легко, но я потерян.Как избавиться от SKTextures?

У меня есть проект, где я должен сделать полноэкранную анимацию, которая использует 8 jpg для имитации открытия страницы. Так что я делаю:

  • У меня есть SKSpriteNode, отображаемую на весь экран
  • делает массив из 8 SKTextures
  • с использованием SKTexture preloadTextures, чтобы загрузить их
  • когда они загружены, Я использую animateWithTextures для отображения анимации
  • позже, другой метод удаляет SKSpriteNode со сцены.

Когда я сначала делаю поворот страницы, он использует тонну памяти, но когда я запускаю removeFromParent на нем, память продолжает использоваться.

Мой файл .m заявляет об этом на вершине:

SKSpriteNode *pageTurnNode; 

, потому что я хочу, чтобы иметь возможность обратиться к нему легко в обоих методах.

Как избавиться от всех этих текстур и еще чего?

+1

У вас еще есть массив 8 SKTextures, правильно? Вам нужно будет убедиться, что ваш код определен, но пока существует такой массив, все еще есть ссылка на эти текстуры. – prototypical

+0

Да, я не упоминал об этом, но я сразу же положил [arrayName removeAllObjects] сразу после его использования. – Cocorico

ответ

3

Текстуры не могут быть немедленно выпущены из памяти. В Apprantely Sprite Kit используется система кэширования. Он удалит кешированные текстуры, когда сочтет нужным.

Это и то, что @prototypical сказал.

+0

Я думаю, это правильно, но это странно, потому что он в принципе никогда не удаляет кешированные текстуры или, по крайней мере, не до того, как приложение выйдет из строя (потому что другие вещи попадают в память). Не знаю, что я могу сделать, возможно, не использовать ARC в этом случае или что-то в этом роде. – Cocorico

+0

Вы уверены, что авария основана на памяти? Вы не упомянули об аварии в своем вопросе. Продолжаете ли вы создавать новую анимацию поворота страницы? – prototypical

+0

Авария из-за низкой памяти, и проблема в том, что, как только я загружаю эту анимацию, мое использование памяти нажимается ПРАВО на край. Затем, если я добавлю еще несколько вещей, которые используют некоторую память, ТО, когда она падает. – Cocorico

2

Это кажется довольно ценным и относится к этому вопросу, я чувствую.

Основная память, выделенная + textureWithImageNamed: может быть или может не (обычно не) быть освобождена при переходе на новую SKScene. Вы не можете полагаться на это. iOS освобождает память, кэшированную + textureWithImageNamed: или + imageNamed: когда она сочтет нужным, например, когда она обнаруживает условие с низкой памятью.

Если вы хотите, чтобы память была освобождена, как только вы закончите с текстурами , вы должны избегать использования + textureWithImageNamed:/+ imageNamed :. альтернатива для создания SKTextures является:

  1. создать UIImages с + imageWithContentsOfFile:
  2. создать SKTextures из результирующих объектов UIImage по телефону SKTexture/+ textureWithImage: (UIImage *).

Вытащил из этого ответа: iOS 7 Sprite Kit freeing up memory

Смежные вопросы