DrawCall 指的是 CPU 向 GPU 发送渲染指令的过程,在 Unity 中,每次渲染一个网格时,CPU 都需要向 GPU 发送一系列的渲染指令,这个过程被称为一次绘制调用(Draw Call)。
1.GPU实例化
同时渲染同一Mesh的多个副本。GPU 实例化可用于绘制在场景中多次出现的几何体,例如树木或灌木丛。
使用:
2.绘制调用批处理
绘制调用批处理是一种绘制调用优化方法,它组合网格,以便 Unity 可以在更少的绘制调用中渲染它们。
批处理使用信息:
1.绘制调用批处理支持Mesh Renderers、Trail Renderers、Line Renderers、 Particle Systems和Sprite Renderers。不支持其他类型的渲染组件,包括 Skinned Mesh Renderers Cloth。Unity 仅将 Renderer 与相同类型的其他 Renderer 一起批处理;例如,Mesh Renderers (网格渲染器) 和 Mesh Renderers (网格渲染器)。
2.Unity 对使用相同材质的游戏对象进行批处理绘制调用。这意味着,要从绘制调用批处理中获得最佳结果,请在尽可能多的游戏对象之间共享材质。如果您有两个除纹理外完全相同的材质资源,则可以将纹理合并为一个更大的纹理。此过程称为纹理图集。有关更多信息,请参阅有关纹理图集的 Wikipedia 文章。当纹理位于同一图集中时,您可以改用单个材质资源。
3.在内置渲染管道中,您可以使用 MaterialPropertyBlock 来更改材质属性,而不会中断绘制调用批处理。CPU 仍然需要进行一些渲染状态更改,但使用 MaterialPropertyBlock 比使用多个材质更快。如果您的项目使用可编程渲染管线,请不要使用MaterialPropertyBlock,因为它们会删除材质的 SRP Batcher 兼容性。
4.透明着色器通常需要 Unity 按从后到前的顺序渲染网格。要对透明网格进行批处理,Unity 首先从后到前对它们进行排序,然后尝试对它们进行批处理。由于 Unity 必须从后到前渲染网格,因此它通常无法像不透明网格一样批量处理透明网格。
5.Unity 无法将动态批处理应用于 Transform 组件中包含镜像的游戏对象。例如,如果一个游戏对象的比例为 1,而另一个游戏对象的比例为 –1,则 Unity 无法将它们一起批处理。
如果无法使用绘制调用批处理,则手动组合彼此接近的网格可能是一个不错的选择。
注: 从 C# 脚本访问共享材质属性时,请确保使用 Renderer.sharedMaterial 而不是 Renderer.material。 创建材质的副本,并将该副本指定回 Renderer。这会阻止 Unity 对该 Renderer 的绘制调用进行批处理。
Unity 提供两种内置的绘制调用批处理方法:
1.静态批处理:提前组合静态游戏对象的网格。Unity 将组合数据发送到 GPU,但单独渲染组合中的每个网格。Unity 仍然可以单独剔除网格,但每个绘制调用的资源消耗较少,因为数据的状态永远不会改变。
使用:Unity中的静态合批使用整理-CSDN博客
2.动态批处理:对于足够小的网格,这会在 CPU 上变换它们的顶点,将相似的顶点分组在一起,并在一个绘制调用中渲染它们。
使用:Unity中的动态合批使用整理-CSDN博客
与手动组合网格相比,Unity 的内置绘制调用批处理具有多个优势;最值得注意的是,Unity 仍然可以单独剔除网格。但是,它也有一些缺点;静态批处理会产生内存和存储开销,而动态批处理会产生一些 CPU 开销。
注:
性能权衡:虽然合批可以减少渲染调用次数,提高性能,但并不是所有情况下都适合合批。例如,频繁移动或改变状态的对象进行动态批处理可能会带来额外的开销,反而降低性能。
光照影响:静态批处理会影响光照计算,因为合批后的对象会被视为一个整体。在使用静态批处理时,需要注意光照烘焙的设置,以确保光照效果符合预期。
Shader 支持:使用的 Shader 必须支持合批。一些复杂的 Shader 可能不支持动态批处理或静态批处理,需要对其进行优化或选择合适的 Shader。
3.使用代码组合网格
使用 Mesh.CombineMeshes 函数手动将多个网格组合成一个网格,Unity 在单个绘制调用中渲染组合网格,而不是每个网格一个绘制调用。在网格靠得很近且彼此不相对移动的情况下,此技术可以很好地替代绘制调用批处理。
注:Unity 无法单独剔除组合的网格。
Unity性能优化---动态网格组合(一)_unity 场景查看网格-CSDN博客
Unity性能优化---动态网格组合(二)_urp 网格材质球-CSDN博客
4.SRP Batcher
如果项目使用可编程渲染管线 (SRP),使用SRP Batcher可以减少Unity为使用相同着色器变体的材质准备和调度绘制调用所需的CPU时间。
使用:
5.优化优先级
如果将游戏对象标记为使用多个绘制调用优化方法,则 Unity 将使用最高优先级的方法。但使用SRP Batcher时,Unity 还支持对与SRP Batcher兼容的游戏对象进行静态批处理。
Unity 按以下顺序确定绘制调用优化的优先级:
1.SRP Batcher 和静态批处理
2.GPU 实例化
3.动态批处理
如果将游戏对象标记为静态批处理,并且 Unity 成功对其进行批处理,则 Unity 会禁用该游戏对象的 GPU 实例化,即使渲染器使用实例化着色器也是如此。发生这种情况时,Inspector (检查器) 窗口会显示一条警告消息,建议您禁用静态批处理。同样,如果 Unity 可以对网格使用 GPU 实例化,则 Unity 会禁用该网格的动态批处理。
未完待续。。。
参考链接: