Cocos2d-x中的缓存

cocos2d-x中有三个缓存类,在v2.x都是全局单例模式。

  • 纹理缓存(TextureCache)。使用纹理缓存可以创建纹理对象。
  • 精灵帧缓存(SpriteFrameCache)。能够从纹理图集(精灵表)中创建精灵帧缓存,然后再从精灵帧缓存中获得精灵对象,反复使用精灵对象时候,使用精灵帧缓存可以节省内存消耗。(如果将把图读入到精灵帧缓存中,同时也会把它加入到了纹理缓存里)
  • 动画缓存(AnimationCache)。动画缓存主要是用于精灵动画,精灵动画中的每一帧是从动画缓存中获取的。

    纹理缓存

    在游戏中需要加载大量的纹理图片,这些操作都是很耗内存和资源的。
    当游戏中有个界面要用到的图片非常多,第一次点进这界面时速度非常慢(因为要加载绘制很多图片)出现卡顿。我们可以使用TextureCache提前异步加载纹理,等加载结束,进入到这个界面再使用这些图片速度就会非常快。
    Texture2D:纹理,即图片加载入内存后供CPU和GPU操作的贴图对象。
    TextureCache:纹理缓存,用于加载和管理纹理。一旦纹理加载完成,下次可以使用它返回之前加载的纹理,从而减少对GPU和CPU内存的占用。

  • 获取TextureCache
    在v3.x中,TextureCache不再作为单例模式使用。而是作为Director的成员变量。

Director::getInstance()->getTextureCache();
  • 获取纹理
    如果文件以前没有被加载,它会创建一个新的Texture2D对象,返回。
    addImage函数返回一个Texture2D的引用,可能是新加到内存的,也可能是以前已经存在的。
    Director::getInstance()->getTextureCache()->addImage(“icon.png”);
    两种方法获得缓存中的纹理。
Texture2D* texture=Director::getInstance()->getTexureCache()->addImage("icon.png");
Texture2D* texture=Direcot::getInstance()->getTexureCache()->getTextureForKey("icon.png");

通过getTextureForKey方法来获得这个key所对应的纹理缓存,如果这个Key对应的纹理不存在,那么就返回NULL。

  • 异步加载纹理
    TextureCache类还支持异步加载资源的功能,利用addImageAsync方法。异步加载图片,开辟一个新的线程专门用来加载图片,加载完毕后调用loadingCallBack函数。给addImageAsync方法添加一个回调方法,这样,当纹理异步加载结束的时候,可以得到通知。
    Director::getInstance()->getTextureCache()->addImageAsync(“icon.png”,this,callfuncO_selector(HelloWorld::loadingCallBack));
  • 清理缓存
    removeUnusedTextures则会释放当前所有的引用计数为1的纹理,即目前没有使用的纹理。比如新场景创建好后,使用此方法释放没有使用的纹理非常方便。
Director::getInstance()->getTextureCache()->removeUnusedTextures();

精灵帧缓存

感谢

http://www.tairan.com/archives/6378/

SpriteFrameCache主要服务于多张碎图合并出来的纹理图片。这种纹理在一张大图中包含了多张小图,直接通过TextureCache引用会有诸多不便,因而衍生出来精灵框帧的处理方式,即把截取好的纹理信息保存在一个精灵框帧内,精灵通过切换不同的框帧来显示不同的图案。

SpriteFrameCache的内部封装了一个Map_spriteFrames对象。key为帧的名称。SpriteFrameCache一般用来处理plist文件(这个文件指定了每个文件的精灵在这张”大图”里面的位置和大小),该文件对应一张包含多个精灵的大图,plist文件可以使用TexturePacker制作。
添加精灵帧的配置文件一个plist文件和一张大的纹理图。

SpriteFrameCache的相关方法:
  • 获取单例的SpriteFrameCache对象。(单例模式)
SpriteFrameCache* cache=SpriteFrameCache::getInstance();
  • 销毁SpriteFrameCache对象。
SpriteFrameCache::destroyInstance();
  • 指定具体的坐标文件添加精灵帧。(Sheet.png那张大的纹理图)
cache->addSpriteFramesWithFile("Sheet.plist");
cache->addSpriteFramesWithFile("Sheet.plist","Sheet.png"); 
  • 使用SpriteFrameCache获取指定的精灵帧缓存中的精灵帧名来创建精灵对象。
SpriteFrameCache::getInstance()->addSpriteFramesWithFile("Sheet.plist");
auto frame_sp=Sprite::createWithSpriteFrameName("Sheet1.png");
this->addChild(frame_sp,0);
  • 指定具体的精灵帧名移除精灵帧。
void removeSpriteFrameByName(const std::string &name);
  • 清空精灵缓存。
void removeSpriteFrames();
  • 指定具体的坐标文件移除精灵帧。
void removeSpriteFramesFromFile(const std::string &plist);
  • 移除没有使用的精灵帧。
void removeUnuesdSpriteFrames();
SpriteFrameCache与TextureCache

与TextureCache功能一样,将SpriteFrame缓存起来,在下次使用的时候直接去取。不过与TextuteCache不同的是,如果内存池中不存在要查找的图片,它会提示找不到,而不会去本地加载图片。

TextureCache是底层也是最有效的纹理缓存,缓存的是加载到内存中的纹理资源,也就是图片资源。
SpriteFrameCache精灵帧缓存,缓存的是精灵帧。
SpriteFrameCache是基于TextureCache上的封装。缓存的是精灵帧,是纹理指定区域的矩形块。各精灵帧都在同一纹理中,通过切换不同的框帧来显示出不同的图案。

动画缓存

Animation:就是动画,存储一个动画动作需要的所有帧。

Animate:动画动作,就是一个动作类,继承自AnctionInterval类,我们可以通过Animation来创建一个Animate,然后再执行这个动作。

AnimationCache: AnimationCache类是一个单例类,用于缓存所有的动画和动画帧。通常情况下,对于一个精灵动画,每次创建都需要加载精灵帧,按顺序添加到数组,再创建对应的动画类。

  • 获取单例的AnimationCache对象
AnimationCache* cache=AnimationCache::getInstance();
  • 释放这个单个实例
AnimationCache::destroyInstance();
  • 添加动画文件到动画缓存中,plist文件
cache->addAnimationsWithFile("animations/animations-2.plist");
  • 添加一个Animation对象到缓存中,并指定一个名字。(0.1那个参数必须设定,可以设定除默认值以外的任何值,如果不设定,就无法播放Animate动作)
void addAnimation(Animation* animation,const std::string &name);
auto animation=Animation::createWithSpriteFrames(spriteFrameVec,0.1);
AnimationCache::getInstance()->addAnimation(animation,"dogs");
  • 根据动画名字从动画缓存中得到一个Animation对象,如果缓存中没有对应名字的Animation对象,则返回NULL。
Animation* getAnimation(const std::string &name);
auto animate=Animate::create(AnimationCache::getInstance()->getAnimation("dogs"));
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值