使用 GPU 捕获分析帧
GPU(或帧)捕获会记录应用程序进行的所有 Direct3D 12 API 调用,通常是在单帧中(请参阅获取 GPU 捕获)。 PIX 可以重放这些 API 调用,以便显示有关 API 调用参数、管道和资源状态、资源内容等信息。
提示
如果游戏以无效方式调用 Direct3D 12,则 PIX 并不总能成功捕获 GPU。 即使在使用模式不正确的情况下,PIX 也会尽最大努力保证其稳健性,但有时难免会出现“垃圾进,垃圾出”的情况。如果在捕获 GPU 图像时遇到困难,请尝试使用 D3D12 调试层和基于 GPU 的验证来查找并修复任何不良的 API 调用。
获取 GPU 捕获
从连接视图中,启动或附加到所需的进程(确保选中相关的用于 GPU 捕获选项)。
根据需要配置 GPU 捕获选项。 要进行捕获,可单击 PIX 中的获取 GPU 捕获按钮,或按 Alt+Print Screen(或 F11,可在 PIX 设置中配置)。 将在 PIX UI 中看到捕获的缩略图。 此时,可以根据需要终止应用程序。 单击缩略图以打开捕获。
编程捕获
可以使用 WinPixEventRuntime 以编程方式进行捕获。 有关详细信息,请参阅博客文章编程捕获。
使用事件视图查看 API 调用
事件视图显示记录到 GPU 捕获中的所有 API 调用。 游戏使用的每个 Direct3D 12 队列(图形、计算或副本)都有一个单独的列表。
可以筛选事件列表,也可以使用正则表达式(单击标有 .* 的按钮)。 默认情况下,它只显示导致 GPU 硬件实际呈现工作的事件,而不是简单地准备状态供后续操作使用的事件。 要包括非 GPU 事件,请单击标有 !G 的按钮。
事件详细信息视图中提供了有关每个事件的详细信息,例如完整的 API 调用参数。 该视图默认包含在管道选项卡中,但也可以通过 PIX 主窗口右上角的布局设计模式按钮添加到当前布局中。
帧分析
打开 GPU 捕获后,切换到“概览”选项卡。在这里,将显示有关捕获的一些基本详细信息。
要开始分析,则需要收集计时数据。 为此,请单击事件视图右上方的收集计时数据按钮,或单击时间线视图中的单击此处开始分析和收集时间线文本。 这样将重播捕获中的 GPU 工作,并收集基本的计时数据,如执行持续时间(如果应用程序包含,则用 PixEvents 标注)。 完成后可以收集其他数据,如占用率信息和其他 GPU 专用计数器,以便在时间线通道中绘制图表。
提示
为获得最佳效果,在 PIX 收集定时数据时不要与计算机交互,并关闭可能正在使用 GPU 的任何其他应用程序。
还可以在事件视图中看到按 API 调用细分的计数器。 要启用/禁用计数器,请单击事件列表计数器按钮(事件视图的右上角)。
计时数据
GPU 计时信息有两个源:
- 管道起始时间戳会报告 GPU 开始处理每项工作的时间。 请注意,只有在运行 Windows 10,版本 14393(或更高)并配有合适的图形驱动程序时,才能使用此数据(请参阅博客文章要求)。 如果没有管道起始时间戳,则需要更长的时间来收集计时数据。
- 管道末端 (EOP) 时间戳会报告 GPU 完成每项工作的时间。
由于 GPU 采用大规模并行和深度管道化,因此在同一时间执行不止一项工作以及相邻操作重叠的情况非常普遍。 PIX 可通过两种不同的方式测量时间,从而深入了解硬件的并行执行模型:
- 执行时间是从每个独立工作的管道开始到管道结束的时间戳。 以这种方式测量时,由于 GPU 上的争用,与先前项目并行运行的 GPU 工作项目可能会比单独运行的时间更长。
- EOP 持续时间是从上一个项目的管道末端 (EOP) 时间戳到这个项目的 EOP 时间戳。 因此,与先前项目并行运行的工作项目会比单独运行的项目显得短,有些项目如果完全与先前项目并行完成,甚至会被报告为零持续时间。
时间线视图显示一个或多个通道,显示每个 GPU 操作的计时。 游戏使用的每个队列(图形、计算或副本)都有一条单独的通道,包含 EOP 持续时间数据,另外还有一条通道显示所有队列的综合执行持续时间数据(如有)。
提示
目前,Windows 上的 PIX 在分析 GPU 捕获的计时时,不会在不同队列上重叠 GPU 工作。 如要查看重叠的异步计算计时数据,请考虑进行计时捕获。 在 GPU 捕获中,如果游戏使用异步计算同时执行呈现和计算工作,那么 PIX 会先测量其中一个,然后再测量另一个。 这可能会导致每部分工作的报告持续时间比在原始游戏中执行的时间更短(由于减少了 GPU 上的争用),但总时间却更长(由于减少了并行化)。
GPU 计数器和占用率
PIX 通过 GPU 插件公开 IHV 提供的特定于硬件的性能计数器。 这些计数器可在事件列表计数器视图(事件视图右上方的启用按钮)或时间线计数器视图(时间线视图右上方的启用按钮)中启用和收集。
在某些 GPU 上,PIX 还可以收集占用信息。 GPU 通常构建为重复块的层次结构,其中每个级别可能共享一个资源。 例如,一个假想的 GPU 可能结构如下:
GPU 在执行着色器时,会将着色器的工作分解成若干波形(这些波形也称为翘曲或波前)。 在上图中,每个蓝色块都能执行一个波形。 每个绿块最多可执行四个波形。
由于所有蓝块都共享一组寄存器,如果一个工作负荷需要使用所有寄存器,那么一次只能有一个波形在绿块中执行。 在这种情况下,绿块的占用率为 1,而总占用率可能为 4。
在任何时候,所有绿块都可能在执行不同数量的波形。 在上述四个绿块中,一个可能执行 3 个波形,另一个执行 2 个波形,剩下的执行 1 个波形。 PIX 将所有数据归结为一个值 - 最大占用率,在本例中为 3。
这在 PIX 的占用率通道中显示,该通道显示最大占用率,并按着色器阶段分开。 这表明 GPU 能够并行处理多少工作 - 条形图越大,说明 GPU 利用率越高。
调试呈现问题
打开 GPU 捕获后,切换到管道选项卡。该选项卡包含事件视图、多个状态和资源检查器视图以及管道视图。
在事件视图中选择一个事件就会弹出各种视图,特别是管道视图,该视图可用于检查根签名、管道状态和绑定的资源。 管道视图也是着色器调试的入口点。
提示
要执行大多数功能,则需要开始分析。 分析是 PIX 收集计时数据、状态信息和资源的方式。 启动分析的方法有很多,但全局性的方法是通过应用程序右上方的开始分析播放按钮。 确保选择了所需的 GPU。
查看 Direct3D 12 对象、参数和状态
在事件视图中选择一个事件后,状态和管道视图(位于管道选项卡中)将显示该事件发生时 Direct3D 状态的详细信息。 在这里可以查看哪些资源绑定到了管道、着色器代码、输入、输出以及当前绑定的呈现目标。
着色器调试
选择适当的事件并运行分析后,就可以调试着色器了。 在管道视图中,有几种启动着色器调试的方法:
- 选择所需着色器阶段下的着色器条目,然后单击绿色的播放按钮。 启动调试会话前,请确保配置了适当的着色器参数(例如,顶点着色器的实例和顶点 ID,或像素着色器的像素坐标)。
- 在资源查看器(例如 VS 输出或 SRV/UAV/RTV)上单击右键,然后选择相应的调试选项。
- 查看适当的资源(例如 SRV/UAV/RTV)时,单击像素详细信息视图中的调试像素按钮。
提示
如果调试时无法看到着色器源代码,很可能是缺少调试信息。 确保为应用程序生成着色器 PDB,并已配置 PIX 以加载这些 PDB。
着色器编辑 & 继续
HLSL 着色器代码可直接在 PIX 中编辑,从而立即显示更改对呈现结果或性能的影响。 这对原型设计和优化着色器非常有用,因为它可以大大缩短尝试不同想法的周转时间。
选择着色器后,可以随意编辑其代码,然后单击编辑>应用。 其他视图(如 OM RTV 0)将会更新,以显示更改的效果。 可能会发现,为了在编辑着色器代码的同时查看呈现目标结果,将多个管道视图实例相互停靠在一起非常有用。
如果记不清到底改了什么,可以右键单击着色器代码,然后选择与原始的差异。
提示
Windows 上的 PIX 尚不支持将修改后的着色器保存回捕获文件。
调试可视化工具
当检查呈现目标的内容时,管道视图中提供了呈现目标可视化器。 默认图像可视化器只显示正常图像,可在可视化视图中选择不同的可视化器进行更改。
像素历史记录
对于任何像素类资源(例如 RTV、UAV 或深度缓冲区),可以使用像素历史记录来查看影响特定像素的所有操作。 可以右键单击所需像素,然后选择显示像素历史,或单击像素详细信息视图中的像素历史按钮。
注意事项和其他说明
- 如果游戏以无效方式调用 Direct3D 12,则 PIX 并不总能成功捕获 GPU。 即使在使用模式不正确的情况下,PIX 也会尽最大努力保证其稳健性,但有时难免会出现“垃圾进,垃圾出”的情况。如果在捕获 GPU 图像时遇到困难,则尝试使用 D3D12 调试层和基于 GPU 的验证来查找并修复任何不良的 API 调用。
- 一般来说,Windows GPU 捕获不能在不同的 GPU 硬件和驱动程序版本之间移植。 在大多数情况下,在一台计算机上获取的捕获可以在同一硬件系列的其他类似 GPU 上正确播放,某些游戏的捕获甚至可以在完全不同制造商生产的 GPU 上运行,但也有可能像驱动程序升级这样的小事会破坏与旧版捕获的兼容性。 只有当 GPU 和驱动程序完全相同时,PIX 才能保证播放成功,因此如果不完全匹配,PIX 会在开始分析前发出警告。 请自担忽略该警告的风险。
- PIX 对多 GPU 的支持有限。 无论应用程序使用了多少适配器,它都将在单个适配器上回放 GPU 捕获。 PIX 允许从 PIX 工具栏的下拉功能中选择播放适配器。 如果应用程序只使用一个适配器,则 PIX 会尝试自动选择播放适配器。
- 对于非确定性的 ExecuteIndirect 工作负载,可能需要启用使用重播时 ExecuteIndirect 参数缓冲区设置。