快照窗口
这些窗格允许用户分析单个快照。窗格可以从左侧的列表中访问。列表下方有一个组合框,允许在不同快照之间快速切换。
堆概述
这是创建快照后将显示的默认快照窗格。它提供了应用程序正在使用多少内存以及内存分配位置的概述。它可以用来非常快速地确定应用程序是否使用了某种类型的过量内存,以及是否在应有的位置使用了正确的内存类型。
RMV 能够检测内存跟踪是否是从启用了 Smart Access Memory (SAM) 的系统拍摄的。SAM 使 CPU 能够直接访问所有可用的视频内存。有关 SAM 的更多信息,请参阅 GPUOpen 文章“如何充分利用 Smart Access Memory”,网址为 /learn/get-the-most-out-of-smart-access-memory/
堆概述窗格的顶行指示 SAM 是否已启用或禁用。
当 SAM 被禁用时,显示被分成 3 个部分,每个堆类型一个部分。每个堆的用途都有简要描述。

当 SAM 启用时,由于所有内存对 CPU 可见,因此不会显示不可见堆的部分。

此外,基于 RDNA 4 架构的 AMD GPU 能够执行一种动态智能访问内存,使 GPU 的所有内存对 CPU 可见。在这种情况下,UI 将显示为 SAM 已启用(因为这两种方法产生相同的结果)。
左侧是每种堆类型使用的内存量,显示为一系列条形图
请求的条形图显示了应用程序请求了多少该堆的内存。仅仅因为应用程序请求内存并不意味着应用程序就能获得它。如果应用程序请求的内存过多,则会显示警告消息。条形图还通过颜色编码来显示内存类型是否超额订阅或接近超额订阅。
“总大小”条显示堆中物理内存的总量。
“请求”条显示应用程序请求了多少内存。这应该能表明应用程序的内存占用情况。内存是在进行分配时请求的,例如通过创建 ID3D12Heap (D3D12) 或 VkDeviceMemory (Vulkan)。内存请求通常会在底层请求虚拟内存,并且由驱动程序负责在适当的时间和地点将虚拟内存映射到物理内存。在 RMV 中,第一次放置资源到分配后,该分配才可能出现。
“绑定”条显示了多少内存已绑定到资源,例如缓冲区或纹理(图像)。如果请求的内存量远大于绑定的内存量,则可能表明应用程序已请求但实际上并未使用的内存。
中间列显示了一系列堆内存类型的统计信息,例如内存所在的位置(系统内存还是视频内存),它是否在 CPU 上映射,以及一些分配的统计信息。
右侧列显示了每个堆中资源类型的构成。由此可以确定某些资源类型是否位于特定资源的最佳内存类型中(例如,可能存在系统内存中的渲染目标,而理想情况下它应该位于本地内存中)。
资源概述
此窗格将显示应用程序使用的资源的概述。显示的大部分内容是一个资源视图,其中包含内存中资源的图形表示。可以筛选掉资源,以便只显示特定类型或包含在特定首选堆中的资源。还可以根据各种属性(例如,按资源类型或首选堆)对它们进行颜色编码。

将鼠标悬停在资源上会使鼠标下的资源变暗,并显示一个工具提示,其中包含该资源的有关信息。如果屏幕上的资源看起来非常小,可以使用按大小过滤滑块来筛选掉非常大或非常小的资源。
单击资源将在窗格底部显示其详细信息,包括各种属性以及所选资源在其对应分配中的位置。现在,大部分此信息都可以在工具提示中获得。
首选堆下拉列表允许您根据资源创建时首选的容器来选择要在资源视图中包含的资源。您可以通过选中一个或多个您希望包含资源的堆来实现此目的。
资源使用情况下拉列表允许根据使用类型过滤资源。同样,这是通过选中或取消选中一个或多个资源类型来实现的。例如,取消选中“缓冲区”复选框将隐藏图中的缓冲区资源。
除了资源使用类型之外,此下拉组合框还包括“堆”和“未绑定”复选框,用于在图表中显示堆或未绑定的内存区域。“堆”复选框的选择与资源使用类型复选框互斥。图表可以显示堆或资源使用类型。请注意,资源概述图表中显示的堆块大小是根据实际总大小计算的。计算堆块大小时不考虑重叠的资源。在这种模式下,不会显示为已提交资源隐式创建的 DX12 堆。
这些组合框出现在 UI 的多个地方,它们都是独立的,即更改一个窗格上的堆类型不会影响使用堆组合框的其他窗格上的堆类型。此外,切换快照时堆选择不会重置,因此可以快速以相同配置进行比较。但是,加载新的内存跟踪会将其堆组合框重置为默认状态。目前有 3 种堆类型,在堆概述窗格中有简要说明。组合框中的第四种堆类型“未指定”用于指示该资源没有首选堆。
颜色组合框允许您根据各种资源属性对显示进行颜色编码。例如,按资源类型(默认)着色,或按资源绑定或创建时间着色。使用着色模式可以让您立即看到具有相同参数的资源。大多数着色模式都是不言自明的,但“提交类型”可能需要一些解释。目前有 3 种提交类型
-
已提交:这意味着资源是使用足够大的隐式堆创建的,以容纳它。即:驱动程序堆栈被要求创建从物理页到底层的完整内存映射链。
-
已放置:资源被要求成为一个已放置资源。这意味着该资源绑定到一个先前分配的内存堆。
-
虚拟:资源被要求成为一个虚拟资源。这意味着该资源没有物理内存支持。资源将在创建资源时分配自己的虚拟地址范围,但该虚拟地址空间不会映射到底层物理地址范围。
还有 3 个切片组合框。这些允许您按某个属性对资源进行分组。第一种切片模式应用于所有资源。其他 2 种切片模式应用于由前一种切片模式设置的组。
下面的屏幕截图显示了按是否位于首选堆中对资源进行切片和着色。您可以立即知道资源是否位于您期望的位置,如果不是,则可以通过双击该资源进行进一步调查,这将跳转到资源详细信息窗格。

