在介绍了三级缓存,首先,我们必须弄清楚的一个问题:什么是纹理?它的通俗的解释,质感是它的含义的图片。

当图像加载到内存中后,,它是存在于纹理的形式。由于从这里可以看出。纹理事实上就是一块内存。这块内存中存放的是依照指定的像素格式填充的图片像素信息。


以下进入正题:

1、TextureCache

TextureCache纹理缓存是最底层也是最有效的纹理缓存。它究竟有什么用呢?我先描写叙述一个现象吧:如果游戏中有个界面用到的图片许多,,第一次点进这界面时速度很慢(由于要载入绘制许多图片)。可第二次点击却一下子就进去了。这是为什么呢?原来Cocos2dx的渲染机制是能够反复使用同一份纹理在不同的场合进行绘制,从而达到反复使用。减少内存和GPU运算资源的消耗与开销

举个样例:创建一个精灵

auto sp = Sprite::create("image.png");//精灵图片是image.png

第一次使用image.png这图片有两个步骤,一个是先将图片载入进TextureCache缓存中,下一步是绘制图片,从而将其显示在场景中

第二次使用image.png时,由于之前image.png已经被放入TextureCache中,所以这里仅仅需从缓存中找到这张图片,然后将其绘制出来就能够

以下用几行代码做个总结:

//第一种载入精灵的方法
auto sp1 = Sprite::create("boy.png");
this->addChild(sp1,1);

//另外一种载入精灵的方法
auto sp_cache = Director::getInstance()->addImage("boy.png");
auto sp1 = Sprite::createWithTexture(sp_cache);
this->addChild(sp1,1);


有人可能回觉得另外一种方法效率比較高,事实上不然。俩种都一样

它们都是经过了载入图片到TextureCache缓存中,然后从缓存中提取该纹理并绘制出来这两个步骤。

可是另外一种方法使用起来会更灵活,就像我上面说到的,如果一个界面用到的资源许多。能够先将这些图片资源读取到TextureCache中。等真正进入到这个界面再使用这些图片速度就会很快。经常使用到的地方就是游戏的资源载入界面,能够參考这篇博客:​​javascript:void(0)​


2、SpriteFrameCache

顾名思义。这里的缓存就是SpriteFrame的缓存。

跟TextureCache功能一样。只是跟TextureCache不同的是。如果内存池中不存在要查找的图片。它会提示找不到,而不会去本地载入图片。

SpriteFrameCache一般用来处理plist文件(这个文件指定了每一个独立的精灵在这张“大图”里面的位置和大小),该文件相应一张包括多个精灵的大图,plist文件能够使用TexturePacker制作。
auto frameCache = SpriteFrameCache::getInstance();
frameCache->addSpriteFramesWithFile("boy.plist","boy.png");//boy.png里集合了boy1.png,boy2.png这些小图
auto frame_sp = Sprite::createWithSpriteFrameName("boy1.png");//从SpriteFrameCache缓存中找到boy1.png这张图片.
this->addChild(frame_sp,2);



3、AnimationCache

这个应该是最简单的吧,是动画的缓存。

对于精灵动画,每次创建时都须要载入精灵帧。然后按顺序加入到数组,再用Animation读取数组创建动画。这是一个很烦琐的计算过程

而对于使用频率高的动画,比如角色的走动、跳舞等,能够将其加入到AnimationCache中,每次使用都从这个缓存中调用,这样能够有效的减少创建动画的巨大消耗。

示比例如以下:如果有两组动画dance_animate,sleep_animate.

//将其载入到缓存中
AnimationCache::getInstance()->addAnimation(dance_animate,"dance");//第二个參数是动画存入缓存时相应的key
AnimationCache::getInstance()->addAnimation(sleep_animate,"sleep");

//读取缓存中的动画
auto dance_animate = AnimationCache::getInstance()->animationByName("dance");//依据key从缓存中提取动画
auto sleep_animate = AnimationCache::getInstance()->animationByName("sleep");


好了,就这样。


​​

版权声明:本文博主原创文章,博客,未经同意不得转载。