zoukankan      html  css  js  c++  java
  • cocos2d-x 详解之 CCSprite(精灵)- “CCSpriteBatchNode”和“CCSpriteFrameCache”

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

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

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

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

            ①使用CCSprite的create系列函数

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

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

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

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

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

     

       CCSpriteBatchNode

       每当cocos2dx在屏幕上绘制一个纹理(一张图片)时,图形硬件都需要做前后三个动作:准备渲染、渲染图形和渲染后的清除
    例如使用CCSprite创建1000个Icon.png到场景中,这样渲染批次就是1000(暂且不考虑其他的精灵),
    [cpp] view plaincopy在CODE上查看代码片派生到我的代码片
     
    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 plaincopy在CODE上查看代码片派生到我的代码片
     
    1. CCSpriteBatchNode* batchNode = CCSpriteBatchNode::create("Icon.png", 1000);//一次性完成,CCSpriteBatchNode内部封装了一个CCTextureAtlas(纹理图集,它内部封装了一个CCTexture2D)和一个CCArray(用来存储CCSpriteBatchNode的子节点:单个精灵)  
    2. addChild(batchNode);  

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

       CCSpriteFrameCache

        纹理图集是集合多张小图为一张大图,我们姑且假定大图集合了1000张不同的小图,实际上帧缓存只是做了分解,将大图中所有小图提出来封装到精灵帧中,再把精灵帧加入到帧缓存池中,而并未做渲染,也就是说如果多次用到某一张小图去绘制精灵,那么每次都需要根据包含该小图的帧去渲染绘制一个精灵,当同一张图的使用次数较多时,就需要用到CCSpriteBatchNode。
    [cpp] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. CCSpriteFrameCache* cache = CCSpriteFrameCache::sharedSpriteFrameCache();  
    2.   
    3. cache->addSpriteFramesWithFile("family.plist""family.png");//使用plist文件分解png大图生成精灵帧缓存起来  

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

    内部常用函数参考
    注:CCSpriteFrameCache管理CCSpriteFrame的内存池,它跟CCTextureCache功能一样,不过和CCTextureCache不同的是,如果内存中不存在要查找的帧,它会提示找不到,而不会去本地加载图片。
  • 相关阅读:
    SAP MM 有了采购订单历史的PO行项目里的采购附加费不允许再改了?
    风之语.人在职场也需要'备胎'
    两万字,任正非采访全记录
    SAP 如何得到交货单上的序列号清单?
    【2019年版】如何向SAP公司提交Message?
    工作上996,生活上669,并不是什么难事儿!
    风之语.甲骨文裁员之我见
    天河2号-保持使用yhrun/srun时连接不中断 (screen 命令教程 )
    PXE 和 计算机网络启动
    Gmail 设置,时区
  • 原文地址:https://www.cnblogs.com/gl5773477/p/3971137.html
Copyright © 2011-2022 走看看