Unity3D 进阶教程 - 11 Profiler 深度分析

概述

“感觉卡”不能作为优化的依据,必须有数据。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
// 泄漏 1:事件未取消订阅
private void OnEnable() => EventBus.Subscribe<SomeEvent>(Handler);
private void OnDisable() => EventBus.Unsubscribe<SomeEvent>(Handler); // 忘记这行

// 泄漏 2:静态引用
private static List<Texture2D> s_textures = new(); // 永不释放

// 泄漏 3:Resources.Load 未 Unload
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 的内存管理机制。

ByteFisher
分享编程技术 · 记录钓鱼乐趣
扫码关注
▸ 扫码关注 ◂
分享: