为什么合批能提升性能?
- 游戏引擎绘制一个游戏页面,首先需要遍历此页面中的所有需要绘制的物体,然后把这些物体提交给GPU来进行绘制。大体流程如下
- CPU 准备绘制所需要的数据:位置、尺寸、纹理等等
- CPU下达绘制命令(draw cmd)
- GPU 渲染物体,显示出来
- 如果页面中有100个物体需要提交给GPU进行绘制,如果一个一个的提交,则需要执行100次绘制过程。1和2 会多次频繁调用,且、1和2开销也是比较大的,3会不饱和:类似一车次高铁只乘坐一位乘客。
- 合批:把游戏中场景中的多个物体合并到一起,一次性传递给GPU进行渲染。如果我们把100个物体合并成一个批次,只需要执行一个1和2。虽然和增大3的开销,但是GPU的性能比较的强,综合下来,可以大大的提高渲染性能。
如果查看系统的DrawCall?
通过CocosCreator 的show fps 即可查看Draw call次数。
在优化之前需要先清楚DrawCall次数的分布情况。
- label +1
- button +1。相邻button节点不增加
- sprite +1。相邻sprite节点不增加,sprite默认开启了packable。
- button和sprite 如果被label间隔开来,都会增加。label打断合批。
- 最直接的查看某个节点占用的dc次数,直接显隐目标节点,对比前后两次dc变化即可。
合批常用的技术原理和缺点
- 静态合批
- 引擎将静态(不能移动)的可以合批(具有相同材质)的物体通过预先计算,生成一个包含这些小物体的大物体,然后把这些大物体一次性传递给GPU 进行绘制。 相当于多个小物体一次性进行绘制。
- 优先:提升渲染效率
- 缺点:预先计算,增加启动时长。计算出新的大物体,可能会因为模型顶点增加,增大内存的开销。
- 动态合批
- 绘制的时候,CPU计算出这些相同材质物体的每个顶点*世界矩阵=>世界坐标,加上材质,提交给GPU。
- 优点:能合批,提高渲染效率。
- 缺点:实时占用CPU,增大了CPU的开销。因此进行动态合批的物体,顶点数目不能过多。当增加的CPU开销 > 合批带来渲染提升 =>导致性能不增反降。
- GPU Instancing 合批
- 同一个物体的N个实例的情况,我们提交一个物体的Mesh给GPU绘制出来N个实例。这N个实例可以拥有不同的位置、旋转、缩放等等。