帧动画-手动切换帧-批次渲染处理动画-纹理图片的本质

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

精灵无处不在,是大家用到的最多的类,也是整个游戏引擎的精髓所在。精灵的使用一般来说非常简单,只有在结合其他功能的实现的时候才可能复杂一点。

我们简单的把基本的使用方式了解清楚,创建一个精灵通常有两种方式:

①使用CCSprite的create系列函数

        ②使用精灵帧缓存CCSpriteFrameCache技术--加载并分解纹理图集(包括“整合过的大图PNG”和“plist文件”两部分)生成大量精灵帧,再拿出单个精灵帧生成精灵。

第一种很简单,不做介绍,主要研究一下精灵帧缓存技术。首先,搞清楚CCTextureCache(纹理缓存)、CCSpriteBatchNode(精灵集合:批次渲染技术)、CCSpriteFrameCache(精灵帧缓存)三者在使用上联系:

1)CCTextureCache(纹理缓存):就是加载图片到内存中,以备使用

    2)CCSpriteBatchNode(精灵集合):批量渲染,将指定的图片一次性就渲染绘制出好多该图片,之后直接取即可,不必再渲染

    3)CCSpriteFrameCache(精灵帧缓存):将整合过的大图根据plist文件的信息,提取出“每一张小图”制作成--精灵帧--缓存起来

CCSpriteBatchNode

每当cocos2dx在屏幕上绘制一个纹理(一张图片)时,图形硬件都需要做前后三个动作:准备渲染、渲染图形和渲染后的清除。
例如使用CCSprite创建1000个Icon.png到场景中,这样渲染批次就是1000(暂且不考虑其他的精灵),

[cpp] view
plain
copy

 
  1. for(int i = 0;i < 1000;++i)
  2. {
  3. CCSprite* testIcon = CCSprite::create("Icon.png");//每次都需要去调用OpenGL引擎open-draw-close,渲染1000次
  4. }

使用CCSpriteBatchNode批量渲染,一次渲染就把所有的CCSprite绘制出来,只调用一次OpenGL引擎,就绘制出1000张

[cpp] view
plain
copy

 
  1. CCSpriteBatchNode* batchNode = CCSpriteBatchNode::create("Icon.png", 1000);//一次性完成,CCSpriteBatchNode内部封装了一个CCTextureAtlas(纹理图集,它内部封装了一个CCTexture2D)和一个CCArray(用来存储CCSpriteBatchNode的子节点:单个精灵)
  2. addChild(batchNode);

从上面的使用来看,它只是针对一张图片调用一次OpenGl引擎完成大量的绘制,使用这张批次渲染过的图片时就不在渲染了,它会直接拿出一张用做贴图。因此它比较适合于多次使用该图的地方,比如子弹。
还有一种情况也很适合,那就是纹理图集-结合-帧缓存的使用。

CCSpriteFrameCache

纹理图集是集合多张小图为一张大图,我们姑且假定大图集合了1000张不同的小图,实际上帧缓存只是做了分解,将大图中所有小图提出来封装到精灵帧中,再把精灵帧加入到帧缓存池中,而并未做渲染,也就是说如果多次用到某一张小图去绘制精灵,那么每次都需要根据包含该小图的帧去渲染绘制一个精灵,当同一张图的使用次数较多时,就需要用到CCSpriteBatchNode。

[cpp] view
plain
copy

 
  1. CCSpriteFrameCache* cache = CCSpriteFrameCache::sharedSpriteFrameCache();
  2. cache->addSpriteFramesWithFile("family.plist", "family.png");//使用plist文件分解png大图生成精灵帧缓存起来
[cpp] view
plain
copy

 
  1. //使用精灵帧层创建精灵
  2. CCSprite* sp =  CCSprite::createWithSpriteFrame("frameName");//帧的名字是小图在集成到大图上的时候的名字

内部常用函数参考
注:CCSpriteFrameCache管理CCSpriteFrame的内存池,它跟CCTextureCache功能一样,不过和CCTextureCache不同的是,如果内存中不存在要查找的帧,它会提示找不到,而不会去本地加载图片。

