cocos2d-x中的auto-batching

本渣比较懒,就直接从工作邮件挑一部分放上来哈~

1.神马是GL calls?

GL calls也称batch,可以单纯理解成绘制次数,一般来说CPU向GPU发送batch会造成瓶颈,这个指标越小越好。

2.如何降低GL calls?

通常我们会在测试版的屏幕左下角看到一些指标,其中GL verts是需要绘制的总顶点数,一般是让每个batch的顶点数越多越好。cocosd-x引擎提供了auto batching的机制,在一定条件下,对于多个同一纹理(事实上是纹理、shader、blendFunc都需要一样)的node,只需要一次GL call。

3.auto batching原理?

引擎在绘制场景时会遍历每个node,调nodedraw函数:以前draw函数会直接绘制node,但3.0之后的版本改为向一个叫RenderQueue的队列push绘制命令,并不马上渲染。在渲染时从该queue拿出命令,如果连续的命令都是纹理A,那么A只需要一个batch,但如果中间插入了一个纹理B,则无法只用一个batch。

例如:RenderQueue中是AAAAABAAAAA,则需要三个batches。

4.auto-batching/RenderQueue中连续的条件?

node在向RenderQueue push命令时会先对子节点排序(排序按照localZOrderlocalZOrder一样就比较子节点添加的顺序),排完序再依次push相应子节点的绘制命令。RenderQueue会根据globalZOrder再排一次序。所以最后RenderQueue中顺序是先按globalZOrder、再按localZOrder、最后按子节点添加到父节点的顺序。

PS. node默认的globalZOrderlocalZOrder都为0

5.现有的系统如何用auto-batching?

6.如何判读改的东西被auto-batch?

代码中给它设一个专有的大于0的globalZOrder,看看GL calls是否减少。不变则说明之前的改动已被auto batch。

参考资料