在每个场景的开头调用以下"清除"方法是否是一种好的做法?如果没有,我应该什么时候给他们打电话?有没有教程解释什么时候使用每个电话?我是不是错过了什么?
[CCTextureCache purgeSharedTextureCache];
[CCSpriteFrameCache purgeSharedSpriteFrameCache];
[CCAnimationCache purgeSharedAnimationCache];
[CCShaderCache purgeSharedShaderCache];
[[CCFileUtils sharedFileUtils] purgeCachedEntries];
(我使用的是Cocos2d 2.0,并且启用了ARC,我认为这并不重要,但仍然认为值得一提)
IMO清除cocos2d的缓存是一种糟糕的做法在修理电子设备时,清除缓存就像锤子一样有用。
清除所有内容,却让角色在下一帧中重新加载他们清除的动画和纹理,这是一种新奇的做法,因为他们非常需要它们!如果您无条件地清除缓存,则表示您没有完成资产内存管理工作(很好)。
仍然可以使用清除所有内容,但应该很少(比如在UIKit应用程序中完全关闭cocos2d),因为你为什么要删除所有缓存的资源?你删除了你添加的内容,如果这还不够,你已经尽了最大努力。
作为一名应用程序开发人员,您应该了解应用程序的总内存使用情况,以及哪些资产正在使用,哪些资产没有使用。包括cocos2d处理的资源。只释放那些你知道目前没有使用的资产,在不久的将来也不需要这些资产。这真的很简单,但它比简单地清除缓存要多得多——这似乎能完成任务,但实际上是一件可怕的事情
在内存警告期间清除缓存的一个问题是,当前预加载资产时可能会出现内存警告。现在,当你在加载资产时清除缓存时,你是在自食其果,因为已经预加载的资产将被删除,然后需要在需要时再次加载。在最坏的情况下,如果由于加载资产所需的额外内存而立即重新加载,这实际上可能会导致不可恢复的内存警告(即纹理在短时间内加载时使用2倍内存!)。
在大多数情况下,清除缓存只会延迟与内存警告相关的终止,同时增加游戏的滞后性。在剩下的情况下,这只会造成糟糕的体验,因为游戏会断断续续地恢复,可能会持续更长的时间。
Cocos2D在内存警告期间清除缓存只是作为最后的措施,主要针对那些不关心内存使用等无稽之谈的开发人员。这是一个适用于最初几个应用程序开发步骤的解决方案,甚至可能适用于开发人员的第一个应用程序,但对于任何严肃/雄心勃勃的努力来说,它实际上都毫无用处。
作为一个雄心勃勃、注重质量的应用程序开发人员,你应该以更优雅的方式对内存警告做出反应。这意味着你首先要努力最大限度地减少内存警告(这里有一些提示),当它们确实发生时,你需要确保两件事:
- 您的应用程序可能很快就会终止-请确保保存应用程序的状态
- 你释放了任何你绝对确定此时不需要的内存
关于#2:如果你在接近边缘的地方编程,你可能想回到某种"内存安全"模式,在这种模式下,你可以完全降低应用程序的内存使用率,例如,通过显示更少的精灵、粒子、组合使用两种纹理、以牺牲额外加载时间为代价删除某些纹理等。
如果第2步不能释放足够的内存,那么无论是否清除cocos2d的缓存,第1步都将不可避免地发生。清除CCTextureCache中"未使用"的纹理可能会有所帮助,但由于精灵帧会保留纹理,因此如果使用纹理图谱而不首先释放相应的精灵帧,通常不会有太大作用(或什么都没有)。记住这一点。
因此,处理内存警告的过程是:
- 知道哪些资产正在使用,哪些只是缓存以减少加载时间
- 移除"当前不需要"的精灵帧,然后调用CCTextureCache的removeUnusedTextures。这有最大的机会释放你的应用程序正在使用的大部分内存,而不再真正需要它
- 删除您可能在代码中分配但当前未使用的任何其他无关内存,或者返回到"内存安全"模式(无论您如何实现)
- 抱着最好的希望
不要无条件清除cocos2d的缓存这于事无补,可能只会让事情变得更糟。
考虑到所有的cocos2d缓存,CCTextureCache将保留99%的内存。因此,清除任何其他缓存都是毫无意义的,只需忽略它们即可。
你真的只需要看看你目前使用的是哪一个纹理图谱,而那些没有的,你就可以移除精灵框架及其纹理。
如果你一开始就使用.pvr.ccz纹理,你甚至可以完全忽略"缓存以减少加载时间",并在停止使用时从内存中删除每个纹理图谱——因为.pvr.cgz加载速度太快,就切换场景而言几乎没有任何区别。这也有助于从一开始就避免内存警告。