Cocos2dx — очистка определенных текстур из кеша

Я получаю сбои на iPhone 4s из-за «давления памяти». Моя игра настроена так:

  1. Основной спрайт-лист сцены, который всегда остается в памяти.
  2. Уровни отдельных игровых сцен загружаются из отдельных текстур (не спрайтов).

Когда уровень закончен и мы возвращаемся на главную сцену, я бы хотел, чтобы эти кэшированные текстуры игровой сцены были сброшены. В конечном итоге происходит то, что, когда вы играете через 3-4 уровня, он падает, поскольку у него заканчивается память, поскольку он никогда не освобождает эту память после уровня. Я не хочу, чтобы текстуры уровней кэшировались на протяжении всей жизни игровой сцены. При возвращении на главную сцену необходимо освободить эту память.

Я попытался удалить всех детей игровой сцены, которые не влияют на память. Я пытался найти конкретный способ очистки только тех текстур, которые я загрузил в этой игровой сцене из кеша.

Какие-либо предложения?

0

Решение

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

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

[[CCTextureCache sharedTextureCache] removeUnusedTextures];
[[CCSpriteFrameCache sharedSpriteFrameCache] removeUnusedSpriteFrames];

Но опять же, то, что вы описываете, больше похоже на утечки памяти. Когда ваше приложение получает предупреждение памяти, кэшированные данные удаляются. Во время этой очистки, среди прочего, в кеше текстуры вызывается метод удаления неиспользуемых текстур. Если у вас есть 3/4 уровня данных, все еще скрывающихся в течение долгого времени после выхода из этих сцен, это звучит как утечка памяти.

Я предполагаю, что это происходит только после посещения нескольких сцен, и проблема не в том, что ваша четвертая сцена просто пытается загрузить больше данных, чем устройство может обработать.

1

Другие решения

Вы можете удалить определенные текстуры, вызвав:

В cocos2D-x v3.x:

Director::getInstance()->getTextureCache()->removeTextureForKey(ImageKeyName)

В cocos2D-x v2.x:

CCTextureCache::sharedTextureCache()->removeTextureForKey(ImageKeyName);

Где ImageKeyName — это просто путь к изображению (тот же, что вы использовали для загрузки текстуры)

1