zoukankan      html  css  js  c++  java
  • Cocos2dx 温馨提示(十)三种缓存类演示

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

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



    以下进入正题:
    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");

    好了,就这样。

    尊重原创。转载请注明来源:http://blog.csdn.net/star530/article/details/23612487

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

  • 相关阅读:
    268. Missing Number(LeetCode)
    Win7 发生验证错误 要求的函数不受支持
    下拉选择框的选项过滤
    金额小写带逗号处理
    Java将CST的时间字符串转换成需要的日期格式字符串
    MyEclipse部署项目报"Add Deployment". Invalid Subscription Level
    无法解析的DNS服务地址
    选择文件进行上传
    让button居中显示的的标签
    Mysql启动服务提示系统找不到指定的文件
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/4819934.html
Copyright © 2011-2022 走看看