spriteFrameCache和textureCache

来源:互联网 发布:移动网络测速器在线测网速 编辑:程序博客网 时间:2024/06/05 09:17

1.TextureCache


引用自:http://blog.csdn.net/zxf13598202302/article/details/49688333
首先是最底层也最有效的纹理缓存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();
}


值得注意的是清理的顺序,应该先清理动画缓存,然后清理精灵帧,最后是纹理。按照引用层级由高到低,以保证保释引用有效
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 银行卡换了旧卡怎么办 大理市民卡丢了怎么办 市民卡内的钱怎么办 宝付支付乱扣款怎么办 苏宁任性贷逾期怎么办 第二次跟家里开口要钱还网贷怎么办 网贷到家来要钱怎么办 网贷贷不了啦急要钱怎么办 百度推广竞价关键词太长怎么办 药店位置差客流少怎么办 网站上的用词违规怎么办 苹果16g内存不够怎么办 手机16g内存不够怎么办 在私企年纪大了怎么办 谷歌浏览器显示不安全打不开怎么办 4s密码多次错误怎么办 苹果4s手机系统错误怎么办 汽车充电口坏了怎么办 如果手机充不了电怎么办 淘宝买的家电坏了怎么办 衣服皱了没有熨斗怎么办 油烟机油盒坏了怎么办 实体店不给换货怎么办 台式电脑鼠标不动了怎么办 电脑开机一直长鸣报警怎么办 国外电话卡网速太慢怎么办 滴滴提现忘记登录密码怎么办 微信提现支付密码忘记了怎么办 小米手机前置摄像头打不开怎么办 mp4视频屏幕好小怎么办 投了简历没回应怎么办 借壳上市原股票怎么办 红米note3指纹解锁失灵怎么办 来分期刷脸失败怎么办 买到假货商家不承认怎么办 买到假货翻新货工商局怎么办 三星note8笔丢了怎么办 夜跑结束后该怎么办 lol客户端正在运行中怎么办 瑞和宝终端锁定怎么办 骊爽摩托车动力弱怎么办?