前言:Unity Memory Profiler主要用来查看托管内存和本机内存的详细分配情况。它通过捕获、检查、比对内存快照的方式来检测内存泄漏和内存碎片。本篇文章中使用的版本是0.2.10版本。
打开偏好设置:点击【Preferences -> Analysis -> MemoryProfiler】菜单项来打开偏好设置。如下图所示: 其中,常用的参数设置如下所示: 1.Memory Snapshot Storage Path:设置保存内存快照文件的相对路径(必须以./或者…/开头)。当路径非法时就会弹出错误提示,如下图所示: 2.Reset Opt-Out settings for dialog prompts:重置拍摄内存快照的提示框。该提示框内容如下图所示: 打开Unity Memory Profiler窗口:点击【Window > Analysis > Memory Profiler】菜单项来打开窗口。如下图所示: 工具栏区域:如下图所示: 其中,常用的控件如下所示: 1.Attach To Player:用来设置捕获目标。该捕获目标可以是Unity Editor,也可以是运行在指定IP设备上的Development Build环境应用程序。如下图所示: 2.Capture:用来对捕获目标中指定的内存对象(托管堆对象-Managed Objects、本机堆对象-Native Objects、本机分配-Native Allocations)进行拍摄内存快照。当开始拍摄内存快照时,就会暂时冻结住捕获目标,具体冻结时间取决于应用程序的复杂性和内存的分配情况。当结束拍摄内存快照时,就会将内存快照显示到工作台区域。如下图所示: 3.Import:将内存快照文件导入到工作台区域。如下图所示: 除了上述导入方式之外,还可以采用工程目录导入方式,核心步骤为:首先在Unity工程目录下创建一个名称为MemoryCaptures的目录;然后将内存快照文件复制到MemoryCaptures目录中;最后打开Unity Memory Profile窗口,此时在工作台区域中就会同步显示MemoryCaptures目录下所有的内存快照文件。 4.View:设置查看内存快照的视图类型(树形视图-Tree Map、内存视图-Memory Map、差异内存视图-Memory Map Diff、表格视图-Table),如下图所示: 5.View history:使用箭头按钮在打开的历史视图之间来回切换。如下图所示: 6.Row Size:当View设置为[差异]内存视图类型时,此控件用来设置每行虚拟地址空间大小。如下图所示: 7.Display Filters:当View设置为[差异]内存视图类型时,此控件用来设置显示的数据类型([差异]本机分配对象-Allocations[Diff]、托管堆中的[差异]托管对象-ManagedObjects[Diff]、本地区域中的[差异]本地对象-NativeObjects[Diff]、虚拟内存区域中的保留地址空间-VirtualMemory、区域差异对象-RegionDiff)。如下图所示: 8.Color Scheme:当View设置为差异内存视图类型时,此控件用来设置虚拟内存的配色方案(常规配色-Normal、突出新分配内存配色-Allocated、突出释放内存配色-Deallocated)。如下图所示: 工作台区域:既可以显示所有的内存快照;又可以差异比对内存快照。如下图所示: 其中,该区域包含内容如下所示: 1.内存快照条目:包含屏幕截图、目标平台、名称、文件操作按钮、日期时间、开关按钮。如下图所示: 1.1.屏幕截图:当捕获目标为Unity Editor时,屏幕截图就为空。当捕获目标为Development Build环境应用程序时,屏幕截图就为捕获时的图片。 1.2.目标平台:显示项目工程对应平台(Mac、Windows、Linux、Android、iOS、WebGL等)的图标。 1.3.名称:显示内存快照的名称(默认为Snapshot-UTC时间前五位)。当鼠标停留在名称上时,就会弹出内存快照存储的绝对路径。 1.4.文件操作按钮:主要包含对内存文件进行删除、重命名、定位。当打开了内存文件时,不能进行删除和重命名内存文件。 1.5.日期时间:拍照时以UTC时间来存储内存快照文件,但是在显示时,就会自动转换成本机时间。当鼠标停留在日期时间上时,就会弹出内存快照来自于哪个项目工程。 1.6.开关按钮:用来在主视图区域中打开或者关闭内存快照。 2.已打开内存快照面板:包含打开的内存快照以及对两个打开的内存快照进行差异比对。如下图所示: 2.1.Swap按钮:用来交换打开内存快照的放置位置。默认情况下,新打开的内存快照会放置在左侧,最近旧的内存快照会放置在右侧。 2.2.Diff按钮:对两个打开的内存快照进行差异比对。此时Unity Memory Profiler首先会花费一些时间来生成差异数据;然后在主视图区域以Diff视图样式来显示差异数据。当主动关闭某一个打开的内存快照或者选择某一个打开的内存快照或者打开一个新的内存快照时,Unity Memory Profiler就会卸载差异数据,并在主视图区域以指定的视图样式来显示当前选择的内存快照的深度内存数据。
主视图区域:显示内存快照的深度内存数据。如下图所示: 其中,该区域包含内容如下所示: 1.树形视图:如下所示: 1.1.该视图会将内存数据分组到不同的对象类别下。 1.2.每个对象类别的大小就表示占用内存量大小。 1.3.当没有选择任何对象类别时,就会在Filters面板中显示所有对象类别当中的所有对象;否则就会在Filters面板中显示当前选择的对象类别中的所有对象。如下图所示: 2.[差异]内存视图:如下所示: 2.1.该视图会将内存数据可视化成虚拟内存布局。如下图所示: 2.2.每一行都会显示一个内存块和起始地址标签。当起始地址标签上面有黑色背景时,就表明该起始地址就是内存块的开始部分,并且与之前的内存块之间存在不连续性;否则,就表明该起始地址就是内存块的一部分。如下图所示: 2.3.既可以通过单击起始地址标签来选择关联的内存块;也可以通过单击鼠标拖动的方式来选择感兴趣的内存块;甚至可以通过单击内存块中的虚拟内存来选择该内存块。 2.4.当选择内存块时,就会在Filters面板中将相关的虚拟内存按照指定的列表类型(区域列表-Regions list、分配列表-Allocations list、对象列表-Objects list)进行展示详细信息。 区域列表类型展示信息如下图所示: 分配列表类型展示信息如下图所示: 对象列表类型展示信息如下图所示: 2.5.当视图为差异内存视图时,就会在Filters面板中显示New和Old两个按钮。通过这两个按钮进行动态切换不同的内存快照。如下图所示: 3.表格视图:如下所示: 3.1.
注意事项:如下所示: 1.给内存快照拍摄截图的功能只适用于Unity2019.3+。 2.虽然内存快照里面会包含捕获目标的全部托管堆内容,但是并不是所有的数据都会显示到窗口上的。具有以下特性: 2.1.不会存储类型中的常量(内联到二进制中)。 2.2.将值类型按照数值来存储。 2.3.将引用类型按照指针地址来存储,并且在窗口上解析成指向对象的链接。
|