三种缓存类介绍

转载 2016年06月01日 22:54:19
  • 在介绍三个缓存时,我们要先理清一个问题:什么是纹理?通俗的解释呢,纹理就是图片的意思啦。当一张图片被加载到内存后,它是以纹理的形式存在的。从这里可以看出,纹理其实就是一块内存!这块内存中存放的是按照指定的像素格式填充的图片像素信息。

    下面进入正题:
    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

sp缓存list集合工具类

  • 2016年10月23日 00:18
  • 1.86MB
  • 下载

Cache的种类及详解

Cache及(HttpRuntime.Cache与HttpContext.Current.Cache) 我们在.NET运用中经常用到缓存(Cache)对象。 除了System.We...
  • xingxing1828
  • xingxing1828
  • 2014年07月25日 13:16
  • 2571

介绍缓存的基本概念和常用的缓存技术

摘要: 介绍缓存的基本概念和常用的缓存技术,给出了各种技术的实现机制的简单介绍和适用范围说明,以及设计缓存方案应该考虑的问题(共17页)1         概念1.1   缓存能解决的问题· 性能——...
  • li_yu_hai
  • li_yu_hai
  • 2008年10月04日 09:24
  • 30828

缓存分类介绍

缓存一词搞技术的都接触过,很多地方用到缓存。网站架构和网站开发中的缓存也是非常重要。这里先讲述最基本的两种缓存。高级和分布式的缓存在后面讲述。 (1) 架构方面的缓存,对Apache比较熟悉的...
  • zhibuguonicuo
  • zhibuguonicuo
  • 2016年01月04日 15:08
  • 830

C++版循环缓冲区类

[cpp] view plain copy  print? // 声明   class CCycleBuffer     {   public:    BOOL i...
  • kulala082
  • kulala082
  • 2017年04月07日 10:04
  • 504

最最最简单的C++缓存实现

最最最简单的C++缓存实现 在平常的后台开发中,通常中会用到缓存,一般会使用redis等内存数据库来实现,但是在很简单的程序中,其实没必要包含一些额外的依赖,通过C++的map即可实现。...
  • qq_21431111
  • qq_21431111
  • 2016年12月03日 14:18
  • 2620

缓存技术,封装好的缓存类

using System; using System.Collections.Generic; using System.Linq; using System.Web; using EnYuan.BS...
  • lybwwp
  • lybwwp
  • 2014年01月14日 08:59
  • 3109

缓存概念和缓存类型回顾

一级缓存概念:私有缓存 事务级别的缓存 线程级别的缓存 缓存缓存的类型对象缓存把对象的标示符作为key值,把对象本身作为value值数...
  • qq_16103331
  • qq_16103331
  • 2016年09月20日 11:21
  • 252

三种缓存类介绍

在介绍三个缓存时,我们要先理清一个问题:什么是纹理?通俗的解释呢,纹理就是图片的意思啦。当一张图片被加载到内存后,它是以纹理的形式存在的。从这里可以看出,纹理其实就是一块内存!这块内存中存放的是按照指...
  • ChenXiang_IT
  • ChenXiang_IT
  • 2016年06月01日 22:54
  • 1140

System.Web.Caching.Cache类 Asp.Net缓存 各种缓存依赖

Cache类,是一个用于缓存常用信息的类。HttpRuntime.Cache以及HttpContext.Current.Cache都是该类的实例。 一、属性 属性 说明 C...
  • u012770274
  • u012770274
  • 2015年08月28日 14:27
  • 2395
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:三种缓存类介绍
举报原因:
原因补充:

(最多只允许输入30个字)