CPU 剖析
自动关联目录:CPU 剖析
1. 定位
CPU 侧的成本分在两条线程上:游戏线程(Game)与渲染线程(Draw)。stat unit 把它们分开显示,所以排查的第一步永远是分清是哪一条。
一句话定位:Game 高 = 你的逻辑/动画/物理;Draw 高 = 剔除与命令生成。两者的优化手段完全不同。
详见 管线与渲染线程。
2. 快速分层
| 命令 | 看什么 |
|---|---|
stat unit | Game / Draw / GPU / RHIT 四项时间 |
stat unitgraph | 同上,图形化(看抖动比数字直观) |
stat game | 游戏线程细分 |
stat sceneupdate | 场景更新(剔除、变换推送) |
stat scenerendering | 场景渲染各阶段 |
stat anim | 动画(见 动画性能) |
stat ai / EQS / 感知 | AI 相关(见 AI 调试与性能) |
stat physics | 物理(见 碰撞与查询) |
stat streaming | 流式加载(见 资源加载) |
stat rhi | draw call、三角形、RT 数量 |
3. Game 线程高的常见原因
| 原因 | 定位 |
|---|---|
| Tick 过多 / 过重 | stat game;检查 bCanEverTick(见 Actor 生命周期) |
| 动画 | stat anim(见 动画性能) |
| AI | stat ai;感知与行为树 |
| 物理 | stat physics |
| 蓝图逻辑 | Insights 里的蓝图耗时 |
| UI | Slate/UMG 重建(见 UI 分支) |
| GC | stat gc(见 GC 与对象生命周期) |
| 加载 | stat streaming |
4. Draw 线程高的常见原因
| 原因 | 定位 |
|---|---|
| 可见性剔除 | stat sceneupdate |
| 大量动态物体 | 每帧重建 Scene Proxy(MarkRenderStateDirty,见 管线与渲染线程) |
| draw call 过多 | stat rhi |
| 代理创建被 PSO 阻塞 | 见 PSO 预缓存 |
5. 工具
| 工具 | 用途 |
|---|---|
| Unreal Insights | 首选:CPU 时序、线程、任务,支持自定义打点 |
stat 系列 | 快速分层 |
| 平台工具 | Windows: PIX / VTune;Android: Simpleperf、Android Studio;iOS: Xcode Instruments |
| 项目实测手册 | UE性能优化工具 的 CPU 章节(Unreal Insight / Unreal Profiler / Simpleperf / Android Studio / Perfetto / CacheSim / Arm Streamline / XCode Timeprofiler + 案例) |
Unreal Insights 是 UE 侧的第一工具:它能看到任务级、线程级的真实耗时,而 stat 只是聚合值。
Insights 用法要点
- 加 channel 抓取(如
trace.enable counters,vsm看 VSM 统计) - 自定义打点:
TRACE_CPUPROFILER_EVENT_SCOPE - 看阻塞栈——"时间花在哪"和"为什么在等"是两个问题
6. 代价与权衡
| 手段 | 收益 | 代价 | 注意 |
|---|---|---|---|
stat unit | 零成本、立刻分层 | 只到线程粒度 | 必须先做 |
| Unreal Insights | 精确到任务 | 抓取有开销、数据量大 | 正式分析用 |
| 平台工具(VTune/Simpleperf) | 精确到函数与调用栈 | 学习成本 | 深入某一段时用 |
| 逐项关闭对比 | 定位直接 | 需要能开关 | 最常用的土办法 |
7. 踩坑与排查
| 坑 | 现象 | 怎么验证 |
|---|---|---|
| 用 GPU 思路优化 Game 线程 | 白费力气 | stat unit 先分清 |
只看 stat 聚合值 | 找不到具体函数 | 用 Insights |
| 在编辑器测 | 与打包差异大 | 测打包版本 |
| 忘了 GC 尖峰 | 周期性卡顿 | stat gc(见 GC 篇) |
| 大量 Tick | Game 高 | 关掉不需要的 Tick |
| 代理频繁重建 | Draw 高 | 检查 MarkRenderStateDirty 调用频率 |
| PSO 未就绪阻塞 | Draw 高 | 见 PSO 篇 |
| 开发机核心多 | 掩盖问题 | -corelimit=8 |
8. 排查顺序
1. stat unit → Game / Draw / GPU
2. Game 高 → stat game → anim/ai/physics/蓝图/UI/GC 逐项关掉对比
3. Draw 高 → stat sceneupdate + stat rhi → 剔除 / draw call / 代理重建 / PSO
4. 仍不清楚 → Unreal Insights 看阻塞栈与任务耗时
5. 需要函数级 → 平台工具(Simpleperf / VTune / Xcode)参考
许可协议:CC BY
作者:Davids
本文链接:https://hustjjd.github.io/334e1c78.html
更新于:2026年10月10日