5.4 性能预算复盘:三线程账本与优化记录
核心结论
性能优化在独立项目里最后拼的既不是技术也不是时间,而是纪律:有没有账本(预算)、有没有基线(测量)、有没有记录(回归)。这一篇把全项目(含网络)的性能工作收口,并与本系列性能那本书的方法论对接(stat 命令速查 https://www.wanxiangyundang.top/read/unreal-engine-5-8-docs/stat-commands-in-unreal-engine-f66a,带宽 https://www.wanxiangyundang.top/read/unreal-engine-5-8-docs/performance-and-bandwidth-tips-d100)。
三线程账本(60 帧目标,PC 中端配置)
| 线程 | 预算 | 实际(M4 末) | 状态 |
|---|---|---|---|
| 游戏线程 | 8ms | 7.2 | OK |
| 渲染线程 | 8ms | 9.1 | 紧张(粒子) |
| 网络(DS) | 3ms | 1.8 | OK |
| GPU | 8ms | 8.6 | 紧张(半透明) |
账本的价值:一旦某线程红字,对应系统的人就要来答辩(0301 的流程)。这把"全员的性能问题"变成"某个系统的性能问题"。
优化记录(我做过的,按性价比排序)
| # | 优化 | 帧时间收益 | 成本 |
|---|---|---|---|
| 1 | Niagara 半透明排序降级 + 同屏上限 | -2.1ms | 半天 |
| 2 | 远处怪休眠(Dormancy) | -1.4ms | 一天 |
| 3 | UMG 事件驱动(去 Tick) | -0.8ms | 一天 |
| 4 | NetUpdateFrequency 分级 | -0.6ms(+流量降 3x) | 两小时 |
| 5 | 蓝图热点函数转 C++ | -0.5ms | 两天 |
| 6 | 减少 TickActor(合并组件 Tick) | -0.4ms | 一天 |
| 7 | 阴影级联裁远 | -0.9ms(GPU) | 一小时 |
规律:粒子/休眠/网络分级前三名都是配置工作,几乎不用碰代码。先做配置类优化,再考虑代码优化——这个顺序让性能工作变成"周末工程"而不是"季度工程"。
性能回归的保护
| 机制 | 做法 |
|---|---|
| 基线关卡 | 一张"压力关卡"(满怪+全技能+4 人联机) |
| 自动对比 | 每次里程碑跑一次,记录三线程到 wiki 表 |
| 上限报警 | 渲染线程 > 9ms 就禁止合入该功能(软规则+团队共识) |
| DevTools | 编辑期一键开 stat dump(作弊插件里) |
网络性能的复盘要点
| 指标 | 目标 | 我的项目 |
|---|---|---|
| 上行带宽/人 | < 16KB/s | 8KB/s |
| RPC 丢失可见性 | 不可见 | GC 兜底 |
| 4 人 DS CPU | < 20% 一核 | 12% |
| 断线率/局 | < 5% | 3.2% |
网络性能的要点:与帧率不同,网络性能的瓶颈是带宽与 RPC 次数,优化手段全在 0502 的分层里。
常见坑与解法
坑 1:本地测 60 帧,玩家机器 40 帧
原因:开发机配置>>玩家。
解法:找一台"目标配置"的机器做固定基线机;把它当成 CI。
坑 2:优化完不知道哪条起了作用
原因:一次改 N 项。
解法:每次只改一项并记录(上表就是这么来的)。性能的归因比性能本身重要。
坑 3:加功能后帧率悄悄掉回去
解法:里程碑回归(上表机制);性能保护写进 Definition of Done:新功能的 PR 必须附 stat 截图。
相关节点速查
- stat 速查:https://www.wanxiangyundang.top/read/unreal-engine-5-8-docs/stat-commands-in-unreal-engine-f66a
- 网络带宽:https://www.wanxiangyundang.top/read/unreal-engine-5-8-docs/performance-and-bandwidth-tips-d100
- 详细 profile:Unreal Insights
与全系列的书单
本篇假设你读过本系列的性能优化那本书(预算、stat、常见瓶颈);如果没读,先去读那本的"预算与工具"两章,再回来看这篇的复盘视角——方法论在那是通用的,这里讲的是落地记录。
心得:性能账本最魔幻的地方是——它把团队里"感觉派"和"数字派"统一了。开账本会议时没人能说"我感觉应该没问题",因为墙上写着 9.1ms。工程师文化就是这样一点一点立起来的。
