cocoscreator 2.4.x版本drawcall优化 第一期,简单,易懂,了解控制drawcall核心理论

我的个人公众号是 亮亮同学TT 你的关注就是我写作的动力@@

「目录:」

1,测试环境

2,为何drawcall多会影响性能

3, 哪些组件支持渲染

4,影响drawcall的因素

5,一句话介绍如何减少drawcall

6,哪种情况下渲染组件不会被渲染,哪种情况下

7,减少drawcall的实操理论(放在第二期)

8,理论指导实践,实践印证理论,demo实操(放在第三期)

9,总结(放在第三期)

「测试环境」 :

1.Mac 系统

2.cocoscreator 2.4.x版本

「为何drawcall多会影响性能?」

Drawcall: 绘制调用,指cpu调用图形绘制接口命令gpu进行图形绘制

「每一次绘制前,CPU要准备绘制参数(状态)比如色彩通道(color filter),绘图方式(shader)等复杂的数据处理,然后Drawcall,如果有大量drawcall,就会加重cup的负担,导致性能下降。(什么 你说都换牛皮的cpu就好了?¥_¥)。」

「哪些组件支持渲染:」 因为一个drawcall是一次cpu调用图形绘制接口命令 gpu进行图形绘制渲染的过程,所以需要了解cocoscreator中哪些组件支持渲染,才能更好的控制drawcall

** * !#en * Base class for components which supports rendering features. * !#zh * 所有支持渲染的组件的基类 * * @class RenderComponent * @extends Component */let RenderComponent = cc.Class({

上面的注释介绍 RenderComponent是所有渲染组件的基类,就是说他的子类和孙子类的组件。。。都是支持渲染的组件 可以全局搜索引擎,知道 粒子, 动画,文字(label),遮罩(mask),运动轨迹(MotionStreak),精灵(Sprite),绘图(Graphics)地图(tiledmap)等等, 也可以在 cocoscreator界面 右侧添加组件 -》渲染组件查看

「影响drawcall的因素:」

1,层级(zindex)
zIndex是节点的层级是用来对节点进行排序的关键属性,它决定一个节点 在兄弟节点之间的位置。

1) zIndex 的取值介于 cc.macro.M IN_ZINDEX 和 cc.macro.MAX_ZINDEX 之间

即 - math.pow(2,15). 和 math.pow(2,15)-1之间。

实际操作中一般是 -1 到 n n一般不会超过1000

2)父节点主要根据节点的 zIndex 和添加次序来排序,拥有更高 zIndex 的节点将被排在后面(后被渲染先被渲染的图在后被渲染的图下面),如果两个节点的 zIndex 一致,先添加的节点会稳定排在另一个节点之前。排在前面的节点先被渲染,也就是说两张图层级相同 先添加的会先被渲染 显示出来的结果是 在后被渲染的图的下面。

3)节点在 children 中的顺序决定了其渲染顺序。父节点永远在所有子节点之前被渲染

4)node节点放在Canvas或者父节点的zindex默认值是0

2,材质(Material)(shander,贴图(纹理),混合模式(blend))。只有拥有相同材质的渲染节点 才可能进行批处理,贴图,shader 决定了材质,而层级则决定了相同的材质 是否能 进行合并处理 即合并网格(mesh) 合并drawcall.。

3,cullingMask(决定相机会渲染场景的某一部分)
在引擎源码检查合批的 源码中 有一段是 检查材质是否相同 同时也有一个判断是 渲染的cullingMask和当前的 cullingMask 是否相等,如果不相等也会产生一个drawcall 。如下源码

 if ((material && material.getHash() !== renderer.material.getHash()) || 
        renderer.cullingMask !== cullingMask) {
        renderer._flush();

        renderer.node = material.getDefine('CC_USE_MODEL') ? this.node : renderer._dummyNode;
        renderer.material = material;
        renderer.cullingMask = cullingMask;
    }

也就是说操作摄像机也有打断合批的可能

「一句话介绍如何减少drawcall:」 绘制状态的变化 是导致drawcall增多的 主要原因。cocoscreator认为要以深度(zindex)优先的方式对渲染组件进行渲染,并且cocoscreator认为相同的材质可以被批量渲染。所以具有相同材质的并且连续的渲染节点 可以合并渲染 减少drawcall.

「连续:」

1,层级相同添加顺序相邻,

2,层级不同 中间层级没有其他材质的渲染组件。比如 a的层级是1 b的层级是3 在 1-3层级之间没有其他材质的 渲染组件.

「哪些渲染组件不会被渲染」

cocoscreator 认为 透明度 === 0. 或者 active = false 的渲染组件 不会被渲染。

​后面还有 2,3期正在写 敬请期待​。

我的个人公众号是 亮亮同学TT 你的关注就是我写作的动力@@

9赞

欢迎各位引擎/专家大佬来 批评 指出问题,补充内容。@@

mark ~~
正好在找这种帖子,之前搜了很多资料 和文章写的都是具体的做法,看完只知其一不知其二,虽然知道怎么去弄可以减少drawcall,但是实际项目中,有时候会莫名的drawcall增多, 今天看了这个帖子,忽然就开窍了,东西不多但是写的很有用,感谢分享。

知道了关键部分,不管需求怎么变都能更好的控制drawcall :wink:

:laughing:了解了DrawCall关键之后如何帮助实践:
能实时查看每个节点的DrawCall的Creator节点树插件:
https://store.cocos.com/app/detail/2940


1赞

哈哈, :smiley:

1赞

:+1::+1::+1::+1::+1:

mark!