Cocos2d 2.0: когда хорошая практика для "очистки" кэшей?

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

    [CCTextureCache purgeSharedTextureCache];
    [CCSpriteFrameCache purgeSharedSpriteFrameCache];
    [CCAnimationCache purgeSharedAnimationCache];
    [CCShaderCache purgeSharedShaderCache];
    [[CCFileUtils sharedFileUtils] purgeCachedEntries];

(Я использую Cocos2d 2.0 и ARC включен, не думаю, что это актуально, но все же подумал, что стоит упомянуть)

1 ответ

IMO, это плохая практика, чтобы чистить кеш cocos2d вообще! Очистка кешей является таким же полезным инструментом, как молоток при ремонте электронных устройств.

Нечисто очищать все, только чтобы персонажи перезагрузили свои очищенные анимации и текстуры в следующем кадре, потому что они чертовски нужны! Если вы очищаете кеш безоговорочно, вы еще не сделали свою работу по управлению памятью актива (хорошо).

Можно по-прежнему использовать способы очистки всего, но их должно быть немного и далеко друг от друга (как, например, закрытие cocos2d в приложении UIKit) - потому что зачем вам вообще удалять все кэшированные ресурсы? Вы удаляете то, что добавили, и если этого недостаточно, вы сделали столько, сколько могли.

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

Одна из проблем, связанных с очисткой кэшей, особенно во время предупреждений памяти, заключается в том, что предупреждения памяти могут появляться, когда вы в настоящее время предварительно загружаете ресурсы. Теперь, когда вы очищаете кэши во время загрузки ресурсов, вы стреляете себе в ногу, потому что уже предварительно загруженные ресурсы будут удалены, а затем должны быть загружены снова, как только они понадобятся. В худшем случае это может вызвать предупреждение о неисправимой памяти, если перезагрузка происходит мгновенно из-за дополнительной памяти, необходимой для загрузки ресурсов в первую очередь (т. Е. Текстуры используют 2-кратную память при загрузке в течение короткого периода времени!).

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

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

Как амбициозный разработчик приложений, который следит за качеством, вы должны реагировать на предупреждения памяти более изящным образом. Это означает, что вы, прежде всего, усердно работаете над тем, чтобы минимизировать предупреждения о памяти в целом ( вот несколько советов), и когда они появляются, вы должны убедиться в двух вещах:

  1. Ваше приложение может быть закрыто очень скоро - не забудьте сохранить состояние приложения.
  2. Вы освобождаете любую память, в которой вы абсолютно уверены, что она не нужна на данный момент.

Относительно #2: Если вы программируете близко к краю, вы можете захотеть вернуться к некоторому режиму "безопасности памяти", где вы полностью настраиваете использование памяти вашего приложения, например, отображая меньше спрайтов, частиц, комбинируя использование двух текстур, удаление определенных текстур за счет дополнительного времени загрузки и т. д.

Если вы не можете освободить достаточно памяти с помощью шага № 2, то № 1 произойдет почти неизбежно, независимо от того, очищаете ли вы кэш cocos2d или нет. Очистка "неиспользуемых" текстур CCTextureCache может помочь, но, поскольку спрайт-кадры сохраняют текстуру, она обычно мало что делает (или вообще ничего), если вы используете атласы текстур без предварительного освобождения соответствующих спрайт-фреймов. Запомни.

Процесс обработки предупреждения памяти, таким образом:

  1. Знать, какие активы используются, а какие просто кэшируются, чтобы сократить время загрузки.
  2. Удалите "не нужные" спрайт-фреймы, а затем вызовите CCTextureCache's removeUnusedTextures. Это дает наибольший шанс высвободить большую часть памяти, используемой вашим приложением, в то время как она больше не нужна.
  3. Удалите любую другую постороннюю память, которую вы могли бы выделить в своем коде, но в данный момент не используете - или переключитесь на режим "безопасной памяти" (как бы вы его не реализовали).
  4. Надеюсь на лучшее.

Не очищайте кэши cocos2d безоговорочно! Это не помогает, вероятно, только усугубит ситуацию.

Учитывая все кэши cocos2d, 99% памяти будет сохранено CCTextureCache. Так что в любом случае бессмысленно очищать другие кэши, просто игнорируйте их.

Вам действительно нужно только посмотреть, какие текстурные атласы вы используете в настоящее время, а те, которые вам не нужны, - удалить рамки спрайтов и их текстуры.

Если для начала вы используете текстуры.pvr.ccz, вы даже можете вообще игнорировать "кэширование для сокращения времени загрузки" и удалять из памяти каждый атлас текстуры всякий раз, когда перестаёте его использовать - потому что.pvr.ccz загружается так быстро, что едва любая разница в отношении переключения сцен. Это также помогает избежать предупреждений памяти в первую очередь.

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