GPU 性能分析

GPU 有多个单元平行工作,不同单元在帧的不同位置常出现受限状况。 因此,在确定并查找 GPU 瓶颈时需要找到 GPU 消耗的来源。

GPU 消耗来源

使用 ProfileGPU 命令可快速确定多个通道的 GPU 消耗,有时可精确到绘制调用。 可使用鼠标 UI 或文本版本。可通过 r.ProfileGPU.ShowUI 对 UI 进行抑制。数据基于 GPU 时间戳,通常较为准确。部分优化将使数据的可靠性降低,需对其持保留态度。我们发现使用着色器数秒后部分驱动会对着色器进行优化。效果可能直观可见,有必要稍作等候,或另行测量以便确定。

ProfileGPU.png
CONSOLE:ProfileGPU
快捷键:Ctrl+Shift+,
...
 1.2% 0.13ms   ClearTranslucentVolumeLighting 1 draws 128 prims 256 verts
42.4% 4.68ms   Lights 0 draws 0 prims 0 verts
   42.4% 4.68ms   DirectLighting 0 draws 0 prims 0 verts
       0.8% 0.09ms   NonShadowedLights 0 draws 0 prims 0 verts
          0.7% 0.08ms   StandardDeferredLighting 3 draws 0 prims 0 verts
          0.1% 0.01ms   InjectNonShadowedTranslucentLighting 6 draws 120 prims 240 verts
      12.3% 1.36ms   RenderTestMap.DirectionalLightImmovable_1 1 draws 0 prims 0 verts
          1.4% 0.15ms   TranslucencyShadowMapGeneration 0 draws 0 prims 0 verts
...

ProfileGPU 将显示灯光名称,便于美术师对正确的灯光进行优化。

查看每帧中高等级的消耗并确定合理的消耗量为可取之法(如:较大的绘制调用、复杂材质、密集三角形网格体、较远可视距离):

部分通道的特效可出现在其后方的通道上。部分实例:

什么是 GPU 瓶颈?

性能消耗通常随像素量变化。进行测试的方法为:使用 r.SetRes 改变渲染分辨率,或在编辑器中缩放视口。 使用 r.ScreenPercentage 更为便利,但需注意 - 使用此功能后将增加额外的上采样消耗。

如发现可计量的性能变化,表明已受到像素相关方面的限制。通常为内存带宽(读和写)或运算限制(ALU),少数情况下 为特定单元饱和(如 MRT 导出)。如在相关通道上降低内存(或运算)后出现性能变化,即可确定是内存带宽(或 ALU 单元)受限。 仅限测试,变更无需外观相同。现在即可明确从何处下手降低消耗,增强性能。

阴影贴图分辨率不随屏幕分辨率变化(使用 r.Shadow.MaxResolution),除非存在阴影投射遮罩或不透明材质的大片区域, 否则不为像素着色器受限。通常阴影贴图渲染受顶点处理或三角形处理限制(引起:密集网格体、无 LOD、曲面细分、世界位置偏移使用)。 使阴影贴图渲染消耗出现变化的因素有:灯光数量、级联/立方体贴图数量、灯光视锥中的阴影投射物体数量。这是常见的瓶颈, 对内容进行较大变更方可减少消耗。

高度细分的网格体中线框显示为纯色,可能出现较差的四边形应用。原因 是 GPU 在 2x2 的像素块中对三角形进行处理,并在稍后拒绝三角形外的像素。这是 mip map 计算的条件。对于较大的三角形而言并不存在问题, 但如果三角形过小或过长,则性能可能受到影响(处理的像素过多,但对图像实际帮助不大)。延迟着色可改善此状况,因为 灯光上存在极好的四边形应用。此问题在基础通道中同样存在,因此复杂材质的渲染速度较慢。 解决方法是使用密度较低的网格体。通过 LOD 网格体仅可解决出现问题的区域(远距离)。

可对 r.EarlyZPass 进行调整,确认完整早期 Z 通道是否场景有所帮助(更多绘制调用、基础通道中较少的过度绘制)。

如改变分辨率后变化不大,则可能是受到顶点处理(顶点着色器或曲面细分)消耗的限制。 通常需要通过内容变更进行验证。典型因素包括:

还可能存在其他限制因素(几率较小)。包括: