有两种方法可以在 Unity 中分析应用程序的内存使用情况:
本页涵盖有关内置 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 视图显示每个帧在整个 Unity 中的实时内存使用量的概况。
Unity 保留了可供分配的内存池,从而避免过于频繁向操作系统索取内存。此部分显示为保留量以及使用量。
此部分涵盖的方面包括:
性能分析器中的值与操作系统任务管理器中显示的值不同,因为 Memory Profiler 不会跟踪系统中的所有内存使用情况。这包括一些驱动程序和插件使用的内存以及用于可执行代码的内存。在支持从操作系统获取应用程序总内存大小的平台上,__Total System Memory Usage__ 大于 0,并且与任务管理器中的大小相同。
性能分析器还列出一些最常见的资源和游戏对象类型的内存统计信息。这些统计信息包括计数(正斜杠之前)和已用内存。在此列表中,__Total Object Count__ 显示应用程序创建的原生游戏对象的总数。如果此数字随时间推移而上升,表示应用程序创建了一些永不销毁的游戏对象。
Detailed 视图用于创建应用程序当前状态的快照。单击 Take Sample 按钮可捕获当前目标的详细内存使用情况。性能分析器获取此数据需要大量时间,因此 Detailed 视图不会提供实时详细信息。在性能分析器获取样本之后,Profiler 窗口会显示一个树视图,您可以在其中更详细地浏览应用程序的内存使用情况。
启用模块详细信息面板顶部的 Gather object references 设置可以收集有关生成快照时哪些项可能引用了对象的信息。此信息显示在窗口的右侧面板中。
在树视图中,使用内存的对象将分为以下类别:
单击 Assets 或 Scene Memory 列表中的对象时,该对象会在 Project 视图或 Scene 视图中突出显示。
注意:在 Other 类别中,System.ExecutableAndDlls 下报告的内存为只读内存。操作系统可能会根据需要丢弃这些页面,然后从文件系统重新加载这些页面。这样可以降低内存使用量,而且通常不会直接导致操作系统决定关闭应用程序(如果应用程序使用过多内存)。此外,其中一些页面也可能与使用相同框架的其他应用程序共享。