IMO 完全清除 cocos2d 的缓存是不好的做法!清除缓存是一种有用的工具,就像锤子在修理电子设备时一样有用。
清除所有内容只是让角色在下一帧中重新加载他们清除的动画和纹理是适得其反的,因为他们需要它们!如果您无条件地清除缓存,那么您还没有完成资产内存管理工作(好吧)。
仍然可以使用来清除所有内容,但它们应该很少见(比如在 UIKit 应用程序中完全关闭 cocos2d) - 因为你为什么要删除所有缓存的资源?你删除了你添加的内容,如果这还不够,你已经做了尽可能多的事情。
作为应用程序开发人员,您应该了解应用程序的总内存使用量以及哪些资产正在使用,哪些未使用。包括cocos2d处理的资源。仅发布您知道当前未使用且在不久的将来也不需要的那些资产。真的就这么简单,但它比简单地清除缓存更费力——这似乎可以完成这项工作,但实际上是一件很糟糕的事情。
在内存警告期间专门清除缓存的一个问题是,当您当前预加载资产时可能会出现内存警告。现在,当您在加载资产时清除缓存时,您是在自找麻烦,因为已经预加载的资产将被删除,然后需要在需要时再次加载。在最坏的情况下,如果由于首先加载资产所需的额外内存而立即发生重新加载,这实际上会导致不可恢复的内存警告(即,纹理在加载时会使用 2 倍内存,而加载时间很短!)。
在大多数情况下,清除缓存只会延迟与内存警告相关的终止,同时会增加游戏的延迟。在其余情况下,它只会在游戏口吃恢复时造成糟糕的体验,可能需要更长的时间。
Cocos2D 在内存警告期间清除缓存只是作为最后的手段,主要针对那些不会关心诸如内存使用之类的废话的开发人员。这是一个适用于最初几个应用程序开发步骤的解决方案,甚至可能适用于开发人员的第一个应用程序,但对于任何认真/雄心勃勃的努力来说实际上几乎没有用处。
作为一个关注质量的雄心勃勃的应用程序开发人员,您应该以更优雅的方式对内存警告做出反应。这意味着您首先要努力完全减少内存警告(这里有一些提示),当它们确实发生时,您需要确保两件事:
- 您的应用程序可能很快就会终止 - 请务必保存应用程序的状态。
- 您释放任何您绝对确定此时不需要的内存。
关于#2:如果您正在编程接近边缘,您可能希望回退到某种“内存安全”模式,在该模式下完全调低应用程序的内存使用量,例如通过显示更少的精灵、粒子、结合使用两个纹理,以额外的加载时间为代价移除某些纹理等。
如果您无法通过第 2 步释放足够的内存,那么第 1 步几乎不可避免地会发生,无论您是否清除 cocos2d 的缓存。清除 CCTextureCache 的“未使用”纹理会有所帮助,但由于精灵帧保留了纹理,因此如果您使用纹理图集而不首先释放相应的精灵帧,它通常不会做太多(或什么都不做)。记在脑子里。
因此,处理内存警告的过程是:
- 知道哪些资产正在使用,哪些只是被缓存以减少加载时间。
- 移除“当前不需要”的精灵帧,然后调用 CCTextureCache 的 removeUnusedTextures。这最有可能释放您的应用程序正在使用的大部分内存,而不再需要它。
- 删除您可能在代码中分配但当前未使用的任何其他无关内存 - 或退回到“内存安全”模式(无论您如何实现)。
- 希望最好的。
不要无条件清除 cocos2d 的缓存!这没有帮助,它可能只会让事情变得更糟。
考虑到所有的 cocos2d 缓存,CCTextureCache 将保留 99% 的内存。因此,无论如何清除任何其他缓存几乎都是毫无意义的,只需忽略它们即可。
您实际上只需要查看您当前正在使用的纹理图集,以及您不删除精灵帧及其纹理的那些。
如果您开始使用 .pvr.ccz 纹理,您甚至可以完全忽略“缓存以减少加载时间”,并在您停止使用每个纹理图集时从内存中删除它 - 因为 .pvr.ccz 加载速度如此之快,几乎没有就切换场景而言,有任何区别。这也有助于首先避免内存警告。