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

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

一、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也变小了,这也是一种不错的方法

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

时间: 2024-09-29 23:55:14

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

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

最近在看COCOS2DX 3.0的Auto-batching合批与Auto Culling动态缩减功能下面就来仔细看看吧:整合好的渲染提速干货: 简介 在游戏的绘制渲染中,往往消耗很多资源和内存,当绘制精灵数量越多,游戏的卡顿会很明显,为了优化和提升渲染效率.Cocos2d-x为我们提供了Auto-batching和SpriteBatchNode. Auto-batching 意思是Renderer将多次draw的调用打包成一次big Draw 调用.(又名批处理). SpriteBatchNo

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

使用Cocos2d-x 3.0开发游戏之后,发现游戏在android手机上发热非常严重,在魅族2上,几乎担心手机会爆炸了~~~采取的一个措施就是降低帧率,因为游戏对于帧率要求不是非常高. 做过cocos2d开发的同学应该都知道在win32平台修改帧率的方式非常简单,就是在AppDelegate.cpp文件中修改: 1 director->setAnimationInterval(1.0 / 40); 但是这种修改方式在导出android安卓apk到真机测试的时候,发现左下角的调试信息还是现实60

cocos2d-x 3.0 常用对象的创建方式

cocos2d-x 3.0 中所有对象几乎都可以用create函数来创建,其他的创建方式也是有create函数衍生. 下面来介绍下create函数创建一般对象的方法,省得开发中经常忘记啥的. 1.精灵Sprite的4种创建方式 (1)根据图片资源路径来创建 ? 1 2 3 4 //根据图片路径来创建 auto sprite1 = Sprite::create(filepath); //根据图片路径来创建,并设置要显示的图片大小 auto sprite2 = Sprite::create(file

Cocos2d-x 3.0多线程异步资源加载

Cocos2d-x从2.x版本到上周刚刚才发布的Cocos2d-x 3.0 Final版,其引擎驱动核心依旧是一个单线程的"死循环",一旦某一帧遇到了"大活儿",比如Size很大的纹理资源加载或网络IO或大量计算,画面将 不可避免出现卡顿以及响应迟缓的现象.从古老的Win32 GUI编程那时起,Guru们就告诉我们:别阻塞主线程(UI线程),让Worker线程去做那些"大活儿"吧. 手机游戏,即便是休闲类的小游戏,往往也涉及大量纹理资源.音视频资

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

cocos2d-x 3.0 中全部对象差点儿都能够用create函数来创建,其它的创建方式也是有create函数衍生. 以下来介绍下create函数创建一般对象的方法,省得开发中常常忘记啥的. 1.精灵Sprite的4种创建方式 (1)依据图片资源路径来创建 //依据图片路径来创建 auto sprite1 = Sprite::create(filepath); //依据图片路径来创建,并设置要显示的图片大小 auto sprite2 = Sprite::create(filepath,Rect

Cocos2d-x 3.0 纹理

1.纹理控制. Sprite *pSprite = Sprite::create("background.png"); TexParams params = {GL_NEAREST,GL_NEAREST,GL_CLAMP_TO_EDGE, GL_CLAMP_TO_EDGE}; pSprite->getTexture()->setTexParameters(params); 上面最重要的函数就是setTexParameters();他就是根据ccTexParameters来控

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

Cocos2d-x从2.x版本号到上周刚刚才公布的Cocos2d-x 3.0 Final版,其引擎驱动核心依然是一个单线程的"死循环".一旦某一帧遇到了"大活儿",比方Size非常大的纹理资源载入或网络IO或大量计算,画面将 不可避免出现卡顿以及响应迟缓的现象.从古老的Win32 GUI编程那时起,Guru们就告诉我们:别堵塞主线程(UI线程),让Worker线程去做那些"大活儿"吧. 手机游戏,即便是休闲类的小游戏,往往也涉及大量纹理资源.音视

cocos2d-x 3.0 绘图节点——Node

***************************************转载请注明出处:http://blog.csdn.net/lttree******************************************** 昨天写了个场景切换,折腾到半夜..好困的说... *************************** 照旧,先来个目录: 1.前言 2.从代码观节点 3.实际应用Node类 *************************** 1.前言 老样子,先来点干货

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

在这一步,我们主要是把主角加入到游戏场景中来,并且让它跑动,这里的跑动,实际上也就是执行一组动画,让其看起来像是在跑动,而且相对屏幕的位置也不会改变 我们会定义一个主角类:Runner,而这一步就要用到 帧动画 的创建和使用等知识点. 对于Runner,我的设计思路如下: 1.主角有一个动作集合,包括跑动,跳起来,以及蹲下.那么就有不同的帧动画,那么这里借鉴到 晓风残月前辈的方法,将帧动画打包命名,之后根据动作名来执行动作 2.主角需要绑定刚体,并且在不同的动作下的刚体大小不同 3.我们给主角设