Cocos2d 2.0:何时是"清除"缓存的好习惯?

mm2*_*m24 3 memory-management cocos2d-iphone ios automatic-ref-counting cctexturecache

在每个场景的开头调用以下"清除"方法是一种好习惯吗?如果不是,我应该什么时候打电话给他们,是否有任何教程解释何时使用每个电话?我错过了什么吗?

    [CCTextureCache purgeSharedTextureCache];
    [CCSpriteFrameCache purgeSharedSpriteFrameCache];
    [CCAnimationCache purgeSharedAnimationCache];
    [CCShaderCache purgeSharedShaderCache];
    [[CCFileUtils sharedFileUtils] purgeCachedEntries];
Run Code Online (Sandbox Code Playgroud)

(我正在使用Cocos2d 2.0并启用了ARC,不要认为它是相关的,但仍然认为值得一提)

Lea*_*s2D 5

IMO清除cocos2d的缓存是不好的做法!清除高速缓存与锤子修复电子设备一样有用.

清除一切只是为了让角色在下一帧中重新加载他们被清除的动画和纹理是相反的,因为他们害怕'需要它们!如果你无条件地清除缓存,你还没有完成资产内存管理工作(好).

仍然可以使用清除所有内容,但它们应该很少(例如在UIKit应用程序中完全关闭cocos2d) - 因为为什么要删除所有缓存的资源?你删除你添加的内容,如果这还不够,你已尽可能多地完成了.

作为应用程序开发人员,您应该了解应用程序的总内存使用情况以及正在使用哪些资产以及哪些资产未使用.包括cocos2d处理的资源.仅发布您目前未使用的资产,在不久的将来也不需要.它真的那么简单,但它比简单地清除缓存更多的工作 - 这似乎做了工作,但真的只是一件可怕的事情.

在内存警告期间清除缓存的一个问题是当您正在预加载资产时可能会发生内存警告.现在,当您在加载资产时清除缓存时,您将自己开枪,因为已经预先加载的资产将被删除,然后需要在需要时立即再次加载.在最坏的情况下,如果由于首先加载资源所需的额外内存(即纹理在短时间内加载时使用2x内存!),重新加载会立即发生,这实际上会导致不可恢复的内存警告.

在大多数情况下,清除缓存只会延迟与内存警告相关的终止,同时在游戏中增加延迟.在剩下的情况下,它会简单地造成糟糕的体验,因为游戏可能会在较长一段时间内恢复.

Cocos2D仅在内存警告中清除缓存作为最后的手段,并且主要针对那些不关心内存使用等无意义的开发人员.这是一个解决方案,适用于前几个应用程序开发步骤,甚至可能是开发人员的第一个应用程序,但对于任何严肃/雄心勃勃的工作来说实际上是无用的.

作为一个注重质量的雄心勃勃的应用程序开发人员,您应该以更优雅的方式对内存警告做出反应.这意味着你首先要努力最大限度地减少内存警告(这里有一些提示),当它们确实发生时,你需要确定两件事:

  1. 您的应用可能很快就会终止 - 请务必保存应用的状态.
  2. 你释放了你现在绝对不需要的任何记忆.

关于#2:如果你正在接近边缘编程,你可能想要回到某种"内存安全"模式,你可以完全调低应用程序的内存使用量,例如通过显示更少的精灵,粒子,组合使用两个纹理,以额外的加载时间为代价去除某些纹理等.

如果你不能通过步骤#2释放足够的内存,那么无论你是否清除cocos2d的缓存,#1都将不可避免地发生.清除CCTextureCache的"未使用"纹理可能有所帮助,但是由于精灵帧保留了纹理,如果你在没有首先释放相应的精灵帧的情况下使用纹理图集,它通常不会做太多(或没有).记在脑子里.

因此处理内存警告的过程是:

  1. 了解正在使用的资产,以及仅缓存哪些资产以减少加载时间.
  2. 删除"当前不需要"的精灵帧,然后调用CCTextureCache的removeUnusedTextures.这最有可能释放你的应用程序正在使用的大部分内存,而不再需要它.
  3. 删除您可能在代码中分配但当前未使用的任何其他无关内存 - 或者回退到"内存安全"模式(但是您实现了这一点).
  4. 希望最好的.

不要无条件地清除cocos2d的缓存!它没有帮助,它可能只会让事情变得更糟.

考虑到所有cocos2d缓存,CCTextureCache将保留99%的内存.因此,无论如何清除任何其他缓存都是毫无意义的,只是忽略它们.

你真的只需要看看你正在使用的纹理图集,以及那些不删除精灵框架及其纹理的图集.

如果您开始使用.pvr.ccz纹理,您甚至可以完全忽略"缓存以减少加载时间"并在每次停止使用时从内存中删除每个纹理图集 - 因为.pvr.ccz加载速度太快它几乎不能关于切换场景的任何差异.这也有助于首先避免内存警告.

  • 很高兴有很多信息,但这个答案对我来说是TLDR.对我来说简短的说法是:1)无条件清除cocos2d缓存可能会导致资产重新加载时出现延迟2)如果清除其他缓存,请务必清除CCTextureCache (2认同)