UE5 性能分析
UE5 Profiling
UE5 性能分析的基本流程是:先用 stat unit 判断瓶颈在游戏线程、渲染线程还是 GPU,再用对应的 stat 组、profilegpu/GPU 统计或 Unreal Insights 的 Timing/Memory 等视图向下钻取;渲染特性(RDG、VSM、TSR)各自提供作用域和可视化。测量时要避开会扭曲数据的设置(调试构建、异步计算、可视化模式)。
第一步:定位瓶颈线程
stat unit 显示 Frame、Game、Draw、GPU、RHIT、DynRes。游戏线程和渲染(Draw)线程在一帧结束前会同步,所以 Frame 往往接近其中之一:Frame≈Game 说明受游戏线程限制,Frame≈Draw 说明受渲染线程限制;GPU 时间与帧同步,可能接近 Frame。应在非调试构建中测量。(Stat Commands) 图形编程概览补充:"GPU 时间包含空闲时间,只有当它最长且独立突出时才是瓶颈"。(Graphics Programming Overview)
下图是据此整理的排查流程:
flowchart TB
A[stat unit] --> B{"Frame 最接近?"}
B -- Game --> G["stat game / TickGroups / Dumpticks<br/>Insights 看游戏线程轨道"]
B -- Draw --> D["stat InitViews / SceneRendering<br/>可见元素数、绘制调用"]
B -- GPU --> P["stat gpu / profilegpu<br/>RDG 作用域、特性可视化"]
G --> I["Unreal Insights 深入"]
D --> I
P --> I这与 渲染瓶颈定位与性能度量 的方法一致:先找出最慢的阶段,再在该阶段内二分定位;三条线程的流水线背景见 UE5 渲染架构 与 多线程渲染与任务系统,目标预算见 帧时间预算与渲染性能。
常用 stat 命令
在 PIE 控制台输入 stat <名称>:(Stat Commands)
| 命令 | 用途 |
|---|---|
Unit / UnitGraph | 帧、游戏、渲染、GPU、RHI 线程时间(及曲线) |
FPS | 帧率 |
Game、TickGroups、Tickables、Dumpticks | Gameplay Tick 耗时、Tick 组统计、导出 Tick 函数信息(Tick 机制见 委托与 Tick 机制) |
InitViews | 可见性剔除耗时与效果;"可见区段数是影响渲染线程性能最重要的单一指标" |
SceneRendering | 通用渲染统计,查找渲染慢点的好起点 |
LightRendering、ShadowRendering | 光照与阴影耗时 |
GPU | 本帧 GPU 统计 |
RHI | RHI 内存与性能统计 |
GC | 垃圾回收统计(见 垃圾回收与对象生命周期) |
Memory、LLM | 各子系统内存、低级内存追踪 |
Streaming、AsyncLoad、Levels | 纹理流送、异步加载、关卡流送状态 |
Hitches / DumpHitches | 超过 t.HitchFrameTimeThreshold 的卡顿写入日志 |
StartFile / StopFile | 采集 .uestats 文件供 Session Frontend 分析;务必 StopFile,否则会持续写盘 |
InitViews 的那条说明对应 绘制调用与状态切换优化:渲染线程的成本主要随可见网格元素数(绘制调用数)增长。(Stat Commands)
Shader Complexity 与材质指令热度
视口模式 Shader Complexity(快捷键 Alt+8,控制台 viewmode shadercomplexity)按估算的着色器指令数给每个像素上色,用来看底场景是否友好,以及粒子短时大量 overdraw 造成的尖峰。(Shader Complexity (from Viewport Modes))
| 颜色大致含义 | 说明 |
|---|---|
| 绿 → 红 | 近似线性:很便宜 → 贵 |
| 粉 / 白 | 相对红再跳一档:非常贵;小块白可接受,大面积亮红/白则帧率差 |
官方 caveat:只看指令数——同样 16 条,全是纹理采样通常比全是算术更慢;未展开的循环(尤其顶点着色器)也反映不准;但对绝大多数情况仍是有用指标。颜色表 +ShaderComplexityColors 在 BaseEngine.ini;MaxPixelShaderAdditiveComplexityCount 默认 2000(可在项目 DefaultEngine.ini 覆盖),ES3 预览默认 800。(Shader Complexity (from Viewport Modes))
与材质轨的关系:Custom 材质表达式 会阻止常量折叠、容易推高指令数;改完 Custom 或复杂节点图后应用此视图对照。翻译与折叠机制见 材质图到 HLSL 的翻译。同页还有 Light Complexity、Buffer Visualization(Base Color / Metallic / Roughness / World Normal 等)便于拆材质输入。(Shader Complexity (from Viewport Modes))
GPU 分析
profilegpu(Ctrl+Shift+;)测量当前视图的 GPU 计时,结果显示在弹出界面或日志中;可以按绘制事件名在代码中搜索对应实现。(Graphics Programming Overview)- RDG 提供作用域:
RDG_EVENT_SCOPE(RenderDoc、RDG Insights 等外部工具可见)、RDG_GPU_STAT_SCOPE(进入stat gpu)、RDG_CSV_STAT_EXCLUSIVE_SCOPE(CSV 分析器);自研渲染特性应加上它们。(Render Dependency Graph) - 异步计算会让分通道 GPU 计时不可靠:VSM 文档建议分析时用
r.RDG.AsyncCompute 0,但绝不能在发行版中关闭;并提醒stat gpu等统计在 CPU 瓶颈时可能不可靠。(Virtual Shadow Maps) vis/VisualizeTexture 查看渲染目标;DumpGPU 把多帧中间资源转储到磁盘,适合分析 TSR 等跨帧问题。(Graphics Programming Overview)、(Temporal Super Resolution)- 特性自带统计:VSM 页统计(
r.ShaderPrintEnable 1+r.Shadow.Virtual.Stats 1)、stat tsr。分析前要关掉可视化模式,它们本身有可测量的开销。(Virtual Shadow Maps)、(Temporal Super Resolution)
关于 GPU 侧的占用率、调度等底层原因,见 GPU 计算调度与占用率。
GPU Visualizer 与 GPU 崩溃排查(UE 5.0 资料):ProfileGPU(或 Ctrl+Shift+逗号)打开 GPU Visualizer,显示一帧快照中每个渲染通道的耗时;因为是快照,每次改场景后要重新抓。GPU 崩溃(D3D 设备丢失、DXGI_ERROR_DEVICE_HUNG)时 CPU 调用栈不指向真正原因,应分别用 -gpucrashdebugging 或 -d3ddebug 启动(不要同时用);常见原因有显存耗尽、TDR 超时(Windows 默认 2 秒)、引擎/驱动/系统 bug。排查引擎 bug 可用 -onethread -forcerhibypass、r.RDG.Debug=1、r.RDG.ImmediateMode=1(调用栈更有意义,但会改变行为,可能误导),切换 DX11/DX12,逐个开关 Lumen、Nanite、光追等特性。光追 GI/反射可用 r.RayTracing.*.RenderTileSize 分块提交以避免 TDR。(Performance, Profiling and Debugging — GPU Visualizer (Epic course, Michael Muir, Staff),Epic 员工课程,标注 UE 5.0)
注:UE 5.8 和 4.27 的 GPU Profiling 文档页都重定向到首页,未能抓取。上面资料基于 UE 5.0,5.6 起 GPU 分析器的界面和输出有变化(社区资料提到,未经官方文档核实),以当前版本实际输出为准。
Unreal Insights
Unreal Insights 是"能以高数据率捕获项目事件的遥测采集与分析套件",由三部分组成:埋点的跟踪事件 (Trace Events)、在后台记录并保存跟踪的 Unreal Trace Server(监听 1981 端口,单实例、对性能影响很小)、负责分析与可视化的 Unreal Insights 界面。跟踪文件为 .utrace,自描述、跨引擎版本兼容;支持实时连接正在运行的游戏或编辑器。(Unreal Insights)
flowchart LR
G["游戏/编辑器进程<br/>Trace 埋点"] -->|TCP 1981| S[Unreal Trace Server<br/>Recorder + Store]
S --> F[(".utrace 文件")]
F --> U["Unreal Insights 界面"]
S -->|Live| U主要分析视图:(Unreal Insights)
| 视图 | 用途 |
|---|---|
| Timing Insights | CPU 与 GPU 轨道、帧面板、计时器与计数器、调用者/被调用者 |
| Memory Insights | 追踪每次分配/重分配/释放并重建内存使用,带调用栈 |
| Networking Insights | 网络流量分析与调试 |
| Slate Insights | UI(Slate/UMG)更新的根因 |
| Asset Loading Insights | 资产加载耗时、包加载顺序、异步加载优先级是否被遵守 |
| Cooking / Audio Insights | 烘焙耗时;运行时音频 |
渲染相关的跟踪通道:RDG Insights 用 -trace=rdg,defaults 采集,可查看资源生命周期、异步计算重叠、被剔除的通道、瞬态内存布局(数据量很大);VSM 用 trace.enable counters,vsm 在 Counters 页查看高级统计。(Render Dependency Graph)、(Virtual Shadow Maps)
取舍与常见坑
- stat 命令即开即看,适合粗定位;Insights 有完整时间线和调用栈,适合定位卡顿 (Hitch) 和跨线程等待,但需要采集和离线分析。
- 在调试构建、编辑器视口、开着可视化模式时测得的数据都会失真;结论应在接近发行配置的构建上复核。(Stat Commands)、(Virtual Shadow Maps)
- 时间性特性(TSR)的画质与帧率挂钩,CPU 瓶颈也会降低画质,所以"GPU 不忙"不等于"画面没问题"(见 TSR 与抗锯齿方案)。(Temporal Super Resolution)
出处
- Stat Commands UE 5.8 文档
- Unreal Insights UE 5.8 文档
- Graphics Programming Overview UE 5.8 文档
- Render Dependency Graph UE 5.8 文档
- Virtual Shadow Maps UE 5.8 文档
- Temporal Super Resolution UE 5.8 文档
- Performance, Profiling and Debugging — GPU Visualizer (Epic course, Michael Muir, Staff) Epic 员工课程,UE 5.0
- Shader Complexity (from Viewport Modes) UE 5.8 Viewport Modes