使用计时捕获分析 CPU 和 GPU

计时捕获将 CPU 和 GPU 的分析数据整合到一个捕获中,以便对应用程序进行深入分析。 这些数据是在游戏运行过程中以最小的开销收集的,这样就可以看到工作在 CPU 内核上的分配情况、CPU 提交图形工作与 GPU 执行图形工作之间的延迟、文件 IO 访问和内存分配发生的时间等。 这还包括通过 PixEvents 应用程序定义的事件、标记和计数器

进行计时捕获

连接视图中,启动或附加到所需的进程(确保未选中相关的用于 GPU 捕获选项)。

根据需要配置时捕获选项,准备就绪后,单击开始计时捕获按钮开始录制。 单击停止计时捕获(或终止应用)以结束录制。 经过短暂的处理后,捕获将打开。

计时捕获选项

名称 描述
捕获模式 顺序:记录开始和停止捕获之间的全部事件。
循环:将事件记录到固定大小的缓冲区中,只保存最后 n 秒的数据。 有关更多详细信息,请参阅此循环计时捕获博客文章
CPU 示例 执行示例分析,以查看 CPU 占用的时间。 采样率可配置。
上下文切换调用堆栈 当线程切换上下文时收集调用堆栈。
文件访问 跟踪文件访问。
GPU 计时 收集 GPU 工作开始和停止的详细计时信息。
GPU 资源 收集有关堆和资源等 D3D 对象的详细信息。 此外跟踪 GPU 驻留、降级的分配和分配迁移。
VirtualAlloc/VirtualFree 事件 跟踪通过 VirtualAlloc 和 VirtualFree 函数进行的分配。
HeapAlloc/HeapFree 事件 跟踪通过 HeapAlloc 和 HeapFree 函数进行的分配。
自定义分配器事件 跟踪使用 PixEvents 的自定义内存分配器进行的分配。
页面错误事件 收集捕获运行时发生的页面错误数据。 页面错误会显示在时间线和元素详细信息视图中。
非游戏进程的调用堆栈 捕获游戏进程(启动进程或附加进程)以外进程的调用堆栈。
内核映像信息 收集显示内核二进制文件调用堆栈所需的信息。
生成 .etl 文件而不是 .wpix 文件 生成的 .etl 文件随后可在“文件 | 转换”菜单中转换为 .wpix 文件。 在向 PIX 团队报告错误重现时,或者在使用其他工具处理 ETW 数据时,此选项非常有用。

编程捕获

可以使用 WinPixEventRuntime 以编程方式进行捕获。 有关详细信息,请参阅博客文章编程捕获

CPU 分析

在捕获时启用 CPU 采样选项可帮助你确定应用程序热路径中的慢速函数,并发现与线程等待和上下文切换相关的问题。 还可以跟踪不同类型的分配(启用相应的捕获选项)。

有几篇博客文章详细介绍了这些功能:

GPU 分析

应用程序是否出现间歇性掉帧? VRAM 使用过度? 在系统内存和 VRAM 之间进行了意外的分页操作? PIX 中的 GPU 分析功能可以帮助找出这些常见的、难以分析的情况。

GPU 计时

捕获时启用 GPU 计时选项,以便为 GPU 工作收集计时数据。 在时间线视图中,可以找到每个 GPU 队列的通道(在通道选择器中,可以使用固定的 API 队列配置快速固定这些通道)。 这些通道包含多个子通道:

  • PIX 事件 (GPU):GPU 工作的层次结构、应用程序定义的区域。 请参阅 PixEvents
  • GPU 执行:执行对应于在 API 级别提交的工作;例如,通过 ExecuteCommandLists。
  • GPU 工作:任何发生在 GPU 上的工作,例如绘制、调度、复制。
  • PIX 标记 (GPU):应用程序定义的标记。 请参阅 PixEvents

在通道中选择一个事件时会看到箭头,显示该事件在 CPU 上的起始位置。 通道选项菜单中还有各种可视化选项(通道名称旁边的齿轮图标)。 最值得注意的是,为了节省空间,平展事件平展 GPU 工作 选项在默认情况下是启用的,但在深入查看特定帧时,可能希望看到完整的 PIX 事件层次结构或 GPU 工作分析。

要显示的项目下拉菜单中选择相关类别,还可以通过范围详细信息视图以表格形式查看这些数据。

在 API 队列通道中查看未平展的 PIX GPU 事件和 GPU 工作,箭头显示了哪个 CPU 线程提交了 GPU 工作

演示和显示信息

Vsyncs 在单独的监视器通道中显示为标记,并可在范围详细信息视图的其他类别中找到。

GPU 内存和 Direct3D 对象

在捕获以收集 Direct3D 对象信息时,启用 GPU 资源选项。 在指标视图中,可以找到多个显示总体内存使用情况的计数器。 可以配置各种预算行,以便快速了解是否达到了内存使用目标。 找到感兴趣的区域后,通过选择时间范围,单击右键上下文菜单中的缩放时间线视图以选择范围,并将选择的时间范围下拉菜单设置为选择可见范围,以便作进一步的研究。

在“指标”视图中查看 D3D API 对象内存使用情况

提示

将“线型”设置为“正方形”可以更轻松地查看分配的位置。

在“范围详细信息”视图中,可以查看 Direct3D API 对象的各种信息,如堆、资源和管道状态对象。 为了更容易找出可疑对象,这些信息将按照分配和释放的时间进行分组。

在范围详细信息视图中查看 D3D API 对象

驻留

有关驻留相关问题,请参阅“范围详细信息”视图中的“驻留操作”、“降级分配”和“分配迁移”类别。 这些标记和事件也显示在驻留操作通道中。

驻留操作包括 MakeResident 和 Evict 操作(通过 Direct3D 12 API 启动)以及任何 PageIn 和 PageOut 操作(有关详细信息,请参阅驻留)。 当图形内核 (DXGK) 无法在 GPU 的 VRAM 中分配资源时(由于内存压力或碎片),就会发生降级分配。 如果出现这种情况,DXGK 也会尝试对这些降级分配执行分配迁移。 需要注意的是,这些迁移都是昂贵的操作,因为它们需要挂起 GPU。

查看分配迁移

GPU 利用率和演示计数器

在进行捕获时,启用捕获 SysMon 计数器选项以收系统监视器(又名 SysMon)中存在的计数器,其中包括与 GPU 性能相关的各种计数器。 值得注意的是,有以下计数器:

  • 目标进程和所有进程的 GPU 利用率按 GPU 引擎细分。
  • 展示数据,如每秒帧数(以及以毫秒为单位的反向帧数 MsBetweenPresents)和 MsUntilRenderComplete(展示开始和 GPU 工作完成之间的时间)。
  • GPU 内存信息,包括本地和非本地内存使用情况、驻留和预算。

在“指标”视图中查看每秒帧数和 GPU 利用率

提示

将鼠标悬停在系统监视器中的计数器名称上以获取说明。

这些计数器也可以实时监控,既可以在进行计时捕获的同时进行,也可以通过单击系统监视器视图中的开始计数器收集按钮进行。 图形可以重新排列,计数器可以动态添加或删除。 单击计数器以查看所有可用的计数器。

查看系统监视器图形和计数器

Win32 file-I/O

请参阅博客文章在计时捕获中分析 Win32 文件 IO 性能

其他分析功能