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 ...
随机推荐
- Node.js:创建第一个应用
ylbtech-Node.js:创建第一个应用 1.返回顶部 1. Node.js 创建第一个应用 如果我们使用PHP来编写后端的代码时,需要Apache 或者 Nginx 的HTTP 服务器,并配上 ...
- kali 下使用 arpspoof 实现 ARP 欺骗
ARP 欺骗: 一种中间人攻击,攻击者通过毒化受害者的 ARP 缓存,将网关的 MAC 替换成攻击者的 MAC ,于是攻击者的主机实际上就充当了受害主机的网关, 之后攻击者就可以截获受害者发出和接到的 ...
- Entity Framework 的懒加载、预先加载、显示加载
1.新建两个实体,一个班级有多个学生 public class Student { public int StudentId { get; set; } public string StudentNa ...
- Centos7下Docker的使用
一.安装Docker 1.1.查看原有系统是否已经安装docker yum list installed | grep docker 1.2.如果有则不需要继续安装,想重新安装,先卸载 yum -y ...
- 外观模式(Facade)C++实现
外观模式 意图: 为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一系统更加容易使用. 适用性: 1.在设计初期阶段,应该要有意识的将不同的两个层分离,比如经典的三层架 ...
- javascript一个作用域案例分析
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- mysqldump+mydumper+xtrabackup备份原理流程
mysqldump备份原理 备份的基本流程如下: 1.调用FTWRL(flush tables with read lock),全局禁止读写 2.开启快照读,获取此时的快照(仅对innodb表起作用) ...
- Linux系统编程@进程管理(一)
课程目标: 构建一个基于主机系统的多客户即时通信/聊天室项目 涉及的理论知识 进程控制:僵尸进程/孤儿进程.进程控制.守护进程... 进程间通信:管道.命名管道.信号... 多线程编程: 锁.信号量. ...
- java真实面试题(2)
1,递归算法的实行过程,一般来说,可以分为()和()两个阶段,若一个问题的求解既可以用递归也可以用递推时,则往往用(),因为().贪婪法是一种()的算法. 答:递归算法分为递推和回归两个阶段,递推效率 ...
- RHEL 7 & CentOS 7禁用IPV6(转载)
RHEL 7 & CentOS 7下禁用IPV6的方法和之前的版本不太一样了,本文整理了一下处理方法: 首先,我们必须给出最根本的解决方法:修改grub,在引导时就不加载IPV6模块 这样修改 ...