大家都知道一个游戏里面会有大量的图片,每一个图片渲染是须要时间的,以下分析两个类来加快渲染速度,加快游戏执行速度 

        一、SpriteBatchNode 

        1、先说下渲染批次:这是游戏引擎中一个比較重要的优化指标,指的是一次渲染凋用。

也就是说,渲染的次数越少,游戏的执行效率越高。

2、SpriteBatchNode就是cocos2d-x为了减少渲染批次而建立的一个专门管理精灵的类。

有人会问。怎么高速知道究竟渲染了多少次了。告诉你吧,游戏左下角有三行数据: 

        GL verts 表示给显卡绘制的顶点数 

        GL calls 表示代表每一帧中OpenGL指令的调用次数 

        FPS 这个是帧率不多说 

        主要看第二个“GL calls”代表每一帧中OpenGL指令的调用次数,这个数字越小,程序的绘制性能就越好。

我们有没有法子让他小点了,答案当然是yes 

        首先我们使用sprite创建100个精灵,看看这个值是多少 

        code: 

        

        for(int i = 0; i < 100; ++ i)

        {

         char name[15];

         memset(name, 0, sizeof(name));

         sprintf(name, "%d.png", i % 10);

         auto sp = Sprite::create(name);

         sp->setPosition(Point(i*5,i*5));

         node->addChild(sp);

        }

        this->addChild(node);

         

        这个循环创建了100个精灵,显示出来,看效果 

         

         看左下角红色圈圈,有101次绘制,当中100个元素每一个元素绘制一次,多出来的一次是绘制这个左下角信息自己。 

        在来看看使用SpriteBatchNode 

        code: 

         

        auto spBatchNode = SpriteBatchNode::create("0.png");

         spBatchNode->setPosition(Point::ZERO);

         this->addChild(spBatchNode);

         for(int i = 0; i < 100; ++ i)

         {

         count++;

         //float x = CCRANDOM_0_1() * visibleSize.width;

         //float y = CCRANDOM_0_1() * visibleSize.height;

         //log("x=%lf, y=%lf",x, y);

         char name[15];

         memset(name, 0, sizeof(name));

         sprintf(name, "%d.png", i % 10);

         auto sp = Sprite::createWithTexture(spBatchNode->getTexture());

         sp->setPosition(Point(i*5,i*5));

         spBatchNode->addChild(sp);

         }看效果图 

         

         看到没,立刻减到2了。这快了太多了。

这是一个提速,在来看看SpriteFrameCache 

        二、SpriteFrameCache 

         首先我们使用合图软件,将这10张图合成一张大图和一个plist文件。

在使用CocoStudio导出时。选择“使用大图”就可以将小图合成一张大图。当然我们也能够选择TexturePacker这样的专业的合图软件,合成的图片分为“test.png”和“test.plist”两部分,然后使用SpriteFrameCache。  

        code: 

         

        SpriteFrameCache::getInstance()->addSpriteFramesWithFile("test.plist","test.png"); 

        Node* node = Node::create(); 

        char name[32]; 

        for(int i = 0;i<100;++i) 

        { 

        char name[15];

        memset(name, 0, sizeof(name));

        //auto sprite = Sprite::create(name); 

        auto sprite = Sprite::createWithSpriteFrameName(name); 

        sprite->setPosition(Point(i*5,i*5)); 

        node->addChild(sprite, 0); 

        } 

        this->addChild(node);

        这段代码中,我们调用addSpriteFramesWithFile函数,将大图加载到内存中,创建对象时,调用createWithSpriteFrameName从缓存纹理中加载图片。

如此做我们全部的绘制调用都能够合并到一次OpenGL指令中,这些绘制指令的计算与合并都由Cocos2d-x引擎完毕。编译执行例如以下图所看到的:

         

         

          

        我们能够很明显的看到。优化后的程序“GL calls”依旧变成了2次。

另一种优化,就是当精灵超出屏幕后就剔除掉,这样也能降低OpenGL指令。

三、绘制剔除 

         相对于上一种优化,这个要更easy理解。

它是指当一个元素移动到屏幕之外,就不进行绘制。  

        code: 

         

        Node* node = Node::create();

        

        for(int i  = 0;i<100;++i)

        {

         char name[15];

         memset(name, 0, sizeof(name));

         sprintf(name, "%d.png",i%10);

         auto sprite = Sprite::create(name);

         //auto sprite = Sprite::createWithSpriteFrameName(name);

         sprite->setPosition(Point(i*5,i*5));

         node->addChild(sprite, 0);

        }

        this->addChild(node);

        

        auto listener = EventListenerTouchOneByOne::create();

        listener->onTouchBegan = [=](Touch *pTouch, Event *pEvent)

        {

         return true;

        };

        listener->onTouchMoved = [=](Touch *pTouch, Event *pEvent)

        {

         node->setPosition(node->getPosition()+pTouch->getDelta());

        };

        Director::getInstance()->getEventDispatcher()->

         addEventListenerWithSceneGraphPriority(listener, this);

        

        return true;}

        

        效果图例如以下: 

         

          

        我们发现GL calls也变小了,这也是一种不错的方法 

          

        四、总结 大体。这两个优化,可以说,该方案的性能有了很大的提高。同时在发展过程,也使程序猿没有太多纠缠在渲染效率优化。

