什么是DrawCall?DrawCall为什么会影响游戏运行效率?如何减少DrawCall?
目录
1 什么是DrawCall?
2 DrawCall为什么会影响游戏运行效率?
3 如何减少 DrawCall?(结合性能分析工具)
1 什么是DrawCall?
DrawCall(绘制调用) 是 GPU 的一个指令,用于通知 GPU 渲染一个或多个对象。每次 DrawCall 会触发 GPU 执行一次完整的渲染流程(如顶点处理、纹理采样、着色等)。在 Unity 中,每个材质不同的物体、不同的纹理或不同的着色器参数,通常都会产生独立的 DrawCall。
2 DrawCall为什么会影响游戏运行效率?
为什么 DrawCall 会影响效率?这里可能涉及到 GPU 的处理流程。每次 DrawCall 需要切换状态,比如材质、纹理、着色器等,这些状态切换会消耗时间。如果 DrawCall 过多,GPU 可能会在状态切换上花费太多时间,导致帧率下降。需要确认状态切换的具体影响,以及是否有其他因素,比如顶点处理的时间。CPU 需为每个 DrawCall 准备数据并发送到 GPU,高频率的 DrawCall 会占用 CPU 资源,影响主线程性能。过多 DrawCall 会导致 GPU 频繁启停渲染流水线,增加延迟。
3 如何减少 DrawCall?(结合性能分析工具)
1.透明物体需额外处理混合顺序(
//透明物体需额外处理混合顺序的核心原因是:
混合依赖背景色 → 必须后渲染且按从后到前顺序。
深度缓冲不写入 → 渲染顺序直接影响视觉效果。
),导致无法批处理。尽量减少透明材质使用,或合并透明物体。
2.为物体创建不同细节层次的模型(LOD Groups)。远处物体使用低精度模型,减少渲染顶点数和 DrawCall。
3.在 Camera 的 Culling Mask 中启用遮挡剔除。通过烘焙或实时计算,仅渲染可见物体,减少不必要的 DrawCall。
4.在可能的情况下,多个物体使用同一材质实例,避免因材质差异产生额外 DrawCall。
5.通过 Shader Variant Stripping 剔除未使用的着色器变体。在 Player Settings 中启用 “Strip Shader Variants”。
6.将多个小纹理合并为一个大图集,减少纹理切换。在 Unity 中创建 Sprite Atlas 并分配纹理。
7.合理使用批处理。(动态批处理[动态批处理是在运行时自动合并符合条件的物体,需要注意动态批处理可能因为物体移动或缩放而失效。]和静态批处理[静态批处理是在烘焙时将多个物体合并成一个网格,这样在运行时只需要一次 DrawCall。])(静态批处理需要在 Inspector 中勾选 Static 选项,而动态批处理在项目设置中启用。在 Edit > Project Settings > Graphics 中开启 Dynamic Batching。注意材质的共享,因为不同材质无法合并,这会影响批处理的效果。)