cocos2dx-3.0(33) 中的缓存TextureCache、SPriteFrameCache、AnimationCache
2016-03-27 15:17
288 查看
cocos2d-x中存在3个缓存类,都是全局单例模式。
首先是最底层也最有效的纹理缓存TextureCache,这里缓存的是加载到内存中的纹理资源,也就是图片资源。
其原理是对加入缓存的纹理资源进行一次引用,使其引用计数加一,保持不被清除,
其cocos2d-x的渲染机制是可以重复使用同一份纹理在不同的场合进行绘制,从而到达重复使用,降低内存和CPU运算资源的开销的目的。
常用的是如下所示的3个接口:
static TextureCache* getInstance(); //返回纹理缓存的全局单例
Texture2D* addImage(const char* fileimage); //添加一张纹理图片到缓存中
void removeUnusedTextures(); //清除不使用的纹理
在这3个接口中,TextureCache屏蔽了加载纹理的许多细节;addImage函数会返回一个纹理Texture2D的引用,可能是新加载到内存的,
也可能是之前已经存在的;而removeUnusedTextures则会释放当前所有引用计数为1的纹理,即目前没有被使用的纹理。
实际上,我们很少需要调用addImage这个接口,因为引擎内部所有的纹理加载都是通过这个缓存进行的,换句话说,
载入的每一张图片都被缓存了,所以我们更需要关心什么时候清理缓存。引擎会在设备出现内存警告时自动清理缓存,
但是这显然在很多情况下已经为时已晚了。一般情况下,我们应该在切换场景时清理缓存中的无用纹理,因为不同场景间使用的纹理不同的。
如果确实存在着共享的纹理,将其加入一个标记数组来保持其引用计数,以避免被清理。
第二个则是精灵框帧缓存。顾名思义,这种缓存的精灵框帧SpriteFrame,它主要服务于多张碎图合并出来的纹理图片。
这种纹理在一张大图中包含了多张小图,直接通过CCTextureCache引用会有诸多不便,因而衍生出来精灵框帧的处理方式,
即把截取好的纹理信息保存在一个精灵框帧内,精灵通过切换不同的帧来显示不同的图案。
SpriteFrameCache的常用接口和TextureCache类似,不在赘述了,唯一需要注意的是添加精灵帧的配套文件——一个plist文件和一张大的纹理图。
下面列举了SpriteFrameCache常用的方法:
static SPriteFrameCache* getInstance(); //全局共享的缓存单例
void addSpriteFrameWithFile(const char *pszPlist); //通过plist配置文件添加一组精灵帧
void removeUnusedSpriteFrames(); //清理无用缓存
最后一个是AnimationCache动画的缓存。通常情况下,对于一个精灵动画,每次创建时都需要加载精灵帧,按顺寻添加到数组,在创建对应动作类,
这是一个非常烦琐的计算过程。对于使用频率高的动画,比如鱼的游动,将其加入缓存可以有效降低每次创建的巨大消耗。
由于这个类的目的和缓存内容都非常简单直接,所以其接口也是最简单了的,如下所示:
static AnimationCache* getInstance(); //全局共享的单例
void addAnimation(CCAnimation *animation, const char *name); //添加一个动画到缓存
void removeAnimationByName(const char *name); //移除一个指定的动画
Animation* animationByName(const char *name); //获得事先存入的动画
唯一不一样的是,这次动画缓存需要我们手动维护全部动画信息。也因为加载帧动画完全是代码操作的,目前还没有配置文件指导,
所以不能像另外两个缓存那样透明化。实际上,如果考虑到两个场景间使用的动画基本不会重复,可以直接清理整个动画缓存。
所以,在场景切换时我们应该加入如下的清理缓存操作:
void releaseCaches()
{
AnimationCache::destroyInstance();
SpriteFrameCache::getInstance()->removeUnusedSpriteFrames();
TextureCache::getInstance()->removeUnuserdTextures();
}
值得注意的是清理的顺序,应该先清理动画缓存,然后清理精灵帧,最后是纹理。按照引用层级由高到低,以保证保释引用有效
1.TextureCache
首先是最底层也最有效的纹理缓存TextureCache,这里缓存的是加载到内存中的纹理资源,也就是图片资源。其原理是对加入缓存的纹理资源进行一次引用,使其引用计数加一,保持不被清除,
其cocos2d-x的渲染机制是可以重复使用同一份纹理在不同的场合进行绘制,从而到达重复使用,降低内存和CPU运算资源的开销的目的。
常用的是如下所示的3个接口:
static TextureCache* getInstance(); //返回纹理缓存的全局单例
Texture2D* addImage(const char* fileimage); //添加一张纹理图片到缓存中
void removeUnusedTextures(); //清除不使用的纹理
在这3个接口中,TextureCache屏蔽了加载纹理的许多细节;addImage函数会返回一个纹理Texture2D的引用,可能是新加载到内存的,
也可能是之前已经存在的;而removeUnusedTextures则会释放当前所有引用计数为1的纹理,即目前没有被使用的纹理。
实际上,我们很少需要调用addImage这个接口,因为引擎内部所有的纹理加载都是通过这个缓存进行的,换句话说,
载入的每一张图片都被缓存了,所以我们更需要关心什么时候清理缓存。引擎会在设备出现内存警告时自动清理缓存,
但是这显然在很多情况下已经为时已晚了。一般情况下,我们应该在切换场景时清理缓存中的无用纹理,因为不同场景间使用的纹理不同的。
如果确实存在着共享的纹理,将其加入一个标记数组来保持其引用计数,以避免被清理。
2.SPriteFrameCache
第二个则是精灵框帧缓存。顾名思义,这种缓存的精灵框帧SpriteFrame,它主要服务于多张碎图合并出来的纹理图片。这种纹理在一张大图中包含了多张小图,直接通过CCTextureCache引用会有诸多不便,因而衍生出来精灵框帧的处理方式,
即把截取好的纹理信息保存在一个精灵框帧内,精灵通过切换不同的帧来显示不同的图案。
SpriteFrameCache的常用接口和TextureCache类似,不在赘述了,唯一需要注意的是添加精灵帧的配套文件——一个plist文件和一张大的纹理图。
下面列举了SpriteFrameCache常用的方法:
static SPriteFrameCache* getInstance(); //全局共享的缓存单例
void addSpriteFrameWithFile(const char *pszPlist); //通过plist配置文件添加一组精灵帧
void removeUnusedSpriteFrames(); //清理无用缓存
3.AnimationCache
最后一个是AnimationCache动画的缓存。通常情况下,对于一个精灵动画,每次创建时都需要加载精灵帧,按顺寻添加到数组,在创建对应动作类,这是一个非常烦琐的计算过程。对于使用频率高的动画,比如鱼的游动,将其加入缓存可以有效降低每次创建的巨大消耗。
由于这个类的目的和缓存内容都非常简单直接,所以其接口也是最简单了的,如下所示:
static AnimationCache* getInstance(); //全局共享的单例
void addAnimation(CCAnimation *animation, const char *name); //添加一个动画到缓存
void removeAnimationByName(const char *name); //移除一个指定的动画
Animation* animationByName(const char *name); //获得事先存入的动画
唯一不一样的是,这次动画缓存需要我们手动维护全部动画信息。也因为加载帧动画完全是代码操作的,目前还没有配置文件指导,
所以不能像另外两个缓存那样透明化。实际上,如果考虑到两个场景间使用的动画基本不会重复,可以直接清理整个动画缓存。
所以,在场景切换时我们应该加入如下的清理缓存操作:
void releaseCaches()
{
AnimationCache::destroyInstance();
SpriteFrameCache::getInstance()->removeUnusedSpriteFrames();
TextureCache::getInstance()->removeUnuserdTextures();
}
值得注意的是清理的顺序,应该先清理动画缓存,然后清理精灵帧,最后是纹理。按照引用层级由高到低,以保证保释引用有效
相关文章推荐
- 网狐6603 cocos2dx 棋牌、捕鱼、休闲类游戏《李逵捕鱼》手机端完整源码分析及分享
- 菜鸟学习Cocos2d-x 3.x——浅谈动作Action
- cocos2dx三种定时器的使用以及停止schedule,scheduleUpdate,scheduleOnce
- cocos2d 3.x一些常用的数据类型
- cocos渲染过程
- Cocos音效
- Cocos场景切换和屏幕截取
- CocosGUI---Menu
- CocosGUI---Label
- Cocos设计分辨率(glView)
- Cocos容器——Vector
- cocos内存管理
- cocos碰撞检测
- Cocos定时器
- Cocos单点触摸
- Cocos坐标体系
- Cocos精灵
- Cocos 安装和配置和初探(创建自己的Scene
- 【cocos2dx 3.10】android studio真机调试的配置
- Cocos2d-x3.9 在Windows平台下编译打包成APK