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

时间:2013-03-29 13:35:24

标签: ios memory-management cocos2d-iphone automatic-ref-counting cctexturecache

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

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

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

1 个答案:

答案 0 :(得分:5)

IMO根本不用清除cocos2d的缓存是不好的做法!清除缓存对于锤子修复电子设备非常有用。

清除所有内容只会让角色在下一帧中重新加载他们的清除动画和纹理,因为他们不知所措。需要他们!如果您无条件地清除缓存,您还没有完成资产内存管理工作(好)。

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

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

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

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

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

作为一个注重质量的雄心勃勃的应用程序开发人员,您应该以更优雅的方式对内存警告做出反应。首先要意味着你首先要尽量减少内存警告(here are some tips),当它们确实发生时,你需要确定两件事:

  1. 您的应用可能很快就会终止 - 请务必保存该应用的状态。
  2. 您释放目前绝对不需要的任何内存。
  3. 关于#2:如果您正在接近边缘进行编程,您可能希望回到某种“内存安全”状态。模式,你可以完全调低你的应用程序的内存使用量,例如通过显示更少的精灵,粒子,结合使用两个纹理,删除某些纹理而牺牲额外的加载时间等等。

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

    处理内存警告的过程如下:

    1. 了解正在使用的资产,以及仅缓存哪些资产以减少加载时间。
    2. 删除"目前不需要"精灵帧,然后调用CCTextureCache的removeUnusedTextures。这最有可能释放你的应用程序正在使用的大部分内存,而不再需要它。
    3. 删除您在代码中分配但尚未使用的任何其他无关内存 - 或者退回到内存安全"模式(但是你实现了这个)。
    4. 希望最好。
    5. 不要无条件地清除cocos2d的缓存!它没有帮助,它可能只会让事情变得更糟。

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

      您只需要查看当前正在使用的纹理图集,以及那些不删除精灵帧及其纹理的图集。

      如果您开始使用.pvr.ccz纹理,您甚至可以忽略"缓存以减少加载时间"无论什么时候停止使用它都会从内存中删除每个纹理图集 - 因为.pvr.ccz加载得如此之快,就切换场景而言几乎没有任何区别。这也有助于首先避免记忆警告。