如果资源显示为“点状”效果,则表示该资源是别名的,表明 2 个或更多资源共享相同的内存。在下面的屏幕截图中,可以在命令缓冲区上看到点状效果。

为了帮助可视化别名资源,采用了一系列规则来确定在资源概述窗格上显示哪些资源块以及这些块相对于其他资源的大小。当出现与一个或多个资源重叠时,将显示优先级最高的资源的重叠部分。优先级基于三个因素。首先是资源类型,按照资源类型图例中列出的顺序(最左边的类型优先级最高,最右边的优先级最低)。如果重叠的资源具有相同的类型,则按大小进行比较。最小的资源具有最高的优先级。如果资源的大小也相同,则使用资源标识符的值来做出最终决定。
下面的分配概述窗格说明了混合使用类型和混合大小的别名资源的部分重叠。

以这种方式重叠的资源将在资源概述窗格上显示为以下资源块。

请注意,别名资源的大小(2 KiB、3 Kib、1 KiB 和 2 KiB)的总和为 8 KiB,加上 2 KiB 的非别名资源大小,总计等于报告的总分配和绑定大小。
分配概述
此窗格将显示每个分配中的资源以及所有资源。同样,如果资源是别名的,它们将具有点状效果。

提供按首选堆过滤,以便只显示指定首选堆中的资源。
可以使用“按...着色”组合框更改着色模式,该组合框将按各种参数对资源和分配进行着色,例如,按资源使用情况和首选堆类型进行着色。
可以使用顶部的排序组合框对分配进行排序。目前排序基于分配大小、分配 ID、分配年龄、资源计数(分配中的资源数量)或碎片得分。碎片得分只是衡量分配有多碎片化的指标。资源之间的空白越多,该值就越高。
左侧的另一个组合框允许按升序或降序排序。
通常,分配的大小相对于最大的分配。有时这会使较小的分配难以看到。“标准化分配”复选框会将所有分配绘制成相同的长度,如下所示

另请注意,分配比上一张截图中的分配略高。分配高度由顶部的滑块控制,该滑块可以显示更多分配或显示特定分配的更多详细信息。这对于别名资源(资源共享相同的底层内存)是必需的。“显示别名”复选框将在堆叠显示之间切换。如果不存在别名,分配显示将保持不变。如下所示

在这里,深度模版缓冲区以及一些渲染目标和纹理存在别名。通常,这些会显示为单个资源,如上一张图片所示,但切换别名显示后,可以看出在深度模版缓冲区的情况下,这 3 个资源共享相同的底层内存。此外,分配的高度已增加,以更清晰地显示堆叠。
还可以使用搜索框过滤分配。只有当分配的任何部分文本与搜索框中的文本匹配时,才会显示分配。这样,分配就可以按大小、堆类型或资源数量进行过滤。
双击资源将跳转到分配浏览器。
轮播
轮播显示在资源列表窗格上,并显示当前快照中资源的顶层信息。它可以被视为一个概述,用于回答诸如“我的应用程序在使用每个堆的多少内存?”或“我的分配有多大?”之类的高层问题。
分配大小显示按桶排列的分配大小。可以一目了然地轻松查看正在使用多少分配以及它们的相对大小。

已提交内存显示该应用程序为每种堆类型已提交到物理内存的内存量。理想情况下,应用程序请求的所有内存都应该在物理内存中。
请注意,RMV 不同标签页之间显示的已提交内存量是根据图形驱动程序的低级数据计算的,可能与使用图形 API 进行内存分配/释放不直接对应。

