概述
“感觉卡”不能作为优化的依据,必须有数据。Unity Profiler 是性能分析的官方工具,能精确测量 CPU/GPU/内存/渲染/物理各模块的耗时。
入门系列第 19 篇简单提到了 Profiler 窗口的基础打开。本篇深入到 Profiler 的详细解读、自定义性能标记、采集与分析技巧。
1. Profiler 窗口布局
Window -> Analysis -> Profiler:
| 面板 |
功能 |
| CPU Usage |
各系统耗时 |
| GPU Usage |
GPU 渲染耗时 |
| Rendering |
渲染统计数据 |
| Memory |
内存快照 |
| Physics |
物理引擎 |
| UI |
UI 系统 |
1.1 关键时间指标
1 2
| 1000ms / 30fps = 33.3ms(每帧预算) 1000ms / 60fps = 16.6ms(每帧预算)
|
- 帧预算超过限制就是卡顿的来源
- GC.Collect 触发 -> 检查是否过度 GC Alloc
2. CPU Profiler 解读
2.1 层次分析
1 2 3 4 5
| PlayerLoop(11.2ms) ├── Update.ScriptRunBehaviourUpdate(3.5ms) ├── Physics.Simulate(2.1ms) ├── Rendering(4.0ms) └── GC.Collect(15.3ms)<- 卡顿元凶
|
2.2 关键参数
| 参数 |
含义 |
| Total(总耗时) |
函数及其子调用的总时间 |
| Self(自身耗时) |
函数自身的时间(不含子调用) |
| GC Alloc |
函数的 GC 分配量 |
3. 自定义性能标记
使用 ProfilerMarker 对关键代码段打标记:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| using UnityEngine.Profiling;
public class WeaponSystem : MonoBehaviour { private static readonly ProfilerMarker s_attackMarker = new("WeaponSystem.Attack");
public void Attack() { s_attackMarker.Begin(); try { CalculateDamage(); SpawnBullet(); PlaySound(); } finally { s_attackMarker.End(); } } }
|
4. Memory Profiler
Unity 的 Memory Profiler 支持快照对比:
1 2 3 4 5
| Window -> Analysis -> Memory Profiler 1. 点击 Take Snapshot(正常状态) 2. 进行一些操作(打开 UI、加载场景) 3. 点击 Take Snapshot(对比状态) 4. 点击 Compare -> 选择两个快照
|
4.1 常见内存泄漏类型
1 2 3 4 5 6 7 8 9 10
| private void OnEnable() => EventBus.Subscribe<SomeEvent>(Handler); private void OnDisable() => EventBus.Unsubscribe<SomeEvent>(Handler);
private static List<Texture2D> s_textures = new();
tex = Resources.Load<Texture2D>("Textures/Icon"); Resources.UnloadAsset(tex);
|
5. 真机 Profiling
编辑器下的 Profiler 数据不完全准确(编辑器自身有开销),必须真机测试。
Android 连接
1 2 3
| 1. 打开开发者选项 -> USB 调试 2. 连接 USB 线 3. Unity Profiler -> 选择设备
|
6. 优化流程
1 2 3 4 5 6
| 1. 设定目标 -> 目标帧率 / 内存上限 2. Profiler 采集 -> 真机运行,采集典型游戏流程的数据 3. 识别瓶颈 -> 哪个模块耗时最多? 4. 定位代码 -> 自定义标记 -> 找到具体函数 5. 优化 -> 修改代码 / 资源 / 配置 6. 验证 -> 再次 Profiler 确认改善效果
|
总结
- Profiler 是性能优化的罗盘——没有数据就没有方向
- 自定义 ProfilerMarker 让自定义代码段可追踪
- Memory Profiler 快照对比 准确定位内存泄漏
- 必须真机 Profiling,编辑器数据仅供参考
下一篇将讲解 内存优化与 GC 调优,从底层理解 Unity 的内存管理机制。