cocos2d-x中存在3个缓存类,都是全局单例模式。
1.CCTextureCache
首先是最底层也最有效的纹理缓存CCTextureCache,这里缓存的是加载到内存中的纹理资源,也就是图片资源。其原理是对加入缓存的纹理资源进行一次引用,使其引用计数加一,保持不被清除,其cocos2d-x的渲染机制是可以重复使用同一份纹理在不同的场合进行绘制,从而到达重复使用,降低内存和CPU运算资源的开销的目的。常用的是如下所示的3个接口:
static CCTextureCache* sharedTextureCache();  //返回纹理缓存的全局单例
CCTexture2D* addImage(const char* fileimage);  //添加一张纹理图片到缓存中
void removeUnusedTextures();  //清除不使用的纹理
在这3个接口中,CCTextureCache屏蔽了加载纹理的许多细节;addImage函数会返回一个纹理CCTexture2D的引用,可能是新加载到内存的,也可能是之前已经存在的;而removeUnusedTextures则会释放当前所有引用计数为1的纹理,即目前没有被使用的纹理。
实际上,我们很少需要调用addImage这个接口,因为引擎内部所有的纹理加载都是通过这个缓存进行的,换句话说,载入的每一张图片都被缓存了,所以我们更需要关心什么时候清理缓存。引擎会在设备出现内存警告时自动清理缓存,但是这显然在很多情况下已经为时已晚了。一般情况下,我们应该在切换场景时清理缓存中的无用纹理,因为不同场景间使用的纹理不同的。如果确实存在着共享的纹理,将其加入一个标记数组来保持其引用计数,以避免被清理。
2.CCSPriteFrameCache
第二个则是精灵框帧缓存。顾名思义,这种缓存的精灵框帧CCSpriteFrame,它主要服务于多张碎图合并出来的纹理图片。这种纹理在一张大图中包含了多张小图,直接通过CCTextureCache引用会有诸多不便,因而衍生出来精灵框帧的处理方式,即把截取好的纹理信息保存在一个精灵框帧内,精灵通过切换不同的帧来显示不同的图案。
CCSpriteFrameCache的常用接口和CCTextureCache类似,不在赘述了,唯一需要注意的是添加精灵帧的配套文件——一个plist文件和一张大的纹理图。下面列举了CCSpriteFrameCache常用的方法:
static CCSPriteFrameCache* sharedSpriteFrameCache(); //全局共享的缓存单例
void addSpriteFrameWithFile(const char *pszPlist); //通过plist配置文件添加一组精灵帧
void removeUnusedSpriteFrames(); //清理无用缓存
3.CCAnimationCache
最后一个是CCAnimationCache动画的缓存。通常情况下,对于一个精灵动画,每次创建时都需要加载精灵帧,按顺寻添加到数组,在创建对应动作类,这是一个非常烦琐的计算过程。对于使用频率高的动画,比如鱼的游动,将其加入缓存可以有效降低每次创建的巨大消耗。由于这个类的目的和缓存内容都非常简单直接,所以其接口也是最简单了的,如下所示:
static CCAnimationCache* sharedAniationCache(); //全局共享的单例
void addAnimation(CCAnimation *animation, const char *name); //添加一个动画到缓存
void removeAnimationByName(const char *name); //移除一个指定的动画
CCAnimation* animationByName(const char *name); //获得事先存入的动画
唯一不一样的是,这次动画缓存需要我们手动维护全部动画信息。也因为加载帧动画完全是代码操作的,目前还没有配置文件指导,所以不能像另外两个缓存那样透明化。实际上,如果考虑到两个场景间使用的动画基本不会重复,可以直接清理整个动画缓存。
所以,在场景切换时我们应该加入如下的清理缓存操作:
void releaseCaches()
{
CCAnimationCache::purgeSharedAnimationCache();
CCSpriteFrameCache::sharedSpriteFrameCache()->removeUnusedSpriteFrames();
CCTextureCache::sharedTextureCache()->removeUnuserdTextures();
}
值得注意的是清理的顺序,应该先清理动画缓存,然后清理精灵帧,最后是纹理。按照引用层级由高到低,以保证保释引用有效。

