Draw Call
(绘制调用)是游戏引擎向图形API(如 DirectX、OpenGL 或 Metal)发出的指令,要求 GPU 渲染一组几何体或对象。简单来说,每次需要绘制一个对象(例如模型、材质、纹理等)到屏幕上时,都会发起一次 Draw Call
。
每个 Draw Call
需要 CPU 和 GPU 进行通信,CPU 准备渲染数据(例如顶点、纹理、材质等),然后交给 GPU 进行实际的绘制。因此,Draw Call
的数量直接影响 CPU 和 GPU 之间的通信频率。
-
合并对象(Batching):
- 静态批处理(Static Batching):
- 对于静态对象(不会在运行时移动、旋转或缩放的物体),可以使用 Unity 的静态批处理来合并这些对象。这样,多个对象可以通过一次
Draw Call
渲染。 - 使用方法:勾选物体的 Static 选项。
- 对于静态对象(不会在运行时移动、旋转或缩放的物体),可以使用 Unity 的静态批处理来合并这些对象。这样,多个对象可以通过一次
- 动态批处理(Dynamic Batching):
- 对于小的动态物体(例如会移动的物体),Unity 也可以自动进行动态批处理。它会将多个共享相同材质的物体合并为一个批次来减少
Draw Call
数量。 - 动态批处理对物体的顶点数量有一定限制(通常物体的顶点数需小于 300)。
- 对于小的动态物体(例如会移动的物体),Unity 也可以自动进行动态批处理。它会将多个共享相同材质的物体合并为一个批次来减少
- 静态批处理(Static Batching):
-
使用合并材质(Material Batching):
-
减少材质切换:每次不同的材质切换会导致额外的
Draw Call
。通过合并材质、使用相同的材质或减少材质种类,可以减少Draw Call
。 -
纹理图集(Texture Atlas):将多个小纹理合并到一个大纹理中,这样多个物体可以共享同一个材质,减少
Draw Call
。纹理图集可以减少因为材质切换导致的Draw Call
。
-
-
使用 GPU 实例化(GPU Instancing):
- 如果场景中有大量相同的对象(例如树木、草地等),可以使用 GPU 实例化技术。通过实例化,多个相同网格的物体可以只用一次
Draw Call
来绘制,极大降低了Draw Call
数量。 - 在 Unity 中,可以通过勾选材质的 Enable GPU Instancing 选项来启用这个功能。
- 如果场景中有大量相同的对象(例如树木、草地等),可以使用 GPU 实例化技术。通过实例化,多个相同网格的物体可以只用一次
-
合理使用 LOD(Level of Detail):
- LOD 技术可以让距离较远的物体使用较低精度的模型渲染,减少绘制的顶点和面数,进而减少
Draw Call
和提升性能。
- LOD 技术可以让距离较远的物体使用较低精度的模型渲染,减少绘制的顶点和面数,进而减少
-
减少实时光照和阴影:
- 实时光照和阴影会增加
Draw Call
,尤其是多个光源和动态阴影的情况下。尽量使用 烘焙光照 来替代实时光照,可以显著降低Draw Call
数量。
- 实时光照和阴影会增加
-
合并网格(Mesh Combining):
- 如果场景中有多个使用相同材质的小型网格,可以在运行时将它们合并为一个较大的网格。这样可以减少需要渲染的物体数量,进而减少
Draw Call
。 - 例如,在 Unity 中可以使用
Mesh.CombineMeshes()
来合并多个网格。
- 如果场景中有多个使用相同材质的小型网格,可以在运行时将它们合并为一个较大的网格。这样可以减少需要渲染的物体数量,进而减少
-
避免过多的 UI 绘制:
- 在使用 Unity 的 UI 系统时,过多的 UI 元素可能导致
Draw Call
数量激增。可以通过合理布局、合并 UI 元素、减少透明度变化等方式来优化 UI 渲染。
- 在使用 Unity 的 UI 系统时,过多的 UI 元素可能导致