在任何情况下清除cocos2d的缓存都是不好的实践!清除缓存就像在修理电子设备时使用锤子一样有用。
无条件地清除缓存只会导致角色在下一帧重新加载已被清除的动画和纹理,因为它们确实需要它们!如果您无条件地清除缓存,则未能完成资产内存管理工作(良好)。
仍然可以清除所有内容,但这些情况应该很少见(例如在UIKit应用程序中完全关闭cocos2d)-因为为什么要删除所有缓存的资源?您只需删除您添加的内容,如果这还不够,那么您已经尽力了。
作为应用程序开发人员,您应该了解应用程序的总内存使用情况以及正在使用哪些资源以及哪些资源未使用。包括cocos2d处理的资源。仅释放您知道当前未使用且在不久的将来也不需要的资产即可。这真的很简单,但比简单地清除缓存更需要付出更多的努力-尽管似乎做得很好,但实际上只是一件可怕的事情。
在内存警告期间清除缓存的一个问题是,当您正在预加载资源时,可能会发生内存警告。现在,当您在加载资源时清除缓存,您会自己给自己惹麻烦,因为已经预加载的资源将被删除,然后需要在需要时重新加载。最糟糕的情况是,如果由于首次加载资源所需的额外内存而立即重新加载,则可能导致无法恢复的内存警告(即纹理在短时间内使用2倍内存!)。
在大多数情况下,清除缓存只会延迟与内存警告相关的终止,并在此期间增加游戏的延迟。在其余情况下,它只会导致糟糕的体验,因为游戏会出现卡顿,可能需要较长时间才能恢复。
Cocos2D仅在内存警告期间清除缓存作为最后的救援措施,主要面向那些不关心内存使用等无聊事情的开发人员。这是适用于采取前几个应用程序开发步骤的解决方案,甚至适用于开发人员的第一个应用程序,但对于任何严肃/雄心勃勃的努力来说,它真的几乎没有用处。
作为一个有追求的应用程序开发者,注重质量,您应该以更加优雅的方式响应内存警告。这意味着您首先努力最小化内存警告(这里有一些提示),当它们发生时,您需要确保两件事情:
- 您的应用程序可能很快被终止 - 请务必保存应用程序的状态。
- 释放任何您绝对确定此时不需要的内存。
关于第2点:如果您的编程接近边缘,您可能希望退回到某种“内存安全”模式,在这种模式下,您可以调整应用程序的内存使用率,例如减少精灵、粒子的数量,合并两个纹理的使用,牺牲额外的加载时间来删除某些纹理等。
如果您无法通过第二步释放足够的内存,那么不管您是否清除cocos2d的缓存,第一步几乎是不可避免的。清除CCTextureCache的“未使用”纹理可能有所帮助,但由于精灵帧保留纹理,因此如果您在没有首先释放相应的精灵帧的情况下使用纹理集,则通常不会做太多事情(或者什么都不做)。请记住这一点。
处理内存警告的过程如下:
1.了解正在使用哪些资产以及哪些仅仅是缓存以减少加载时间。
2.删除“当前不需要”的精灵帧,然后调用CCTextureCache的removeUnusedTextures。这样可以最大程度地释放您的应用程序正在使用但实际上不再需要的大部分内存。
3.删除您在代码中分配但当前未使用的任何其他不必要的内存-或者回退到“内存安全”模式(无论您如何实现)。
4.抱最好的希望。
不要无条件清除cocos2d的缓存!这并没有帮助,而且可能只会使情况变得更糟。
考虑到所有的cocos2d缓存,99%的内存将被CCTextureCache保留。因此清除其他任何缓存都是毫无意义的,只需忽略它们。
你真正需要关注的只是你当前使用的纹理集,那些你不需要的可以删除精灵帧和它们的纹理。
如果你一开始就使用.pvr.ccz纹理,你甚至可以完全忽略“缓存以减少加载时间”,并在停止使用每个纹理集时从内存中删除它-因为.pvr.ccz加载非常快,在切换场景方面几乎没有任何影响。这也有助于避免首先出现内存警告。