跳到主要内容

Unity 内存性能分析器 (Memory Profiler)

这篇笔记整理了 Unity 官方内存分析工具 Memory Profiler 的基础用法: 如何安装、如何抓取快照(Snapshot)、在单帧视图中定位大内存对象, 以及用「两帧对比」来排查内存泄漏和引用异常。

适用场景:项目出现内存持续增长、真机打包后偶发崩溃、或需要梳理资源占用情况时。


一、安装 Memory Profiler

Memory Profiler 以 Package 的形式提供,一般有两种安装方式:

  1. 通过包名添加

    • 打开 Window → Package Manager
    • 选择 Add package by name...
    • 输入包名:com.unity.memoryprofiler,点击确认。
  2. 在 Unity Registry 中搜索

    • 同样在 Package Manager 中,左上角选择 Unity Registry
    • 搜索 Memory Profiler
    • 选中后点击 Install 安装。

安装完成后,菜单中会多出一项 Memory Profiler。


二、打开与抓取快照

菜单路径:Window → Analysis → Memory Profiler

菜单入口:Window → Analysis → Memory Profiler

打开界面后,你可以:

  • 连接 真机 或直接在 Editor 中运行游戏;
  • 点击 Capture 按钮,对当前时刻进行抓帧;
  • 每次抓取会在本地生成一个 *.snap 文件,记录这一帧的内存状态。

本地生成的 Snapshot 文件示例

在 Memory Profiler 窗口中,点击某个 Snapshot,即可进入详细分析界面。


三、单帧分析:查大对象与碎片

单帧分析的典型用途:找出占用异常的资源或对象

1. Tree Map 视图

Tree Map 页签中,可以看到按类别划分的内存占用:

Tree Map 视图:按类型查看内存占用

  • 上方是不同类型(Texture2D、Mesh、AnimationClip、ComputeShader 等)的占用概览;
  • 下方列表按 Size 排序列出具体对象;
  • 可以快速找到「贴图过大」「某个 Mesh 占用异常」等问题。

2. Fragmentation 视图

当你怀疑存在内存碎片或堆分布异常时,可以切到 Fragmentation 页签:

Fragmentation 视图:查看地址空间分布

  • 不同颜色表示不同类型的内存区域(托管堆、原生内存、保留区等);
  • 点击某一块区域,下方会显示这段地址空间的详细信息;
  • 方便你判断是否存在大量未释放的小块内存,或某类分配异常。

四、两帧对比:排查内存泄漏

Memory Profiler 中的 Compare Snapshots 功能适合用来查内存泄漏。

常见做法:

  1. 在「正常状态」下抓一帧 Snapshot A;
  2. 运行一段时间或执行某个操作(如多次加载场景)后,抓一帧 Snapshot B;
  3. 在 Memory Profiler 中勾选这两个 Snapshot,点击 Compare Snapshots

1. Summary 页签

在 Summary 汇总页,可以整体对比两帧:

Summary 页签:对比分配总览

  • 查看总内存、托管堆、贴图、Mesh 等模块是否出现异常增长;
  • 对比 A、B 两帧之间的差值,锁定问题大类。

2. Objects and Allocations 页签

更细节的排查在 Objects and Allocations 页签进行:

引用链示例:Referenced By / References To

引用链示例:查看对象与资源的关系

常用筛选方式:

  • 将筛选模式切成 Diff,再设置为 Match → New,只看「新出现」的对象;
  • Size 排序,优先关注体积较大的条目;
  • 通过 TypeName 初步判断可能的问题对象;
  • 打开 Referenced By / References To 面板,沿引用链查是谁在持有这些对象。

这样可以比较系统地定位:

  • 没有被释放的 GameObjectTextureMesh
  • 某些静态字典、单例或事件注册导致的「意外引用」。

五、小结:Memory Profiler 能帮你做什么?

Memory Profiler 是一款非常实用的内存分析工具,尤其适合:

  • 排查资源问题
    找出贴图、模型、音频等大体积资源,判断是否需要压缩、降分辨率或拆分。

  • 定位内存泄漏
    利用两帧对比,发现运行一段时间后才出现、且不会回收的对象。

  • 分析引用关系
    通过引用链视图(Referenced By / References To),弄清楚「为什么这个东西一直在内存里」。

在 Unity 项目的性能优化工作中, 学会使用 Memory Profiler 是非常关键的一步:只有看得见问题,才谈得上优化。


版权声明:本文最初发布于 CSDN「uniGame」,遵循 CC 4.0 BY-SA 协议,转载请附上原文链接及本声明。
原文链接:https://blog.csdn.net/alla_Candy/article/details/133272285