Cocos2d. Загружать и хранить изображения правильно?

Есть много ответов на этот вопрос. Но все они неверны!

Например, если я создал объект CCLayer с одним объектом CCSprite. У меня есть 3 текстуры, и я хочу переключаться между ними при каждом касании.

Например, я буду использовать что-то похожее на это:

ссылка на сайт

Я запускаю это приложение в симуляторе. Тогда я вызываю предупреждение памяти. Затем я пытаюсь переключаться между изображениями (текстурами). И я вижу, что 2 из 3 изображений удаляются (кроме того, что изображение показывалось одновременно с предупреждением памяти).

Я попытался использовать команды retain/release для CCSprite и СС Texture2D, но они вызывают ситуацию, когда метод dealloc освобожденного объекта никогда не вызывается.

Так как правильно их хранить? Я хочу сохранить их при предупреждении памяти и освободить / удалить их, когда текущий слой уничтожен.

3 ответа

Решение

Храните их в одном текстурном атласе, созданном с помощью Texture Packer. Тогда это так же просто, как вызов [Sprite setDisplayFrame:frameName] для переключения отображаемой текстуры.

По умолчанию в предупреждении памяти cocos2d удалит неиспользуемые текстуры. Весь смысл предупреждения о памяти заключается в том, что ОС говорит вашему приложению "эй, это нехорошо, уменьшите ваш аппетит памяти, или я вас отключу", и ваше приложение должно выглядеть как "ой, извините, освобождаю память сейчас".

Если вы получаете предупреждение памяти при предварительной загрузке текстур, поведение по умолчанию, при котором cocos2d удаляет неиспользуемые текстуры, уронит вас в ногу. Подробнее об этой проблеме здесь.

Мой совет: уберите вызов для очистки кэшей cocos2d в методе предупреждения памяти в AppDelegate. Конечно, вы хотите быть очень осторожным с использованием памяти. В качестве альтернативы вы можете просто отключить поведение во время предварительной загрузки изображений, но это может просто перенести проблему на более поздний этап.

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