Cocos2d 2.0:什么时候“清除”缓存是一个好的实践?

3

在每个场景的开头调用以下"purge"方法是否是很好的做法? 如果不是,请问我应该何时调用它们?是否有任何教程可以解释何时使用每个调用?我是否漏掉了什么?

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

(我正在使用Cocos2d 2.0并启用了ARC,虽然不认为这很相关,但仍然觉得值得一提)
1个回答

5

在任何情况下清除cocos2d的缓存都是不好的实践!清除缓存就像在修理电子设备时使用锤子一样有用。

无条件地清除缓存只会导致角色在下一帧重新加载已被清除的动画和纹理,因为它们确实需要它们!如果您无条件地清除缓存,则未能完成资产内存管理工作(良好)。

仍然可以清除所有内容,但这些情况应该很少见(例如在UIKit应用程序中完全关闭cocos2d)-因为为什么要删除所有缓存的资源?您只需删除您添加的内容,如果这还不够,那么您已经尽力了。

作为应用程序开发人员,您应该了解应用程序的总内存使用情况以及正在使用哪些资源以及哪些资源未使用。包括cocos2d处理的资源。仅释放您知道当前未使用且在不久的将来也不需要的资产即可。这真的很简单,但比简单地清除缓存更需要付出更多的努力-尽管似乎做得很好,但实际上只是一件可怕的事情。

在内存警告期间清除缓存的一个问题是,当您正在预加载资源时,可能会发生内存警告。现在,当您在加载资源时清除缓存,您会自己给自己惹麻烦,因为已经预加载的资源将被删除,然后需要在需要时重新加载。最糟糕的情况是,如果由于首次加载资源所需的额外内存而立即重新加载,则可能导致无法恢复的内存警告(即纹理在短时间内使用2倍内存!)。
在大多数情况下,清除缓存只会延迟与内存警告相关的终止,并在此期间增加游戏的延迟。在其余情况下,它只会导致糟糕的体验,因为游戏会出现卡顿,可能需要较长时间才能恢复。
Cocos2D仅在内存警告期间清除缓存作为最后的救援措施,主要面向那些不关心内存使用等无聊事情的开发人员。这是适用于采取前几个应用程序开发步骤的解决方案,甚至适用于开发人员的第一个应用程序,但对于任何严肃/雄心勃勃的努力来说,它真的几乎没有用处。

作为一个有追求的应用程序开发者,注重质量,您应该以更加优雅的方式响应内存警告。这意味着您首先努力最小化内存警告(这里有一些提示),当它们发生时,您需要确保两件事情:

  1. 您的应用程序可能很快被终止 - 请务必保存应用程序的状态。
  2. 释放任何您绝对确定此时不需要的内存。

关于第2点:如果您的编程接近边缘,您可能希望退回到某种“内存安全”模式,在这种模式下,您可以调整应用程序的内存使用率,例如减少精灵、粒子的数量,合并两个纹理的使用,牺牲额外的加载时间来删除某些纹理等。

如果您无法通过第二步释放足够的内存,那么不管您是否清除cocos2d的缓存,第一步几乎是不可避免的。清除CCTextureCache的“未使用”纹理可能有所帮助,但由于精灵帧保留纹理,因此如果您在没有首先释放相应的精灵帧的情况下使用纹理集,则通常不会做太多事情(或者什么都不做)。请记住这一点。
处理内存警告的过程如下:
1.了解正在使用哪些资产以及哪些仅仅是缓存以减少加载时间。
2.删除“当前不需要”的精灵帧,然后调用CCTextureCache的removeUnusedTextures。这样可以最大程度地释放您的应用程序正在使用但实际上不再需要的大部分内存。
3.删除您在代码中分配但当前未使用的任何其他不必要的内存-或者回退到“内存安全”模式(无论您如何实现)。
4.抱最好的希望。
不要无条件清除cocos2d的缓存!这并没有帮助,而且可能只会使情况变得更糟。
考虑到所有的cocos2d缓存,99%的内存将被CCTextureCache保留。因此清除其他任何缓存都是毫无意义的,只需忽略它们。
你真正需要关注的只是你当前使用的纹理集,那些你不需要的可以删除精灵帧和它们的纹理。
如果你一开始就使用.pvr.ccz纹理,你甚至可以完全忽略“缓存以减少加载时间”,并在停止使用每个纹理集时从内存中删除它-因为.pvr.ccz加载非常快,在切换场景方面几乎没有任何影响。这也有助于避免首先出现内存警告。

2
很高兴有这么多信息,但是对我来说,这个答案太长了。对我来说,简短的要点是: 1)无条件清除cocos2d缓存可能会导致重新加载资源时出现延迟 2)如果清除其他缓存,请确保清除CCTextureCache - user1021430
谢谢您的总结,巧合的是我不得不去查找TLDR的含义 :) TSDK (太短了,不懂) - CodeSmile
哈哈,现在你也可以在StackOverflow上打击其他人的答案了 :P我一直在研究与cocos2d相关的内存管理,并发现这个答案很有用。总的来说,我发现保持我的内存占用率低需要调用removeSpriteFramesFromFile从精灵帧缓存中删除精灵帧,以及从纹理缓存中删除该精灵表的removeTexture。我通常在场景转换时执行此操作。 我无条件地清除缓存,但仅适用于应用程序的开头动画的特殊情况,之后不会再使用这些精灵。 - user1021430
那么,“内存占用”呢?我的一个当前应用程序的占用空间相当大(我认为,我还没有以字节为单位测量它),当切换到其他应用程序并返回时,我感觉我的大脚应用程序已经从内存中清除了(即使在“iPhone 5”上(不是s/c)),因为它比我迄今制作的其他60-70个iOS应用程序更经常重新启动 - 甚至比我制作的其他5个左右的cocos2d应用程序更经常。 :-P 我想我应该在新场景的init中清除纹理缓存...如果这确实有助于保持占用空间小的话。user1021430的评论似乎相关。 - Jonny
我有6个不同的纹理图集,每个关卡我都会加载其中一个。我正在清除,删除未使用的图集,但它仍然会像我没有删除一样消耗内存... 我需要帮助。 - RollRoll

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接