在cocos2d中使用精灵帧缓存 - 正确的方法

6 objective-c cocos2d-iphone

我正在使用精灵帧缓存来上传plists和精灵表,用于动画.我有2个方法,我相信其中一个是错的.

  1. 我必须加载我可以在开始时缓存的所有东西,因为它需要时间,所以在场景的开始我加载所有我需要的近期.(但现在我的缓存已满!)

  2. 缓存应该保持尽可能空,所以我在开始动画时加载到缓存(这需要一些时间不是吗?我认为它会轻弹我的游戏),并在我完成的同一时刻删除它用它 .(现在缓存不满,但我必须多次加载/重新加载.)

  3. 必须照顾到每一个时间删除从缓存中未使用的精灵?

加载到缓存是:

[[CCSpriteFrameCache sharedSpriteFrameCache] removeSpriteFrameByName:@"stopAnim.plist"];
Run Code Online (Sandbox Code Playgroud)

删除未使用的是:

[[CCSpriteFrameCache sharedSpriteFrameCache] removeUnusedSpriteFrames];
Run Code Online (Sandbox Code Playgroud)

我可以在iPad上看到系统正在尝试删除未使用的精灵并出现问题.究竟是什么工作方式?

小智 3

经过大量研究,我得出了一些结论:

首先,将帧实时(动画开始时)加载到 中确实需要时间batchNode,并且在大图像 (iPad) 的情况下,有时会冻结场景。

因此,在某些情况下,您必须在 init 方法中加载图像以进行缓存以避免这种情况,因为您没有其他方法,这就是为什么我们无论如何都有缓存:

[[CCTextureCache sharedTextureCache] addImage:@"the_heavy_image.png"];
Run Code Online (Sandbox Code Playgroud)

如果此动画频繁发生,您不想将其从缓存中清除。

如果您不使用其他内容,则应从缓存中清除它

[[CCTextureCache sharedTextureCache] removeUnusedTextures];
Run Code Online (Sandbox Code Playgroud)

只会从缓存中清除已从屏幕上删除的精灵。

仅仅清除帧是不够的:

[[CCSpriteFrameCache sharedSpriteFrameCache] removeUnusedSpriteFrames];
Run Code Online (Sandbox Code Playgroud)

在其他情况下,精灵表图像不是那么大,您可以将它们加载到batchNode动画开始的那一刻,并在结束时删除它们。