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

        一、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. mysql导出和导入数据库

    出口 在dos计划,切换到mysql按照该文件夹bin下一个.输入以下命令 mysqldump -u root -p nxu_life > nxu_life2.sql 运行完毕后,就能够看到在b ...

  2. 日志收集之kafka

    日志收集之kafka http://www.jianshu.com/p/f78b773ddde5 一.介绍 Kafka是一种分布式的,基于发布/订阅的消息系统.主要设计目标如下: 以时间复杂度为O(1 ...

  3. 上下文菜单与TrackPopupMenu

    这算是一个演示程序吧,想不到上下文菜单也是採用ON_COMMAND宏来进行消息映射,在这里,我发现一个问题:从CWnd派生的类ON_UPDATE_COMMAND_UI_RANGE似乎没有效果,不知道应 ...

  4. [置顶] C++学习书单

    关于C++的书太多了,很容易让人没有头绪.一直想整理下,把这些书列个书单出来,直到今天才动手.希望我的经验能给后来的初学者一点帮助. 1.<C++程序设计教程> 钱能 很多学校把这本书选做 ...

  5. 使用RouteDebugger对MVC路由进行调试

    在Asp.Net MVC程序中,路由是MVC程序的入口,每一个Http请求都要经过路由计算,然后匹配到相应的Controller和Action.通常我们的路由都会注册在Global.asax.cs文件 ...

  6. HGE基础教程

    作者:寰子 来源:http://www.hgechina.com/前言: 写道: 无意中发现了hge中文社区,听朋友介绍,认识了hge,然后开始对它进行研究,并使用hge开始制作游戏. 因为我所得的资 ...

  7. 蚁群算法 matlab程序(已执行)

    下面是解放军信息project大学一个老师编的matlab程序,请尊重原作者劳动,引用时请注明出处. 我经过改动添加了凝视,已经执行过,无误, function [R_best,L_best,L_av ...

  8. jQuery插件实战之fullcalendar(日历插件)Demo

    jQuery的插件许多,应用的场景也很丰富,今天我这里给大家介绍一款很有用的日历页面开发插件 - fullcalendar,眼下最新版本号是1.5.1,使用这款插件可以高速帮助你高速编程实现基于web ...

  9. text bss data的区别

    BSS段 在采用段式内存管理的架构中,BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域.BSS是英文Block Started by Symbol的简称.BSS ...

  10. Django - Django框架 简单介绍

    Django框架 简单介绍 本文地址: http://blog.csdn.net/caroline_wendy/article/details/29172271 1. 介绍 Django是一个开放源码 ...