3

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

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

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

ответ

5

ИМО это плохая практика, чтобы очистить кэши Cocos2D на всех! Очистка кешей является полезным инструментом, так как молот находится в ремонте электронных устройств.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

+2

Приятно иметь много информации, но этот ответ был TLDR для меня. Короткий взнос для меня был: 1) Очистка кэшей cocos2d безоговорочно может вызвать задержки при перезагрузке активов 2) Убедитесь, что вы очистили CCTextureCache, если вы очищаете другие кеши – user1021430

+0

спасибо за резюме, по совпадению мне пришлось искать то, что означает TLDR:) TSDK (слишком короткий, не знаю) – LearnCocos2D

+0

Ха-ха, теперь вы можете снимать ответы других людей на StackOverflow тоже: P Я работал над некоторым управлением памятью, подобным cocos2d, и нашел этот ответ полезным. В общем, я считаю, что для поддержания минимального объема памяти требуется вызывать removeSpriteFramesFromFile в кеше кадра спрайта, а также removeTexture для этого листа спрайтов в кеше текстуры. Обычно я делаю это при сцене. Я очищаю тайники безоговорочно, но только для специального случая, когда у меня есть набор анимаций для приложения, и ни один из этих спрайтов никогда не будет использоваться снова после этого – user1021430

Смежные вопросы