Draw Call 是 Unity 中的一个概念,指的是 GPU 渲染一个物体所需的调用次数。减少 Draw Calls 可以提高游戏的帧率。可以通过合并材质、合并网格等方式减少 Draw Calls。
主要的优化方式有以下几点:
- 合并网格:将多个网格合并成一个网格,可以减少 Draw Call。可以使用 Unity 中的 Mesh.CombineMeshes 方法来实现网格的合并。
- 合并材质:将多个使用相同材质的物体合并成一个物体,可以减少 Draw Call。可以使用 Unity 中的 MaterialPropertyBlock 来实现材质的共享。
- 使用静态批处理:将多个静态物体合并为一个批次进行渲染,可以减少 Draw Call。可以在 Unity 中开启静态批处理来实现。
- 使用动态批处理:将多个动态物体合并为一个批次进行渲染,可以减少 Draw Call。可以在 Unity 中开启动态批处理来实现。
- 使用 GPU Instancing:使用 GPU 实例化技术可以将多个相同的物体实例化,减少 Draw Call。可以通过创建 MaterialPropertyBlock 对象并调用 MaterialPropertyBlock.SetVectorArray 方法来实现 GPU Instancing。
- 使用 Atlas 贴图:将多个小贴图合并成一个大贴图,可以减少 Draw Call。可以使用 Unity 中的 SpritePacker 工具来实现贴图的合并。
- 减少动态物体的数量:动态物体需要每帧重新绘制,因此数量过多会导致 Draw Call 增加。可以通过使用静态物体、使用 LOD 等方式来减少动态物体的数量。
- 减少透明物体的数量:透明物体需要额外的渲染步骤,因此数量过多会导致 Draw Call 增加。可以通过使用不透明物体、使用 Alpha Test 等方式来减少透明物体的数量。
静态批处理是将多个静态物体合并为一个网格进行渲染,以减少 Draw Call 的数量。在静态批处理中,首先需要将多个静态物体的网格数据合并为一个大的网格数据,然后将该网格数据传递给渲染引擎进行绘制。通过将多个静态物体合并为一个网格进行渲染,可以避免重复设置渲染状态和切换渲染资源,从而提高渲染效率。
静态批处理对资源的要求相对较高,需要将多个静态物体合并为一个网格,并在渲染时使用该网格进行绘制。因此,在使用静态批处理时,需要对多个物体进行合并,并在合并后生成新的网格资源。这可能会导致一些资源占用较高,因此需要适当控制合并后网格的大小和数量,以避免资源浪费和性能下降。
在使用静态批处理时,多个静态物体会被合并为一个网格进行渲染,因此,合并后的网格的面数应该尽可能地少,以避免在渲染时对性能的影响。通常来说,一个静态网格的面数不应该超过几千个,最好控制在一千个以下。如果面数过多,可能会导致合并后的网格过大,占用过多的资源,并且在渲染时会消耗大量的计算资源,导致性能下降。
需要注意的是,实际的面数限制取决于硬件和游戏引擎的支持能力。在使用静态批处理和动态批处理时,应该根据硬件和游戏引擎的支持能力,以及游戏的实际需求进行合理的面数限制。
优点:
- 减少 Draw Call:将多个静态物体合并为一个批次进行渲染,可以减少 Draw Call,提高游戏性能。
- 支持动态光照:静态批处理可以支持动态光照,因此适用于需要实时光照的场景。
- 简单易用:静态批处理的使用比较简单,只需要在材质上勾选“静态”选项即可。
缺点:
- 不支持动态物体:静态批处理只适用于静态物体,不支持动态物体的合并。
- 内存占用较高:静态批处理需要在内存中创建新的合并网格对象,因此占用内存较高。
在使用静态批处理时,多个静态物体被合并为一个批次进行渲染,可能会导致一些被遮挡的物体也被渲染出来,影响遮挡剔除的效果。因此,在使用静态批处理时,需要注意场景的构建和物体的摆放,尽量避免物体之间的遮挡。
动态批处理是将多个动态物体合并为一个网格进行渲染,以减少 Draw Call 的数量。在动态批处理中,每帧都需要重新生成一个网格数据,将多个动态物体的网格数据合并为一个大的网格数据,然后将该网格数据传递给渲染引擎进行绘制。通过将多个动态物体合并为一个网格进行渲染,可以避免重复设置渲染状态和切换渲染资源,从而提高渲染效率。
动态批处理对资源的要求相对较低,不需要生成新的网格资源,而是在动态物体的渲染时进行批量绘制。因此,在使用动态批处理时,不需要对多个物体进行合并,可以直接在运行时动态生成和渲染物体。这可以减少对资源的占用,并提高游戏性能。
在使用动态批处理时,多个动态物体也会被合并为一个网格进行渲染,但与静态批处理不同的是,动态物体的面数可以较多。通常来说,一个动态网格的面数可以控制在数万面以下。如果面数过多,可能会导致渲染时消耗大量的计算资源,导致性能下降。
需要注意的是,实际的面数限制取决于硬件和游戏引擎的支持能力。在使用静态批处理和动态批处理时,应该根据硬件和游戏引擎的支持能力,以及游戏的实际需求进行合理的面数限制。
优点:
- 支持动态物体:动态批处理可以将多个动态物体合并为一个批次进行渲染,因此适用于需要动态生成物体的场景。
- 内存占用较低:动态批处理不需要创建新的合并网格对象,因此占用内存较低。
- 支持 GPU Instancing:动态批处理支持 GPU 实例化技术,可以进一步减少 Draw Call。
缺点:
- 不支持动态光照:动态批处理不支持动态光照,因此在需要实时光照的场景中效果不佳。
- 对 CPU 性能影响较大:动态批处理需要在 CPU 上进行计算和合并,因此对 CPU 性能影响较大。
在使用动态批处理时,多个动态物体被合并为一个批次进行渲染,可以有效减少 Draw Call,但也可能会影响遮挡剔除的效果。如果动态物体数量较多并且密集,可能会导致一些被遮挡的物体也被渲染出来,影响遮挡剔除的效果。因此,在使用动态批处理时,需要根据具体场景和需求选择和应用,并结合其他优化技术来提高遮挡剔除的效果。