帧时间的形状:从曲线读出问题类型
帧时间图不是杂乱无章的。常见的性能问题有典型的"形状",学会认形状,能跳过很多分析步骤。
五种典型形状
| 形状 | 特征 | 典型原因 |
|---|---|---|
| 平线 + 偶发尖峰 | 平时 16ms,突然 80ms | 加载(流式加载 / 纹理流送)、GC、自动保存 |
| 周期性尖峰 | 每隔 N 秒规则地卡 | 定期任务(缓存刷新、检查点保存、AI 重规划) |
| 整体抬高 | 平均 20ms 无尖峰 | 均匀负载过重(Tick 太多、DrawCall 太多) |
| 随时间爬升 | 越玩越慢 | 内存泄漏 / 缓存膨胀 / 碎片 |
| 场景相关波动 | 换个地方就卡 | 特定关卡的特定系统(大数据量关卡 / 特效密集区) |
对应的排查方向
| 形状 | 下一步 |
|---|---|
| 偶发尖峰 | Insights 里找尖峰帧,看是不是资源加载(同步加载的残余) |
| 周期性尖峰 | 找定时器与"每 N 秒"的任务;GC 调优(stat gc) |
| 整体抬高 | 按系统分解(stat 各项),找最大项做常规优化 |
| 爬升 | 内存 / 对象计数监控,找泄漏(第 3 章内存节) |
| 场景相关 | 针对该场景做专项 profile(Stat + Insights 定点捕捉) |
一个识别形状的实战
测试报"玩半小时后变卡"。把帧率曲线拉出来:前 20 分钟平稳,之后缓慢爬升。形状 → "随时间爬升" → 查对象数量:stat objectcount 或者 Insights Memory → 发现某个对象池只进不出,修正后曲线恢复平直。
这就是"形状思维"的价值:五分钟看图,省掉一小时盲目搜索。
