我的个人公众号是 亮亮同学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 你的关注就是我写作的动力@@