Я получаю сбои на iPhone 4s из-за «давления памяти». Моя игра настроена так:
Когда уровень закончен и мы возвращаемся на главную сцену, я бы хотел, чтобы эти кэшированные текстуры игровой сцены были сброшены. В конечном итоге происходит то, что, когда вы играете через 3-4 уровня, он падает, поскольку у него заканчивается память, поскольку он никогда не освобождает эту память после уровня. Я не хочу, чтобы текстуры уровней кэшировались на протяжении всей жизни игровой сцены. При возвращении на главную сцену необходимо освободить эту память.
Я попытался удалить всех детей игровой сцены, которые не влияют на память. Я пытался найти конкретный способ очистки только тех текстур, которые я загрузил в этой игровой сцене из кеша.
Какие-либо предложения?
Вы используете cocos2d v2? Возможно, у вас есть утечки памяти, так как неиспользуемые текстуры удаляются при необходимости. Попробуйте профилировать ваше приложение, чтобы увидеть, есть ли у вас утечки и где они находятся.
Вы также можете вызвать эти методы самостоятельно в соответствующее время, хотя я сомневаюсь, что вам придется:
[[CCTextureCache sharedTextureCache] removeUnusedTextures];
[[CCSpriteFrameCache sharedSpriteFrameCache] removeUnusedSpriteFrames];
Но опять же, то, что вы описываете, больше похоже на утечки памяти. Когда ваше приложение получает предупреждение памяти, кэшированные данные удаляются. Во время этой очистки, среди прочего, в кеше текстуры вызывается метод удаления неиспользуемых текстур. Если у вас есть 3/4 уровня данных, все еще скрывающихся в течение долгого времени после выхода из этих сцен, это звучит как утечка памяти.
Я предполагаю, что это происходит только после посещения нескольких сцен, и проблема не в том, что ваша четвертая сцена просто пытается загрузить больше данных, чем устройство может обработать.
Вы можете удалить определенные текстуры, вызвав:
В cocos2D-x v3.x:
Director::getInstance()->getTextureCache()->removeTextureForKey(ImageKeyName)
В cocos2D-x v2.x:
CCTextureCache::sharedTextureCache()->removeTextureForKey(ImageKeyName);
Где ImageKeyName — это просто путь к изображению (тот же, что вы использовали для загрузки текстуры)