文章目录
CPU
一、减少draw call数目
我们最常看到的优化技术大概就是批处理(batching)
了。批处理的实现原理就是为了减少每一帧需要的draw call数目。为了把一个对象渲染到屏幕上,CPU需要检查哪些光源影响了该物体,绑定shader并设置它的参数,再把渲染命令发送给GPU。当场景中包含了大量对象时,这些操作就会非常耗时。一个极端的例子是,如果我们需要渲染一千个三角形,把它们按一千个单独的网格进行渲染所花费的时间要远远大于渲染一个包含了一千个三角形的网格。在这两种情况下,GPU的性能消耗其实并没有多大的区别,但CPU的draw call数目就会成为性能瓶颈。因此,批处理的思想很简单,就是在每次面对draw call时尽可能多地处理多个物体
。
使用同一个材质的物体可以一起处理。这是因为,对于使用同一个材质的物体,它们之间的不同仅仅在于顶点数据的差别。我们可以把这些顶点数据合并在一起,再一起发送给GPU,就可以完成一次批处理。Unity中支持两种批处理方式:
1.动态批处理
- 实现原理:每一帧把可以进行批处理的模型网格进行合并,再把合并后模型数据传递给GPU,然后使用同一个材质对其渲染。
- 优点:
- 一切处理都是Unity自动完成的,不需要我们自己做任何操作(场景中有一些模型共享了同一个材质并满足一些条件,Unity就可以自动把它们进行批处理)。
- 物体可以移动(处理每帧时Unity都会重新合并一次网格)。
- 缺点:
- 限制很多,可能一不小心就会破坏了这种机制,导致Unity无法动态批处理一些使用了相同材质的物体。这些条件有:能够进行动态批处理的网格的顶点属性规模要小于900(如果shader中需要使用顶点位置、法线和纹理坐标这3个顶点属性,它的顶点数目不能超过300)。多Pass的shader会中断批处理等。
2.静态批处理
-
实现原理:
- 静态批处理的实现非常简单,只需要把物体面板上的
Static
复选框勾选上即可(实际上我们只需要勾选Batching Static
即可)。在运行时查看每个模型使用的网格,会发现它们都变成了一个名为Combined Mesh (roo:scene)的东西。 - 只在运行开始阶段,把需要进行静态批处理的模型合并到一个新的网格结构中,这意味着这些模型不可以在运行时刻被移动。但由于它只需要
- 静态批处理的实现非常简单,只需要把物体面板上的