• Cocos2d-x缓存机制(一)


    Cocos2d-x引擎提供3个缓存类,都是全局单例模式。
     
    CCTextureCache
    首先是最底层也是最有效的纹理缓存CCTextureCache,这里缓存的是加载到内存中的纹理资源,也就是图片资源。其原理是对加入缓存的纹理资源进行一次引用,使其引用计数加1,保持不被清除,而Cocos2d-x的渲染机制是可以重复使用同一份纹理在不同场合中进行渲染,从而达到重复使用,降低内存和GPU运算资源的开销的目的。常用以下三个接口:
    1     static CCTextureCache* sharedTextureCache();    //返回纹理缓存的全局单例
    2     CCTexture2D* addImage(const char* fileimage);     //添加一张纹理图片到缓存中
    3     void removeUnusedTextures();    //清除不使用的纹理
    在这3个接口中,CCTextureCache屏蔽了加载纹理的许多细节;addImage函数会返回一个纹理CCTextrue2D的引用,可能是新加载到内存的,也可能是之前已经存在的;而removeUnusedTextures则会释放当前所有引用计数为1的纹理,即目前没有被使用的纹理。
     
    CCSpriteFrameCache
    第二个则是精灵帧框缓存。它主要服务于多张碎图合并出来的纹理图片。这种纹理在一张大图中包含了多张小图,直接通过CCTextureCache引用会有诸多不便,因而衍生出来精灵帧框的处理方式,即把截取好的纹理信息保存在一个精灵帧框内,精灵通过切换不同的框帧来显示不同的图案。
     
    CCAnimationCache
    最后一个是动画缓存。通常情况下,对于一个精灵动画,每次创建时都需要加载精灵帧,按顺序添加到数组,再创建对应动作类,这是一个非常繁琐的计算过程。对于使用频率较高的动画,将其加入缓存可以有效降低每次创建的巨大消耗。常用接口如下:
    1     static CCAnimationCache* sharedAnimationCache(void);    //全局共享的缓存单例
    2     void addAnimation(CCAnimation* animation, const char* name);    //添加一个动画到缓存
    3     void removeAnimationByName(const char* name);    //移除一个指定的动画
    4     CCAnimation* animationByName(const char* name);    //获得事先存入的动画
    动画缓存和上面两个缓存不同的是,动画缓存需要手动维护全部动画信息。如果考虑到两个场景间使用的动画基本不会重复,可以直接清理整个动画缓存。如下操作所示:
    复制代码
    1     void releaseCaches()
    2     {
    3     CCAnimationCache::purgeSharedAnimationCache();
    4     CCSpriteFrameCache::sharedSpriteFrameCache()->removeUnusedSpriteFrame();
    5     CCTextureCache::sharedTextureCache()->removeUnusedTextures();
    6     //清理顺序,应该先清理动画缓存,然后清理精灵帧,最后清理纹理。按照引用层级由高到低,以保证释放引用有效
    7     }
    复制代码
  • 相关阅读:
    Protocol Buffer技术详解(语言规范)
    google protobuf 简单实例
    advStringGrid单元格文字垂直居中
    java中两个字符串如何比较大小
    List集合去除重复对象及equals()、hashCode()方法的作用
    Delphi中使用ActiveX的一些心得
    java List去重方式及效率对比
    Visual Studio Code 调整字体大小
    用最简单的例子实现jQuery图片即时上传
    Linux下绝对经典的命令
  • 原文地址:https://www.cnblogs.com/aibox222/p/9044548.html
Copyright © 2020-2023  润新知