端到端 Profiling 工作流与性能基线
按Unity 6官方指南第19—25页复现官方单元 2,建立可测量、可反证、可回归的性能证据。
问题:怎样证明掌握的是官方单元 2,而不是记住几个工具名?
先预测:如果只看到最终帧率或一张截图,不知道设备、构建、场景、输入和采样方式,能否判断修改真的有效?不能。性能结果是测试上下文与程序行为共同产生的,脱离上下文的数字既不能复现,也不能指导下一步。
可靠工作流先冻结设备、构建、场景、画质和输入,再从高层总量下钻到具体标记。每次修改只验证一个假设,并用相同条件重放,避免把温度、后台任务或内容差异当成优化收益。
官方目录边界
本页严格对应Unity Technologies的《Ultimate guide to profiling Unity games (Unity 6 edition)》第19—25页。以下目录项必须在实现、实验或证据中出现:
- From high- to low-level profiling
- Profile early
- Establish a profiling methodology
- Are you within frame budget?
- If your game is in frame budget
- Development Build
- Autoconnect Profiler
本站以中文重新组织解释、代码和实验,不逐字复制原文。API示例以Unity 6思路为准;具体包版本和目标平台能力仍要在项目清单中固定。
核心模型与不可变条件
可靠工作流先冻结设备、构建、场景、画质和输入,再从高层总量下钻到具体标记。每次修改只验证一个假设,并用相同条件重放,避免把温度、后台任务或内容差异当成优化收益。
本单元的不可变条件是:基线与候选必须使用同一目标设备、构建类型、场景检查点、质量设置和输入脚本,且保存原始采样而非只保存截图。 只要输入条件、观测边界或结果合同有一项改变,就不能把两次测量直接相减。先解释变化来源,再决定是否建立新的基线。
五个必须落到证据的术语
它在本单元中不是孤立名词,而要落到“冻结条件 → 预热设备 → 录制基线 → 提出假设 → 单变量修改 → 同输入复验”的数据链,并能由一次保存的采样或状态记录验证。
它在本单元中不是孤立名词,而要落到“冻结条件 → 预热设备 → 录制基线 → 提出假设 → 单变量修改 → 同输入复验”的数据链,并能由一次保存的采样或状态记录验证。
它在本单元中不是孤立名词,而要落到“冻结条件 → 预热设备 → 录制基线 → 提出假设 → 单变量修改 → 同输入复验”的数据链,并能由一次保存的采样或状态记录验证。
它在本单元中不是孤立名词,而要落到“冻结条件 → 预热设备 → 录制基线 → 提出假设 → 单变量修改 → 同输入复验”的数据链,并能由一次保存的采样或状态记录验证。
它在本单元中不是孤立名词,而要落到“冻结条件 → 预热设备 → 录制基线 → 提出假设 → 单变量修改 → 同输入复验”的数据链,并能由一次保存的采样或状态记录验证。
从输入到结论的诊断链
主链为:冻结条件 → 预热设备 → 录制基线 → 提出假设 → 单变量修改 → 同输入复验。每个节点保存构建提交、设备ID、场景检查点、帧号或快照ID、当前预算、实际值和首个异常。下一节点只消费上一节点已验证的事实,不能用“感觉更流畅”跨过中间归因。
1. From high- to low-level profiling
从高层到低层意味着先看帧是否超预算、CPU还是GPU受限、内存是否逼近上限,再进入Timeline、Hierarchy或平台捕获。直接搜索最慢函数会错过真正的系统限制。
复现时把这一项写成“输入条件—观测位置—判断阈值—下一动作”四列记录。输入条件决定数据是否可比,观测位置说明要看哪个线程、模块、对象或平台计数器;阈值来自本项目预算,下一动作必须能指向一次单变量实验。
2. Profile early
尽早分析能在架构和内容规模尚可调整时暴露风险。原型若要求同屏一万个敌人,就应先在最低目标硬件验证,而不是等美术和玩法完成后再补救。
复现时把这一项写成“输入条件—观测位置—判断阈值—下一动作”四列记录。输入条件决定数据是否可比,观测位置说明要看哪个线程、模块、对象或平台计数器;阈值来自本项目预算,下一动作必须能指向一次单变量实验。
3. Establish a profiling methodology
方法记录至少包括设备型号、操作系统、热状态、Unity版本、脚本后端、构建提交、场景、相机路径、画质、目标帧率和采样帧范围。缺一项都可能让差异失去解释力。
复现时把这一项写成“输入条件—观测位置—判断阈值—下一动作”四列记录。输入条件决定数据是否可比,观测位置说明要看哪个线程、模块、对象或平台计数器;阈值来自本项目预算,下一动作必须能指向一次单变量实验。
4. Are you within frame budget?
Development Build便于连接Unity Profiler,但它不是最终发布性能。结论要区分诊断构建用于定位和发布候选用于验收,两者不能直接比较绝对数。
复现时把这一项写成“输入条件—观测位置—判断阈值—下一动作”四列记录。输入条件决定数据是否可比,观测位置说明要看哪个线程、模块、对象或平台计数器;阈值来自本项目预算,下一动作必须能指向一次单变量实验。
5. If your game is in frame budget
Autoconnect Profiler适合快速连线;网络不稳定或多设备并行时应显式选择目标并确认采样来源。文件名和证据记录要包含设备ID,避免把另一台设备的数据混入。
复现时把这一项写成“输入条件—观测位置—判断阈值—下一动作”四列记录。输入条件决定数据是否可比,观测位置说明要看哪个线程、模块、对象或平台计数器;阈值来自本项目预算,下一动作必须能指向一次单变量实验。
6. Development Build
若游戏已在预算内,仍要检查长尾帧、内存余量和热稳态,不必为了更高无意义FPS牺牲开发时间。优化优先级由用户体验、平台认证和余量风险决定。
复现时把这一项写成“输入条件—观测位置—判断阈值—下一动作”四列记录。输入条件决定数据是否可比,观测位置说明要看哪个线程、模块、对象或平台计数器;阈值来自本项目预算,下一动作必须能指向一次单变量实验。
7. Autoconnect Profiler
一次有效修改要写清假设、改动、预计影响指标和反证条件。若主要指标改善但内存、画面或功耗恶化,结论应标记为权衡而不是无条件成功。
复现时把这一项写成“输入条件—观测位置—判断阈值—下一动作”四列记录。输入条件决定数据是否可比,观测位置说明要看哪个线程、模块、对象或平台计数器;阈值来自本项目预算,下一动作必须能指向一次单变量实验。
三步复现与分步观察
可执行实现骨架
下面的代码只承担本单元的数据所有权或测量边界。真正项目应把阈值放入版本化配置,并让证据文件引用同一个配置哈希。
public readonly record struct BenchmarkContext(
string DeviceId, string BuildCommit, string Scene,
string Quality, int TargetFps, int WarmupSeconds);
bool Comparable(BenchmarkContext a, BenchmarkContext b) =>
a.DeviceId == b.DeviceId &&
a.Scene == b.Scene &&
a.Quality == b.Quality &&
a.TargetFps == b.TargetFps;每次采集都保存结构化元数据,避免报告与原始文件失联:
{
"chapter": "prof-02-profiling-workflow",
"officialPages": "第19—25页",
"chain": [
"冻结条件",
"预热设备",
"录制基线",
"提出假设",
"单变量修改",
"同输入复验"
],
"device": "target-low-tier-01",
"build": "commit-and-unity-version",
"scenario": "fixed-checkpoint",
"baseline": "capture-before.data",
"candidate": "capture-after.data",
"normal": true,
"boundary": true,
"failureReplay": true
}自动门输出必须同时保留通过值和拒绝原因,而不是只给一个绿色图标:
PASS context=device+build+scene+quality+input
PASS chain=冻结条件 -> 预热设备 -> 录制基线 -> 提出假设 -> 单变量修改 -> 同输入复验
PASS invariant=基线与候选必须使用同一目标设备、构建类型、场景检查点、质量设置和输入脚本,且保存原始采样而非只保存截图。
REJECT missing-raw-data | changed-context | hidden-quality-loss | unreplayed-failure两个必须主动制造的失败样本
证据矩阵与签发标准
| 维度 | 正常样本 | 边界样本 | 失败样本 | 签发条件 |
|---|---|---|---|---|
| 上下文 | 固定设备与构建 | 最低档或长时间运行 | 故意改变一项条件 | 差异可解释 |
| 主链 | 六节点均有记录 | 预算附近输入 | 在首个节点注入偏差 | 能定位首因 |
| 结果 | 达到性能合同 | 无长尾越界 | 主动制造回归 | 同输入可复验 |
| 副作用 | 画面玩法一致 | 生命周期完整 | 降质或转移成本 | 所有门同时通过 |
练习:把官方单元 2变成可审计交付
小结
- 是否能逐项指出本页覆盖的官方目录项,而没有用通用性能建议替代?
- 是否沿“冻结条件 → 预热设备 → 录制基线 → 提出假设 → 单变量修改 → 同输入复验”保存了可追溯中间证据?
- 是否区分定位工具的干扰与发布构建的真实预算?
- 是否主动制造失败,并在相同输入下证明修复没有转移成本?