~~~~我的生活,我的点点滴滴!

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

一、SpriteBatchNode

1、先说下渲染批次:这是游戏引擎中一个比較重要的优化指标,指的是一次渲染凋用。也就是说。渲染的次数越少,游戏的执行效率越高。怎么看这个次数了?GL calls的值,以下会讲到。

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);
}

看效果图

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvQUNfaHVhbmc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

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

这是一个提速。在3.x版本号里面已经自己主动实现了批渲染处理了。所以非常多时候SpriteBatchNode用不上了

在来看看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(14)------SpriteBatchNode与SpriteFrameCache加快渲染的更多相关文章

  1. cocos2dx-3.0(13)------SpriteBatchNode与SpriteFrameCache渲染速度

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

  2. 14、Cocos2dx 3.0三,找一个小游戏开发Scene and Layer:游戏梦想

    发人员的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/30474393 Scene :场景 了解了Director ...

  3. (14)如何使用Cocos2d-x 3.0制作基于tilemap的游戏:第二部分

    引言 程序截图: 这篇教程是<如何使用Cocos2d-x 3.0制作基于tilemap的游戏>的第二部分.在上一个教程中,我们创建了一个简单的基于tiled地图的游戏,里面有一个忍者在沙漠 ...

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

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

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

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

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

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

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

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

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

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

  9. 如何让格斗游戏的横版过关(2) Cocos2d-x 2.0.4

    在第一章<如何使横版格戏>基础上.添加角色运动.碰撞.敌人.AI和音乐音效,原文<How To Make A Side-Scrolling Beat 'Em Up Game Like ...

随机推荐

  1. 高性能Ajax

    XMLHttpRequest javascript 高性能的Ajax应该考虑数据传输技术和数据格式,以及其他的如数据缓存等优化技术.   一.请求数据 请求数据的常用技术有XHR,动态脚本注入.Mul ...

  2. 万能日志数据收集器 Fluentd - 每天5分钟玩转 Docker 容器技术(91)

    前面的 ELK 中我们是用 Filebeat 收集 Docker 容器的日志,利用的是 Docker 默认的 logging driver json-file,本节我们将使用 fluentd 来收集容 ...

  3. Android开发之漫漫长途 Ⅰ——Android系统的创世之初以及Activity的生命周期

    该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列.该系列引用了<Android开发艺术探索>中的相关知识,再次表示该书 ...

  4. 微软Connect(); 2017大会梳理:Azure、数据、AI开发工具

    在今天召开的 Connect(); 2017 开发者大会上,微软宣布了 Azure.数据.AI 开发工具的内容.这是第一天的 Connect(); 2017 的主题演讲. 在开场视频中霍金又来了.你记 ...

  5. 为什么选择使用Sass而不是Less?

    这篇文章主要解答以下几个问题,供前端开发者的新手参考. 1.什么是Sass和Less? 2.为什么要使用CSS预处理器? 3.Sass和Less的比较 4.为什么选择使用Sass而不是Less? 什么 ...

  6. 表字符集latin1,client如何查看中文字符

    表结构如下: . row *************************** Table: my_data_7e Create Table: CREATE TABLE `my_data_7e` ( ...

  7. javascript 的继承

    我们的JavaScript比较特别了,主要通过原型链实现继承的. 下面介绍各种实现继承的方式:原型链继承,借用构造函数,组合继承,原型式继承,寄生式继承,寄生组合式继承. 二.实现继承方式 1.原型链 ...

  8. csv格式订单下载,完成后伴随邮件通知下载

    前言 功能开发中会遇到大量订单下载,而服务器的请求响应时间又配置的很短,导致下载时候请求超时. 这篇文章主要思路:异步查询数据,生成csv文件,放入email中并发送给用户.(异步部分本文不做介绍,配 ...

  9. tpshop使用自带极光推送

    推送逻辑在common里面的PushLogic.php;在后台网站->商城设置->推送设置,将极光的ID,密码填一下系统会自动加入数据库里面. 在你所需推送的PHP类里面引用这个文件即可. ...

  10. lua API函数大全

    Lua5.1中的API函数 lua_State* luaL_newstate()Lua脚本的编译执行是相互独立的,在不同的线程上执行.通过luaL_newstate()函数可以申请一个虚拟机,返回指针 ...