Cocos2d. Загружать и хранить изображения правильно?
Есть много ответов на этот вопрос. Но все они неверны!
Например, если я создал объект CCLayer с одним объектом CCSprite. У меня есть 3 текстуры, и я хочу переключаться между ними при каждом касании.
Например, я буду использовать что-то похожее на это:
Я запускаю это приложение в симуляторе. Тогда я вызываю предупреждение памяти. Затем я пытаюсь переключаться между изображениями (текстурами). И я вижу, что 2 из 3 изображений удаляются (кроме того, что изображение показывалось одновременно с предупреждением памяти).
Я попытался использовать команды retain/release для CCSprite и СС Texture2D, но они вызывают ситуацию, когда метод dealloc освобожденного объекта никогда не вызывается.
Так как правильно их хранить? Я хочу сохранить их при предупреждении памяти и освободить / удалить их, когда текущий слой уничтожен.
3 ответа
Храните их в одном текстурном атласе, созданном с помощью Texture Packer. Тогда это так же просто, как вызов [Sprite setDisplayFrame:frameName] для переключения отображаемой текстуры.
По умолчанию в предупреждении памяти cocos2d удалит неиспользуемые текстуры. Весь смысл предупреждения о памяти заключается в том, что ОС говорит вашему приложению "эй, это нехорошо, уменьшите ваш аппетит памяти, или я вас отключу", и ваше приложение должно выглядеть как "ой, извините, освобождаю память сейчас".
Если вы получаете предупреждение памяти при предварительной загрузке текстур, поведение по умолчанию, при котором cocos2d удаляет неиспользуемые текстуры, уронит вас в ногу. Подробнее об этой проблеме здесь.
Мой совет: уберите вызов для очистки кэшей cocos2d в методе предупреждения памяти в AppDelegate. Конечно, вы хотите быть очень осторожным с использованием памяти. В качестве альтернативы вы можете просто отключить поведение во время предварительной загрузки изображений, но это может просто перенести проблему на более поздний этап.