cocos2d-x 纹理缓存
发布时间:2020-12-14 21:06:43  所属栏目:百科  来源:网络整理 
            导读:1, Texture2D:纹理,纹理图片,纹理其实就是一块内存,这块内存中存放的是按照指定的像素格式填充的图片像素信息 //加载纹理到缓存 Director::getInstance()-getTextureCache()-addImageAsync(“../xxx1.png”); Director::getInstance()-getTextureCache()
                
                
                
            | 
   1, 
 Texture2D:纹理,纹理图片,纹理其实就是一块内存,这块内存中存放的是按照指定的像素格式填充的图片像素信息 
   //加载纹理到缓存 
  
   Director::getInstance()->getTextureCache()->addImageAsync(“../xxx1.png”); 
  
   Director::getInstance()->getTextureCache()->addImageAsync(“../xxx2.png”); 
  
   //读取 
  
   auto sp=Sprite:: 
  createWithTexture(“xxx.png”); 
  
   2,精灵缓存 
  
   SpriteFrameCache::getInstance()->addSpriteFramesWithFile(“xxx.plist”,”xxx.png”); 
  
   auto sp=Sprite::createWithFrameByName(“xxx.png”); 
  
   与第一种不同的是,SpriteFrameCache一般用于加载plist,当内存池中找不到资源时会报空,第一种会继续在本地路径中查找。 
  
   3,动画缓存 
  
   AnimationCache::getInstance()->addAnimation(vector_list,”name”); 
  
   auto ani1=AnimationCache::getInstance()->animationByName(“name”); 
  
   Sprite *sp->runAction(an1); 
  
   4,精灵更换贴图(纹理) 
  
   auto sp=Sprite::create(“xxx.png”); 
  
   sp->setSpriteFrame(SpriteFram *frame); 
  
   ———原文 
   
  在介绍三个缓存时,我们要先理清一个问题: 
  什么是纹理? 
  通俗的解释呢,纹理就是图片的意思啦。当一张图片被加载到内存后,它是以纹理的形式存在的。从这里可以看出, 
  纹理其实就是一块内存!这块内存中存放的是按照指定的像素格式填充的图片像素信息。 
    
   下面进入正题: 
    
   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中,等真正进入到这个界面再使用这些图片速度就会非常快。常用到的地方就是游戏的资源加载界面,可以参考这篇博客:http://blog.csdn.net/start530/article/details/19420317 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");
 
   好了,就这样。 
   (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! | 
