UE5 GPU Visualizer 排查渲染负载原因的调试流程
【UE5】GPU Visualizerで描画負荷の原因を切り分ける方法|重いときの調査手順
译文尚不完整,完整内容请切换到原文。
問題点
在使用 Unreal Engine 5(UE5)制作游戏时,随着功能不断增多,帧率可能会突然下降。
人们往往会想"渲染太重了,先把贴图缩小吧"或"把 Nanite 关掉就好",但在原因不明的情况下更改设置,有时会牺牲了画面效果却得不到改善。
这篇文章是一份备忘,用于在渲染负载较重时确认问题是出在 CPU 还是 GPU,并通过 GPU Visualizer 找出高负载的处理。参考了 UE5.8 的官方文档。UI 和测量结果会因 GPU、RHI 和项目设置的不同而异。
1. 首先看帧时间(ms)而非 FPS
如果游戏目标是 60 FPS,那么每帧可用的时间约为 16.7 ms。如果是 30 FPS,则约为 33.3 ms。
| 目標 | 1 帧的预算 |
|---|---|
| 60 FPS | 约 16.7 ms |
| 30 FPS | 约 33.3 ms |
如果只看 FPS,就很难判断哪里慢。首先打开编辑器内的控制台,然后执行以下操作。
stat unit
注意显示的 Frame、Game、Draw、GPU。
- Game:主要为游戏线程侧的处理时间
- Draw:主要为渲染线程侧的处理时间
- GPU:GPU 侧处理时间的参考值
- Frame:整个帧的总时间
例如,如果 GPU 单独偏大,则渲染处理可能是瓶颈。另一方面,如果 Game 或 Draw 较长,那么在削减 GPU 相关设置之前,先排查 CPU 侧可能更合适。
2. 在 profilegpu 中打开 GPU Visualizer
如果怀疑是 GPU 的问题,在问题可以复现的场景下,在控制台中输入以下内容。
profilegpu
会打开 GPU Visualizer(GPU 分析器),可以分层查看目标帧的 GPU 处理。由于不同环境下快捷键操作可能不同,使用控制台命令更为可靠。
我查看的顺序如下。
- 查看 GPU 帧的整体时间。
- 寻找耗时较长的事件/路径。
- 对该路径对应场景中的哪个元素提出假设。
- 仅临时禁用该元素,然后再次测量。
例如,调查候选项包括以下内容。
| 高负载候选项 | 接下来要确认的内容 |
|---|---|
| 暗影深渊 / 暗影投射 | 动态光源、投射阴影的物体、Virtual Shadow Maps |
| Lumen 相关 | GI·反射设置、屏幕内的光源、质量设置 |
| 半透明 | 半透明材质、烟雾和火焰等粒子 |
| 后期处理 | 景深、泛光、各种后期处理 |
| Niagara相关处理 | 粒子数、发射器数、GPU Simulation |
显示名称和事件分类会因UE的版本和渲染配置而异。此表是开始调查时的分类参考,并非所有项目都会出现相同的条目。
3. 通过分辨率判断是否为渲染负载
如果要查明是否为取决于屏幕像素数的处理所致,请变更屏幕百分比以用于对比。
r.ScreenPercentage 100
以此为基准进行测量,接下来:
r.ScreenPercentage 50
在同一场景、同一相机位置下进行测量。如果改善幅度较大,则可作为怀疑像素数量相关处理(绘制、部分后处理、半透明等)的线索。
不过,此更改是探索原因的实验。由于画质和升频条件也会随之改变,即使有所改善,也并非必须将50%固定作为最终方案。测试完成后请恢复原始值。也请注意与自动分辨率设置及TSR的组合使用。
4. 查看半透明效果是否过重
当大量烟雾或火花重叠时,过度绘制可能会成为GPU负载的来源。
在视口中选择 View Mode 至 Shader Complexity,或使用以下方法。
viewmode shadercomplexity
在此显示中,着色器复杂度会以颜色进行可视化。完全变红的部位不一定是唯一的瓶颈,但可以作为查找半透明绘制集中区域的入口。必要时也请查看 Quad Overdraw 显示。
对策方案包括:减少粒子的显示面积、重叠和数量,以及重新审视材质。在优化前后拍摄相同的画面构图并进行比较非常重要。
5. 验证“确有改善”的记录方法
预先填好下表,就能更清楚地看出修改设置的意义。
| 条件 | 変更前 | 変更後 |
|---|---|---|
| UE / GPU / 分辨率 | (記入) | 同一条件 |
| 复现的场景与摄像机 | (記入) | 同一条件 |
Frame 的代表值 |
(填写) ms | (填写) ms |
Game / Draw / GPU
|
(記入) | (記入) |
profilegpu 中显眼的传球 |
(記入) | (記入) |
| 画質上的变化 | ― | (記入) |
编辑器回放、着色器编译、缓存状态等会影响结果。如果可能的话,请在目标 PC 上使用 Standalone/打包后的游戏,并对同一场景进行多次测量。VSync 或 FPS 上限也可能导致数值触顶。
总结
当渲染变重时,首先应该做的不是「换成看起来更轻的配置」,而是找出耗资源高的处理。
- 用
stat unit排查是 CPU 还是 GPU 有问题。 - 用
profilegpu检查 GPU 端的高负载路径。 - 逐一切换配置和场景元素,定位原因。
- 在相同条件下重新测量后再采用。
另外,如果原因是 Niagara 的半透明效果,那么另一篇文章中介绍的《如何降低 Niagara 的负载》也可供参考。
参考資料
来源:zenn · 游戏开发社区 · zenn.dev