请求的虚拟内存显示从哪个堆请求了哪些内存。与堆概述窗格使用相同的着色方案,因此很容易看出某些堆是否超额订阅或不足。

资源类型显示分配中包含的资源的构成。最常见的显示为“其他”类别,其余的都被归入其中。

虚拟内存显示有多少内存已绑定到资源。未绑定的内存基本上是未使用的,因此应尽量减少。有时由于对齐问题,这不可能,但如果存在大量未绑定内存,这将在每个分配的分配概述窗格中看到。

轮播也显示在快照差异窗格中,但在这里它显示了两个选定快照之间的差异。
资源列表
此视图将以表格形式显示所有分配的所有资源。
视图顶部显示前面描述的轮播。
首选堆和资源使用情况过滤组合框可用于根据资源类型或首选堆类型显示或隐藏资源。通过关闭所有首选堆,将留下一些分配。孤立资源是指父分配在未先释放资源的情况下已被解除分配的资源。其他带有“-”的资源没有父分配。
可以通过选择列标题来对表项进行排序。例如,如果选择了首选堆列,则整个表将按首选堆排序。
搜索框允许按表中存在的任何文本过滤资源。任何不匹配文本过滤器的资源都将不会显示。
现在,RMV 中任何资源表的搜索功能都支持基于范围的搜索,而不仅仅是文本搜索。例如,如果虚拟地址为 0x1000,大小为 256 字节,输入搜索文本 0x1001 将包含此资源,因为它位于地址范围内。这对于查看内存位置是否被多个资源使用非常有用。基于范围的搜索可用于十进制或十六进制数字。
将鼠标悬停在表中的内存大小单元格上将显示一个工具提示,其中包含确切的字节数。

分配浏览器
这将显示每个分配的资源。该窗格由 2 个表组成。顶表列出了所有分配。这些分配可以使用位于分配表上方的搜索框文本过滤器进行过滤,还可以使用搜索框右侧的“按大小过滤”滑块按大小进行过滤。
单击分配将在下面的图形中显示它,以及所选分配中所有资源的表示。
将鼠标悬停在任一表中的内存大小单元格上将显示一个工具提示,其中包含字节数。

可以使用分配图形上方的“按...着色”组合框更改着色。
“显示别名”复选框将以堆叠视图显示分配中的资源,以帮助可视化别名。如果分配中没有别名资源,则该复选框将显示为灰色。在图形分配显示上方和下方有两个分隔条,可以移动它们来增加或减少图形分配显示的高度。如果存在大量别名,则可能需要暂时增加高度,如下所示

分配显示下方的表列出了所选分配中所有资源的列表。可以使用搜索框文本过滤器以及右侧的“按大小过滤”滑块来过滤这些资源。双击资源将导航到资源详细信息窗格。
资源详细信息
此窗格显示所选资源的有关信息。该窗格分为 2 部分。顶部显示有关所选资源的信息,并进一步分为 3 个部分。左侧是资源摘要,显示有关资源的信息(其大小、它所在的分配、创建时间等)。
中间列显示资源属性,这些属性因资源类型而异。例如,纹理资源将显示其宽度、高度和像素格式。某些资源将显示创建或使用标志。如果这些标志是位域,则会显示位域的文本等效项,如果有多个标志,它们将用“|”分隔。括号中的值是标志的十进制值。
右侧列显示纹理在物理内存中的驻留位置。如果它未驻留,则显示为未映射。从这里可以确定资源是否驻留在请求的堆中。如果没有,则会显示一条警告消息,说明问题所在。
资源信息下方是显示资源随时间变化的活动时间线。相同的数据表示在下表中。还存在一个标记,显示当前快照拍摄的时间。快照之后发生的任何资源事件在表中都显示为灰色。这些信息可以与物理驻留甜甜圈结合使用,以确定资源内存是否位于与请求不同的位置(例如,它可能在某个时候被设置为驻留,然后又被分页出去),以及为什么。

并非所有事件都在表中列出了所有参数。在这种情况下,该条目将标记为“n/a”——不适用。例如,物理内存地址不适用于虚拟分配事件。
通过右键单击“属性”表,可以将资源属性保存到剪贴板。这将显示一个上下文菜单,如下所示

将表复制为文本的选项会将表保存为标准文本,使用空格对齐列。然后可以将剪贴板粘贴到普通文本文件中进行查看。
将表复制为 CSV 文本的选项会将表以逗号分隔的列保存。剪贴板可以粘贴到文本文件中,然后该文本文件可以加载到电子表格应用程序中进行查看。