cocos2dx-3.0(13)------SpriteBatchNode与SpriteFrameCache渲染速度的更多相关文章

  1. cocos2dx-3.0(14)------SpriteBatchNode与SpriteFrameCache加快渲染

    ----我的生活,我的点点滴滴! ! 大家都知道一个游戏里面会有大量的图片.每一个图片渲染是须要时间的,以下分析两个类来加快渲染速度.加快游戏执行速度 一.SpriteBatchNode 1.先说下渲 ...

  2. cocos2dx 3.0 研究(4)渲染分析

    http://blog.csdn.net/epeaktop/article/details/26730909中已经说明了程序的设计,让我们来看看在cocos2dx 3.0中代码是怎样实现的. void ...

  3. COCOS2DX 3.0 优化提升渲染速度 Auto-batching

    COCOS2DX 3.0 优化提升渲染速度 Auto-batching 近期在看COCOS2DX 3.0的Auto-batching合批与Auto Culling动态缩减功能以下就来细致看看吧:整合好 ...

  4. opengl之vsh、fsh简易介绍+cocos2dx 3.0 shader 变灰

    认识着色器 理解OpenGL渲染管线,对于学习OpenGL非常重要.下面是OpenGL渲染管线的示意图:(图中淡蓝色区域是可以编程的阶段) 此图是从wiki中拿过来的,OpenGL的渲染管线主要包括: ...

  5. cocos2d-x 3.0游戏实例学习笔记 《跑酷》 第三步---主角开跑&amp;同一时候带着刚体

    说明:这里是借鉴:晓风残月前辈的博客.他是将泰然网的跑酷教程.用cocos2d-x 2.X 版本号重写的,眼下我正在学习cocos2d-X3.0 于是就用cocos2d-X 3.0重写,并做相关笔记 ...

  6. cocos2d-x 3.0 经常使用对象的创建方式

    cocos2d-x 3.0 中全部对象差点儿都能够用create函数来创建,其它的创建方式也是有create函数衍生. 以下来介绍下create函数创建一般对象的方法,省得开发中常常忘记啥的. 1.精 ...

  7. Cocos2d-x 3.0多线程异步资源载入

    Cocos2d-x从2.x版本号到上周刚刚才公布的Cocos2d-x 3.0 Final版,其引擎驱动核心依然是一个单线程的"死循环".一旦某一帧遇到了"大活儿" ...

  8. Cocos2d-x 3.0 Json用法 Cocos2d-x xml解析

    Cocos2d-x 3.0 加入了rapidjson库用于json解析.位于external/json下. rapidjson 项目地址:http://code.google.com/p/rapidj ...

  9. Cocos2d-x 3.0修改Android平台帧率fps - 解决游戏运行手机发热发烫问题

    使用Cocos2d-x 3.0开发游戏之后,发现游戏在android手机上发热非常严重,在魅族2上,几乎担心手机会爆炸了~~~采取的一个措施就是降低帧率,因为游戏对于帧率要求不是非常高. 做过coco ...

随机推荐

  1. tolua 有些功能可以用(经过测试)

    tolua 提供几个 C++ 与 Lua 进行数据交换的工具函数. ~~ tolua.type 返回一个 C++ 对象的类型描写叙述字符串. local node = display.newNode( ...

  2. document.write()相关

    原文地址:http://www.cnblogs.com/dh616854836/articles/2140349.html document.write()脚本向窗口(不管是本窗口或其他窗口)写完内容 ...

  3. c++中volatile详解

    1. 为什么用volatile? C/C++ 中的 volatile 关键字和 const 对应,用来修饰变量,通常用于建立语言级别的 memory barrier.这是 BS 在 "The ...

  4. 陈一舟《情系人人》:先搞钱,再搞人才_DoNews-IT门户-移动互联网新闻-电子商务新闻-游戏新闻-风险投资新闻-IT社交网络社区

    陈一舟<情系人人>:先搞钱,再搞人才_DoNews-IT门户-移动互联网新闻-电子商务新闻-游戏新闻-风险投资新闻-IT社交网络社区 陈一舟<情系人人>:先搞钱,再搞人才

  5. Hibernate实体对象继承策略

    Hibernate继承策略总共同拥有三种,一种是共用一张表:一种是每一个类一张表,表里面储存子类的信息和父类的信息:另一种是通过表连接的方式.每一个类都有一张表,可是子类相应的表仅仅保存自己的信息,父 ...

  6. Python 收集Twitter时间序列数据

    CODE: #!/usr/bin/python # -*- coding: utf-8 -*- ''' Created on 2014-7-18 @author: guaguastd @name: c ...

  7. Django写的投票系统4(转)

    原文地址:http://www.cnblogs.com/djangochina/archive/2013/06/04/3114269.html 现在已经可以在后台管理投票了,现在就差怎么在前台显示和如 ...

  8. Python数据结构-字典

    tel={,} tel[ print(tel) print(tel['tom']) del tel['tom'] print(tel) print(tel.keys()) 运行结果: {, , } { ...

  9. Win7+ubuntu kylin+CentOS 6.5三系统安装图文教程

    Win7+ubuntu kylin+CentOS 6.5三系统安装图文教程 引言:原本机子上已经装好了win7+Ubuntu Kylin 由win7引导,而不是Ubuntu的grub引导的双系统(安装 ...

  10. 解决:Could not find debuginfo pkg for dependency package glibc-2.12-1.132.el6_5.3.i686

    场景: (gdb) break main Breakpoint 1 at 0x8048417 (gdb) r Starting program: /usr/local/src/ccode/ch11/s ...