COCOS2DX 3.0 优化提升渲染速度 Auto-batching
简单介绍
在游戏的绘制渲染中。往往消耗非常多资源和内存,当绘制精灵数量越多,游戏的卡顿会非常明显,为了优化和提升渲染效率。
Cocos2d-x为我们提供了Auto-batching和SpriteBatchNode。
Auto-batching 意思是Renderer将多次draw的调用打包成一次big Draw 调用。
(又名批处理)。
SpriteBatchNode 主要用于批量绘制精灵提高精灵的绘制效率的,须要绘制的精灵数量越多,效果越明显。
Auto-batching
在3.0版本号实现了引擎的逻辑代码与渲染代码的分离。实现了Auto Batch与Auto Culling功能。不再推荐使用SpriteBatchNode提高精灵的绘制效率。
Auto-culling的支持,Sprite在绘制时会进行检查。超出屏幕的不会发给渲染。
Auto-batching的渲染流程
如今。一个渲染流程是这种:
(1)drawScene開始绘制场景
(2)遍历场景的子节点。调用visit函数,递归遍历子节点的子节点,以及子节点的子节点的子节点,以及…
(3)对每个子节点调用draw函数
(4)初始化QuadCommand对象。这就是渲染命令。会丢到渲染队列里
(5)丢完QuadCommand就完事了,接着就交给渲染逻辑处理了。
(6)是时候轮到渲染逻辑干活干活,遍历渲染命令队列。这时候会有一个变量,用来保存渲染命令里的材质ID。遍历过程中就拿当前渲染命令的材质ID和上一个的材质ID对照。假设发现是一样的。那就不进行渲染。保存一下所需的信息,继续下一个遍历。好,假设这时候发现当前材质ID和上一个材质ID不一样,那就開始渲染,这就算是一个渲染批次了。
(7) 因此,假设我们创建了10个材质同样的对象,可是中间夹杂了一个不同材质的对象。假设它们的渲染命令在队列里的顺序是这种:2个A,3个A,1个B,1个A。2个A。2个A。那么前面5个同样材质的对象A会进行一次渲染,中间的一个不同材质对象B进行一次渲染。后面的5个同样材质的对象A又进行一次渲染。
一共会进行三次批渲染。
SpriteBatchNode
它是批处理绘制精灵,主要是用来提高精灵的绘制效率的,须要绘制的精灵数量越多,效果越明显。
由于cocos2d-x採用opengl es绘制图片的,opengl es绘制每个精灵都会运行:open-draw-close流程。
而SpriteBatchNode是把多个精灵放到一个纹理上。绘制的时候直接统一绘制该texture。不须要单独绘制子节点,这样opengl es绘制的时候变成了:open-draw()-draw()…-draw()-close(),节省了多次open-close的时间。SpriteBatchNode内部封装了一个TextureAtlas(纹理图集,它内部封装了一个Texture2D)和一个Array(用来存储SpriteBatchNode的子节点:单个精灵)。注意:由于绘制的时候仅仅open-close一次,所以SpriteBatchNode对象的全部子节点都必须和它是用同一个texture(同一张图片)。
在addChild的时候会检查子节点纹理的名称跟SpriteBatchNode的是不是一样,假设不一样就会出错。
// check Sprite is using the same texture id
CCASSERT(sprite->getTexture()->getName() == _textureAtlas->getTexture()->getName(), "CCSprite is not using the same texture id");
SpriteBatchNode和SpriteFrameCache结合使用代码演示样例
必须保证SpriteFrameCache和SpriteBatchNode载入的是同一纹理贴图。
SpriteBatchNode vs. Auto-batching
在3.0版本号中提供了新的渲染机制,实现引擎逻辑代码和渲染的分离。该版本号依旧支持SpriteBatchNode,和曾经的版本号保持一致。可是不再推荐使用SpriteBatchNode。
Auto-culling的支持,Sprite在绘制时会进行检查。超出屏幕的不会发给渲染。
使用Auto-batching
·需确保精灵对象拥有同样的TextureId(精灵表单spritesheet);
·确保他们都使用同样的材质和混合功能
·不再把精灵加入SpriteBatchNode上
·避免打乱QuadCommand队列
Auto-batching拥有更好的性能提升。
以下通过代码来分析几种符合Auto-batching使用的情况
1、使用同一图片生成精灵,加到场景中。
此种情况最简单。就是反复加入同一个精灵。
由于满足Auto-batching的条件。此时的渲染批次为2.(首先,即使我一个精灵也不创建,渲染批次也至少是1,加上刚刚这反复加入的精灵的渲染)
2、使用精灵帧表单,载入生成加入不同的精灵。
可是各个精灵的材质都是一样的,满足Auto-batching的条件。
此时的渲染批次为2.(首先。即使我一个精灵也不创建,渲染批次也至少是1,加上刚刚这反复加入的精灵的渲染)
在实际使用中推荐使用这种方式。
3、此种情况假设在不同的zOrder下加入不同的精灵。在遍历子节点之前,事实上还偷偷做了一件事情,那就是,调用sortAllChildren();函数对子节点进行排序。尽管反复加入不同材质生成的精灵。可是它们的zOrder不一样,依据zOrder,Auto-batching渲染命令被又一次排序。依据材质同样加入渲染队列从而减少了渲染次数。
假设凝视掉sprite2->setZOrder(1);你会发现渲染批次会升高。
COCOS2DX 3.0 优化提升渲染速度 Auto-batching的更多相关文章
- Java动态编译优化——提升编译速度(N倍)
一.前言 最近一直在研究Java8 的动态编译, 并且也被ZipFileIndex$Entry 内存泄漏所困扰,在无意中,看到一个第三方插件的动态编译.并且编译速度是原来的2-3倍.原本打算直接用这个 ...
- js优化提升访问速度
一.给JS文件减肥. 有的人为了给网站增加炫目效果,往往会使用一些JS效果代码,这在上个世纪似乎还很流行,对于现在来说,最好在用户体验确实需要的情况下,使用这些东西.至于希望给自己的JS文件减肥的童鞋 ...
- cocos2dx 3.0 研究(4)渲染分析
http://blog.csdn.net/epeaktop/article/details/26730909中已经说明了程序的设计,让我们来看看在cocos2dx 3.0中代码是怎样实现的. void ...
- cocos2dx-3.0(13)------SpriteBatchNode与SpriteFrameCache渲染速度
大家都知道一个游戏里面会有大量的图片,每一个图片渲染是须要时间的,以下分析两个类来加快渲染速度,加快游戏执行速度 一.SpriteBatchNode 1.先说下渲染 ...
- 使用Qt 3D Studio 2.4显着提升性能(渲染速度提高了565%)
发布于2019年6月18日星期二11评论Qt 3D Studio 2.4显着改善性能 发表于Biz Circuit&Dev Loop,设计,图形,性能,Qt 3D Studio 除了有效使用系 ...
- 转 cocos2d-x 优化(纹理渲染优化、资源缓存、内存优化)
概述 包括以下5种优化:引擎底层优化.纹理优化.渲染优化.资源缓存.内存优化 引擎优化 2.0版本比1.0版本在算法上有所优化,效率更高.2.0版本使用OpenGl ES 2.0图形库,1.0版本 ...
- webpack - 优化阻塞渲染的css
随着浏览器的日新月异,网页的性能和速度越来越好,并且对于用户体验来说也越来越重要. 现在有很多优化页面的办法,比如:静态资源的合并和压缩,code splitting,DNS预读取等等. 本文介绍的是 ...
- 【转】提高VR渲染速度的关键
提高VR渲染速度的关键,这个教程比以往的教程都要重要很多,如果你是刚刚步入学习和上升阶段那么这将是你必须要看的东西,他会让你迅速提升技能达到比你死看书本好很多的效果,不多说上教程 VR的基本渲染方 ...
- JavaScript的工作原理:解析、抽象语法树(AST)+ 提升编译速度5个技巧
这是专门探索 JavaScript 及其所构建的组件的系列文章的第 14 篇. 如果你错过了前面的章节,可以在这里找到它们: JavaScript 是如何工作的:引擎,运行时和调用堆栈的概述! Jav ...
随机推荐
- Android5.1开机LOGO与开机动画【转】
本文转载自:http://blog.csdn.net/u014770862/article/details/52624627 android5.1中,开机LOGO部分和之前版本的并不相同,主要区别在于 ...
- C语言 - typedef struct 与struct
c语言中可以选择的数据类型太少了. Java中有一些高级的数据结构. 结构中能够存放基本的数据类型以及其他的结构. 结构定义,一般放在程序的开头部分. 一般放在include之后. #include ...
- DNS通道检测 国外学术界研究情况——研究方法:基于流量,使用机器学习分类算法居多,也有使用聚类算法的;此外使用域名zif low也有
http://www.ijrter.com/papers/volume-2/issue-4/dns-tunneling-detection.pdf <DNS Tunneling Detectio ...
- 备份SQL SERVER 2005数据库
- JS函数种类详解
1. 普通函数1.1 示例 1 2 3 function ShowName(name) { alert(name); } 1.2 Js中同名函数的覆盖 在Js中函数是没有重载,定义相同函数名.不同 ...
- Python基础:lambda 匿名函数
格式 lambda argument1, argument2,... argumentN : expression square = lambda x: x**2 print(square(2)) 与 ...
- AWS S3 对象存储服务
虽然亚马逊云非常牛逼,虽然亚马逊云财大气粗,虽然亚马逊用的人也非常多,可是这个文档我简直无法接受,特别是客服,令人发指的回复速度,瞬间让人无语,可是毕竟牛逼.忍了,躺一次坑而已 1.图片上传 1.1 ...
- JWT和Spring Security集成
通常情况下,把API直接暴露出去是风险很大的, 我们一般需要对API划分出一定的权限级别,然后做一个用户的鉴权,依据鉴权结果给予用户对应的API (一)JWT是什么,为什么要使用它? 互联网服务离不开 ...
- BZOJ 1441 裴蜀定理
思路: 若a,b是整数,且(a,b)=d,那么对于任意的整数x,y,ax+by都一定是d的倍数,特别地,一定存在整数x,y,使ax+by=d成立. 它的一个重要推论是:a,b互质的充要条件是存在整数x ...
- CI中的分页
根据MVC的思想,分页是需要传数据到模型中,把页码传过去,在模型中根据页码分配: 更多分页类函数可以通过CI手册的分页类查看: $this -> load ->library('pagin ...