场景切换时清理缓存!!CCTextureCache、CCSpriteFrameCache、CCAnimationCache相关推荐

  1. U3D 场景切换时 脚本对象,GO对象,资源对象的问题

    U3D 场景切换时 脚本对象,GO对象,资源对象的问题 脚本对象:在LUA中写了一个actor类,它封装了角色逻辑,引用了一个GO. GO对象:通过 GameObject.Instantiate(资源 ...

  2. Unity使用设置界面Slider控制音量,场景切换时音量滑条都不改变

    目录 创建设置界面 设置滑条控制音乐 场景切换保证音量不变 关键点就是使用Playerprefs保存和读取音量数据 创建设置界面 上图为Hierarchy视图中的内容,本案例会使用到setting按钮 ...

  3. google浏览器测试时清理缓存、强制不用缓存刷新快捷键(常用、效率)

    Ctrl+Shift+Del  清除Google浏览器缓存的快捷键  Ctrl+Shift+R  重新加载当前网页而不使用缓存内容

  4. 动态加载子节点_微信小游戏开发之场景切换和常驻节点传递数据

    主题 场景切换 场景间数据传递方式 小游戏全局背景音效 特别说明 CocosCreator微信小游戏开发系列文章,是我在逐步开发过程中,基于官方文档之上,记录一些重点内容,以及对官方文档中有些知识点的 ...

  5. cocos2dx基础篇(26)——场景切换CCTransitionScene

    [唠叨] 游戏中两个场景的切换时经常要被用到的,cocos2dx引擎为我们提供了许多场景切换的动画,我感觉有些和PPT的切换很类似,所以感觉很熟悉.如:淡入淡出.翻页.跳入跳出等等. 本节要讲的场景切 ...

  6. Unity中的场景切换

    Unity中的场景切换 与电影类似,一个游戏往往需要多个场景.而如果场景中资源较少,那么可以很快的完成切换,如果较多的话,可能需要十几秒时间.在这段时间内播放加载动画等等,可以减少玩家的不耐烦. 同步 ...

  7. cocos creator切换场景闪退_#Cocos Creator# 为什么音乐音效在场景切换的时候自动停止了?...

    问题背景 一般来说,每个场景都会有自己的背景音乐,所以,之前我一直没有注意到有什么问题. 直到有一天,我想让游戏从头到尾一直循环播放同一首背景音乐,结果,咦,背景音乐怎么自动停了? 原因 暂时还没有找 ...

  8. Unity游戏开发:场景切换的实现

    在unity中可以将不同场景的背景和道具放置在不同的Scene当中,通过对Scene的加载和卸载来实现场景之间的切换.同时创建一个基础场景(Control Scene)来对整个游戏系统进行管理,在基础 ...

  9. Unity实现 场景切换 音乐不断

    转自彪哥,我稍微略加改动下..把我自己实现过程中容易犯错的点稍微点下.红字需注意 http://blog.csdn.net/xiebiao360/article/details/14093463 原文 ...

最新文章

  1. nyoj 47 江 河问题 【贪婪】
  2. 纪念我曾经的 JAVA 姿势--转
  3. 『ACM--数据结构--字典树』信息竞赛进阶指南--Tire树
  4. 用css画出一个圆圈,里面有个叉号(不能用英文字母x)
  5. linux teaming状态命令,Linux 网卡Teaming
  6. oracle脏块,检查点队列上的最早脏的数据块再次被修改以何种顺序刷到磁盘
  7. 我的网站之一(搭建网站架构)
  8. 基于ZStack构建物联网平台
  9. 2020 快手 被吊打面经
  10. 计算机网络习题(参考)
  11. VMware16安装win7 x64 虚拟机
  12. 数据分析(入门篇)-第三章-Show出你的数据-Part2(水晶易表)
  13. 扫描技术的原理与应用(Nmap使用)
  14. 新手如何推广优化自己的网站
  15. Y05 - 999、Python - 风变编程
  16. 什么是JDBC(一)-使用JDBC-详解JDBC系列
  17. Python脚本——信手拈来的自动化测试工具
  18. lisp 标注螺纹孔_螺纹的规定画法及规定标注
  19. 清除浮动影响的几种方法
  20. 简单的一个在线聊天室

热门文章

  1. python爬虫面试自我介绍范文_走过路过不容错过,Python爬虫面试总结
  2. ddos攻击数据集_ddos攻击和cc攻击有什么区别?他们2个哪个更厉害?
  3. member pm.php,Dedecms 会员中心注入漏洞5
  4. SpringBoot中扩展SpringMVC
  5. 【github】git 使用命令大全
  6. 医学图像分析相关的会议
  7. Android 轮播图从 0 到 1
  8. CentOS安装mariadb做为mysql的替代品
  9. 如何用轻量协作工具做bug管理
  10. C - Catch That Cow