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

简单介绍

在游戏的绘制渲染中。往往消耗非常多资源和内存,当绘制精灵数量越多,游戏的卡顿会非常明显,为了优化和提升渲染效率。

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的更多相关文章

  1. Java动态编译优化——提升编译速度(N倍)

    一.前言 最近一直在研究Java8 的动态编译, 并且也被ZipFileIndex$Entry 内存泄漏所困扰,在无意中,看到一个第三方插件的动态编译.并且编译速度是原来的2-3倍.原本打算直接用这个 ...

  2. js优化提升访问速度

    一.给JS文件减肥. 有的人为了给网站增加炫目效果,往往会使用一些JS效果代码,这在上个世纪似乎还很流行,对于现在来说,最好在用户体验确实需要的情况下,使用这些东西.至于希望给自己的JS文件减肥的童鞋 ...

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

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

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

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

  5. 使用Qt 3D Studio 2.4显着提升性能(渲染速度提高了565%)

    发布于2019年6月18日星期二11评论Qt 3D Studio 2.4显着改善性能 发表于Biz Circuit&Dev Loop,设计,图形,性能,Qt 3D Studio 除了有效使用系 ...

  6. 转 cocos2d-x 优化(纹理渲染优化、资源缓存、内存优化)

    概述 包括以下5种优化:引擎底层优化.纹理优化.渲染优化.资源缓存.内存优化   引擎优化 2.0版本比1.0版本在算法上有所优化,效率更高.2.0版本使用OpenGl ES 2.0图形库,1.0版本 ...

  7. webpack - 优化阻塞渲染的css

    随着浏览器的日新月异,网页的性能和速度越来越好,并且对于用户体验来说也越来越重要. 现在有很多优化页面的办法,比如:静态资源的合并和压缩,code splitting,DNS预读取等等. 本文介绍的是 ...

  8. 【转】提高VR渲染速度的关键

    提高VR渲染速度的关键,这个教程比以往的教程都要重要很多,如果你是刚刚步入学习和上升阶段那么这将是你必须要看的东西,他会让你迅速提升技能达到比你死看书本好很多的效果,不多说上教程   VR的基本渲染方 ...

  9. JavaScript的工作原理:解析、抽象语法树(AST)+ 提升编译速度5个技巧

    这是专门探索 JavaScript 及其所构建的组件的系列文章的第 14 篇. 如果你错过了前面的章节,可以在这里找到它们: JavaScript 是如何工作的:引擎,运行时和调用堆栈的概述! Jav ...

随机推荐

  1. hihoCoder-1633 ACM-ICPC北京赛区2017 G.Liaoning Ship’s Voyage 线段与三角形规范相交

    题面 题意:给你一个20*20的地图,起点(0,0),终点(n-1,n-1),有障碍的点为‘#’,每次可以向8个方向走一步,还给了一个三角形,除了障碍以外,到这8个方向上的点的线段如果没有与三角形相交 ...

  2. 一个域名如何解析到多个ip地址

    一.域名解析多ip实例 简单一句话: dns 解析时多添加几个不同IP的A记录 例如: 上图中我给域名解析到两个不同的ip,大概等十分钟后我们ping 一下的结果如下 可以看到已经实现了一个域名解析到 ...

  3. if,elif,else的关系 input print int的用法

    qian=input("找劳保网是什么网站?:")if qian=="zhaolaobaowang.com": print("正确")els ...

  4. Cracking the Coding Interview 6.2

    There is an 8*8 chess board in which two diagnolly opposite corners have been cut off. You are given ...

  5. Hadoop MapReduce编程 API入门系列之wordcount版本5(九)

    这篇博客,给大家,体会不一样的版本编程. 代码 package zhouls.bigdata.myMapReduce.wordcount1; import java.io.IOException; i ...

  6. [转]解决C# WinForm 中 VSHOST.EXE 程序不关闭的问题

    右击“解决方案”--属性-调试栏-启用调试器部分-“启用Visual studio宿主进程”不勾选

  7. Android网络编程随想录(1)

    本系列文章对整个Android网络编程进行了总结,包括基本的TCP/IP协议,HTTP协议,HTTPS协议,HttpClient,UrlConnection,一些网络通信的库到棉花糖新加入的OKHTT ...

  8. 07 --C语言字符串函数

    1)字符串操作  复制 strcpy(p, p1)      复制字符串 strncpy(p, p1, n)  复制指定长度字符串 strdup(char *str)      将串拷贝到新建的位置处 ...

  9. Python——Day2(基础知识练习一)

    1.执行Python脚本的两种方式1)调用解释器 Python +绝对路径+文件名称2)调用解释器 Python +相对路径+文件名称 2.简述位.字节的关系8位为1个字节 3.简述ASCII.uni ...

  10. keepalived+mysql主主实现高可用

    mysql主从配置参考我的上篇博客 主主配置就是互为主从 环境 准备应用 keepalived-2.0.2.tar.gz openssl-devel-1.0.2k-12.el7.x86_64.rpm ...