cocos2d-x 详解之 CCSprite(精灵)- “CCSpriteBatchNode”和“CCSpriteFrameCache”的更多相关文章

  1. Cocos2D研究院之CCNode详解(三)

    http://www.xuanyusong.com/archives/950 上一章我们了解了cocos2d的项目路径以及工作原理,这次作者要真刀真枪地讲解代码了,咱们先来看看cocos2d最常用.也 ...

  2. Cocos2d-x 3.X手游开发实例详解

    Cocos2d-x 3.X手游开发实例详解(最新最简Cocos2d-x手机游戏开发学习方法,以热门游戏2048.卡牌为例,完整再现手游的开发过程,实例丰富,代码完备,Cocos2d-x作者之一林顺和泰 ...

  3. cocos2d-x 详解之 CCAction(动作)

    关于动作部分,总的来说使用起来比较简单,创建一个动作,然后让可渲染节点如精灵去执行这个动作即可.cocos2dx提供了很多类型的动作,使用起来也很方便.本节重点介绍动作CCAction的子类之一时间动 ...

  4. iOS开发——UI篇OC篇&SpriteKit详解

    SpriteKit详解 SpriteKit,iOS/Mac游戏制作的新纪元 这是我的WWDC2013系列笔记中的一篇,完整的笔记列表请参看这篇总览.本文仅作为个人记录使用,也欢迎在许可协议范围内转载或 ...

  5. Learning Cocos2d-x for WP8(5)——详解Menu菜单

    原文:Learning Cocos2d-x for WP8(5)--详解Menu菜单 C#(wp7)兄弟篇Learning Cocos2d-x for XNA(5)——详解Menu菜单 菜单是游戏必不 ...

  6. ps切图抠图详解-web前端(转)

    网页设计在技术层面上,第一步是美工做出网页效果图,第二步就是网页前端进行网页切图.网页切图工具常用的有fireworks.PS,这里使用PS进行网页切图. 我们通过设计稿,得到我们想要的产出物(如.p ...

  7. Cocos2d-x win7 + vs2010 配置图文详解

    Cocos2d-x win7 + vs2010 配置图文详解 下载最新版的cocos2d-x.打开浏览器,输入cocos2d-x.org,然后选择Download,本教程写作时最新版本为cocos2d ...

  8. Xen虚拟化基本原理详解

    标签:虚拟化 xen 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://wangzan18.blog.51cto.com/80210 ...

  9. cocos2dx常见的46中+22中动作详解

    cocos2dx常见的46中+22中动作详解 分类: iOS2013-10-16 00:44 1429人阅读 评论(0) 收藏 举报 bool HelloWorld::init(){    ///// ...

随机推荐

  1. Photoshop:热气球的制作方法

    大致流程: 1.做等宽色块,加内发光 2.变形->膨化,弯曲20% 3.加高光和投影层,增加立体感 4.制作多列,合并后,滤镜->扭曲->球面化100%2次(注意放在在正方形画布中间 ...

  2. JavaScript中样式,方法 函数的应用

    JavaScript中一个字母都不能错,编写的时候他不报错,也不提示,只有在执行的时候才会提示错误位置 . 一.样式 .waring {background-color:yellow } .highl ...

  3. get Status canceled 请求被取消

    1.chrome浏览器下状况: 2.环境: 一个页面A下 包含一个 iframe ,在子页面中用js点击A页面下的链接替换iframe内容脚本如下: window.parent.document.ge ...

  4. selvert的过滤器filter处理中文乱码

    注意问题:在学习用selvert的过滤器filter处理中文乱码时,在filter配置初始化时用了utf-8处理中文乱码,而在提交的jsp页面中却用了gbk.虽然两种都可以出来中文乱码,但是却造成了处 ...

  5. 结构体struct和typedef后面接指针的含义

    typedef struct file { ... }FileInfo, *FileP; 上述程序中定义了一个结构体,结构体的名字为file,并且给其指针 取个别名为FileP,所以后续程序中出现Fi ...

  6. bzoj4044

    这题简直了………… 首先根据操作可知,我们肯定是先造出某个偶数长度的回文串,然后添加若干字符得到设回文串长为len[x] 则ans=min(n-len[x]+f[x]); 那么问题就是制造这个串的回文 ...

  7. 11月下旬poj其他题

    poj1000,poj1003,poj1004,poj1064,poj1218 水题 poj1012:0<k<14——漂亮的打表 poj1651:与能量项链很像的dp poj1159:回文 ...

  8. 文件大小转换成可显示的Mb,Gb和kb方法

    public static String unitConversion(float resource) { String[] unit = new String[] { "B", ...

  9. UVa 1349 (二分图最小权完美匹配) Optimal Bus Route Design

    题意: 给出一个有向带权图,找到若干个圈,使得每个点恰好属于一个圈.而且这些圈所有边的权值之和最小. 分析: 每个点恰好属于一个有向圈 就等价于 每个点都有唯一后继. 所以把每个点i拆成两个点,Xi  ...

  10. UVa 1635 (唯一分解定理) Irrelevant Elements

    经过紫书的分析,已经将问题转化为求组合数C(n-1, 0)~C(n-1, n-1)中能够被m整除的个数,并输出编号(这n个数的编号从1开始) 首先将m分解质因数,然后记录下每个质因子对应的指数. 由组 ...