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

        一、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. Linux shell中的I/O重定向相关(转)

    1. 基本概念(这是理解后面的知识的前提,请务必理解)  a. I/O重定向通常与 FD有关,shell的FD通常为10个,即 0-9: b. 常用FD有3个,为0(stdin,标准输入).1(std ...

  2. 不知道的JavaScript

    你不知道的JavaScript上卷笔记 前言 You don't know JavaScript是github上一个系列文章  初看到这一标题的时候,感觉怎么老外也搞标题党,用这种冲突性比较强的题目吸 ...

  3. SecureCRT 连接虚拟机Linux

    SecureCRT 连接虚拟机Linux   最近在学习linux,在学习中遇到了一些问题,现总结一下. 虚拟机我用的是VirtualBox,完美支持中文,可以在电脑中创建虚拟机环境,上手非常简单.具 ...

  4. Struts2 后台action接收 jsp页面中checkbox中的值

    如前端页面jsp中的标签为: <form action="myurl"> <input type="checkbox" name=" ...

  5. php 双向队列类

    (deque,全名double-ended queue)是一种具有队列和栈的性质的数据结构.双向队列中的元素能够从两端弹出,其限定插入和删除操作在表的两端进行. 在实际使用中,还能够有输出受限的双向队 ...

  6. poj 2586 Y2K Accounting Bug(贪心算法,水题一枚)

    #include <iostream> using namespace std; /*248K 32MS*/ int main() { int s,d; while(cin>> ...

  7. 【Java 它 JVM】对象的创建过程

    虚拟机会new 指令: 1.检查指令的参数可在对类的符号引用的恒定饮食定位,并检查是否已装上代表这个类的符号引用.分析和初始化.假设没有.您必须运行相应的类加载过程. 2.类加载通过审查,虚拟机将分配 ...

  8. JavaScript中的对象(一)

    Email:longsu2010 at yeah dot net 最近我和朋友谈起JavaScript中对象的问题.朋友以写JavaScript为生,而且生活的很好,然而我发现他并不真正懂这们语言的某 ...

  9. HDU 2829 Lawrence(动态规划-四边形不等式)

    Lawrence Problem Description T. E. Lawrence was a controversial figure during World War I. He was a ...

  10. 共享库方案解决WAS中JAR包冲突

    实现步骤: 1.        准备共享库JAR包 commons-httpclient-3.1.jar httpclient-4.3.3.jar httpcore-4.3.2.jar httpmim ...