Version: 2020.1
GPU Usage Profiler 模块
Physics Profiler 模块

Memory Profiler 模块

有两种方法可以在 Unity 中分析应用程序的内存使用情况:

  • Memory Profiler 模块:这是 Profiler 窗口中的内置模块,可提供有关应用程序在哪些方面使用了内存的基本信息。
  • Memory Profiler 包:这是可以添加到项目中的一个单独的包。这个包会向 Unity Editor 添加一个额外的 Memory Profiler 窗口,然后您可以使用该窗口来更详细地分析应用程序中的内存使用情况。可以存储和比较快照以便更轻松地查出内存泄漏,或者查看内存布局以查出内存碎片问题。

本页涵盖有关内置 Memory Profiler 模块的信息。有关 Memory Profiler 包的更多信息,请参阅 Memory Profiler 文档

Memory Profiler 模块中会显示一些代表应用程序中分配的总内存的计数器。可以使用 Memory 模块来查看信息,例如已加载对象的数量以及每个类别占用的总内存。还可以查看每个性能分析器帧的 GC 分配数。

在 Editor 中对应用程序进行性能分析时,Memory 模块中的信息指示 Editor 中的内存使用量。这些数字通常大于在发布平台上运行时的数字,因为运行 Unity Editor 会使用占用内存的特定对象,而 Editor 窗口本身会使用额外的内存。另外,性能分析器会显示其使用的内存,因为 Unity 无法将其与运行模式播放器使用的内存完全分开。

有关应用程序的更精确数字和内存使用情况,请通过 Attach to Player 菜单将性能分析器连接到运行的播放器。这样就可以查看目标设备上的实际使用情况。

图表类别

Memory 模块分为六个图表,这些图表显示有关应用程序在哪些方面花费了内存的详细信息。可以更改图表中类别的顺序;为此,请在图表的图例中拖放这些类别。还可以单击某个类别的有色图例以切换是否显示。

类别 描述
Total Allocated 应用程序已使用的内存总量
Texture Memory 应用程序中的纹理已使用的内存量
Mesh Memory 应用程序中的网格已使用的内存量
Material Count 应用程序中的材质实例数量
Object Count 应用程序中的原生对象实例数量
Total GC Allocated GC 堆使用的内存量。
GC Allocated GC 堆中每帧分配的内存量

模块详细信息面板

位于 Profiler 窗口底部的模块详细信息面板中有两个视图:__Simple__ 和 Detailed。要更改视图,请从模块详细信息面板左上角的下拉列表中选择相应的视图。

Simple 视图

Simple 视图显示每个帧在整个 Unity 中的实时内存使用量的概况。

Unity 保留了可供分配的内存池,从而避免过于频繁向操作系统索取内存。此部分显示为保留量以及使用量。

Memory 模块 Simple 视图
Memory 模块 Simple 视图

此部分涵盖的方面包括:

  • Total:以下所有区域的累计值
  • Unity:Unity 原生代码中由原生内存管理器系统跟踪并根据类型、来源和平台特有的分配模式在内存池中分配的内存分配量。
  • Mono:托管代码使用的总堆大小和已用堆大小。此内存量是垃圾收集量。
  • GfxDriver:驱动程序对纹理、渲染目标、着色器和网格数据使用的估计内存量。
  • Audio:音频系统的估计内存使用量
  • Video:视频系统的估计内存使用量
  • Profiler:性能分析器使用的总内存

性能分析器中的值与操作系统任务管理器中显示的值不同,因为 Memory Profiler 不会跟踪系统中的所有内存使用情况。这包括一些驱动程序和插件使用的内存以及用于可执行代码的内存。在支持从操作系统获取应用程序总内存大小的平台上,__Total System Memory Usage__ 大于 0,并且与任务管理器中的大小相同。

性能分析器还列出一些最常见的资源和游戏对象类型的内存统计信息。这些统计信息包括计数(正斜杠之前)和已用内存。在此列表中,__Total Object Count__ 显示应用程序创建的原生游戏对象的总数。如果此数字随时间推移而上升,表示应用程序创建了一些永不销毁的游戏对象。

Detailed 视图

Detailed 视图用于创建应用程序当前状态的快照。单击 Take Sample 按钮可捕获当前目标的详细内存使用情况。性能分析器获取此数据需要大量时间,因此 Detailed 视图不会提供实时详细信息。在性能分析器获取样本之后,Profiler 窗口会显示一个树视图,您可以在其中更详细地浏览应用程序的内存使用情况。

Memory 模块 Detailed 视图
Memory 模块 Detailed 视图

启用模块详细信息面板顶部的 Gather object references 设置可以收集有关生成快照时哪些项可能引用了对象的信息。此信息显示在窗口的右侧面板中。

在树视图中,使用内存的对象将分为以下类别:

  • Other:资源、游戏对象或组件以外的对象。在此处可以找到诸如 Unity 用于不同系统的内存之类的信息。
  • Not Saved:标记为 DontSave 的对象
  • Builtin Resources:Unity Editor 资源或 Unity 默认资源,例如已添加到 Graphics 设置的 Always Included Shaders 列表中的着色器。
  • Assets:从用户或原生代码引用的资源
  • Scene Memory:对象和附加的组件

单击 Assets 或 Scene Memory 列表中的对象时,该对象会在 Project 视图或 Scene 视图中突出显示。

注意:Other 类别中,System.ExecutableAndDlls 下报告的内存为只读内存。操作系统可能会根据需要丢弃这些页面,然后从文件系统重新加载这些页面。这样可以降低内存使用量,而且通常不会直接导致操作系统决定关闭应用程序(如果应用程序使用过多内存)。此外,其中一些页面也可能与使用相同框架的其他应用程序共享。

GPU Usage Profiler 模块
Physics Profiler 模块