TA工具箱首页 / TA 术语百科

Overdraw 过度绘制

2026-08-27

什么是Overdraw

Overdraw(过度绘制)指的是在渲染过程中,同一个屏幕像素被多次写入颜色缓冲区。这通常是由于多个不透明或半透明物体相互重叠,或者物体自身多个面重叠导致的。每次写入都需要执行片段着色器并进行混合,消耗GPU计算和带宽资源。

Overdraw的原因

  • **不透明物体重叠**:如果渲染顺序不当,较远的物体先被绘制,然后被近处物体覆盖,造成浪费。虽然深度测试可以避免最终颜色错误,但片段着色器已经执行。
  • **透明物体**:透明物体需要混合,无法通过深度测试完全剔除,每个透明层都会增加overdraw。
  • **复杂几何体**:模型内部有重叠面,或者粒子系统大量叠加。
  • **UI元素**:多层UI叠加导致overdraw。
  • **后处理**:全屏后处理效果可能多次采样和写入。

Overdraw的影响

Overdraw直接增加填充率(Fill Rate)压力,即GPU每秒需要处理的像素数量。在高分辨率或移动设备上,填充率往往是瓶颈。过度绘制会导致:

  • 帧率下降
  • 功耗增加
  • 设备发热

如何检测Overdraw

  • **渲染调试工具**:许多引擎提供overdraw可视化模式,例如Unity中的Scene视图可以开启Overdraw模式,不同颜色代表绘制次数。
  • **GPU性能分析器**:如NVIDIA Nsight、Android GPU Inspector等,可以统计overdraw率。
  • **自定义调试**:使用替换shader,根据绘制次数输出颜色。

优化Overdraw的策略

1. 优化渲染顺序

  • **不透明物体从前往后排序**:先绘制近处物体,利用深度测试剔除远处被遮挡的像素,减少overdraw。但实际中常用从后往前以减少状态切换,需权衡。
  • **透明物体从后往前排序**:这是标准做法,确保混合正确。

2. 减少透明物体覆盖面积

  • **使用Alpha Test代替Alpha Blend**:对于需要镂空效果的物体,使用alpha test可以避免混合,但会产生锯齿。
  • **简化透明几何体**:使用更简单的网格,降低覆盖率。
  • **限制粒子数量**:优化粒子系统,减少重叠。

3. 优化几何体

  • **避免内部重叠面**:确保模型没有隐藏的内部面。
  • **使用遮挡剔除**:在CPU或GPU阶段剔除被完全遮挡的物体,避免绘制。

4. 优化UI

  • **减少UI层叠**:合并UI元素,使用图集减少draw call和overdraw。
  • **裁剪UI区域**:只绘制可见部分。

5. 利用深度预渲染

对于复杂场景,可以先渲染深度缓冲,然后在主渲染时使用深度测试等于(或小于)来跳过被遮挡的像素,减少overdraw。

总结

Overdraw是实时渲染中常见的性能瓶颈,通过合理排序、减少透明复杂度、优化几何和UI,可以有效降低overdraw,提升性能。

常见问题

Overdraw和Draw Call有什么区别?

Draw Call是CPU向GPU发出的绘制指令,数量多会增加CPU开销。Overdraw是GPU像素被重复绘制,增加GPU填充率压力,两者是不同维度的性能指标。

如何查看Unity中的Overdraw?

在Scene视图的右上角,选择Overdraw模式,场景会以不同颜色显示绘制次数,红色表示overdraw严重。也可以在Frame Debugger中查看。

透明物体为什么容易导致Overdraw?

透明物体需要混合,不能仅通过深度测试剔除被遮挡像素,每个透明层都会执行混合操作,大量透明物体叠加会成倍增加overdraw。

深度预渲染如何减少Overdraw?

先渲染整个场景的深度到深度缓冲,然后在正式渲染时,使用深度测试为“相等”或“小于等于”,这样只有最前面的像素会通过深度测试并执行片段着色器,被遮挡像素不会执行,减少overdraw。

移动端如何优化Overdraw?

移动GPU带宽有限,overdraw影响更大。应尽量减少透明物体使用,简化UI,使用遮挡剔除,避免全屏后处理过度,并利用深度预渲染。