使用计时捕获分析 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 采样选项可帮助你确定应用程序热路径中的慢速函数,并发现与线程等待和上下文切换相关的问题。 还可以跟踪不同类型的分配(启用相应的捕获选项)。
有几篇博客文章详细介绍了这些功能:
- 计时捕获概述
- “分析计时捕获中的 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 工作分析。
在要显示的项目下拉菜单中选择相关类别,还可以通过范围详细信息视图以表格形式查看这些数据。
演示和显示信息
Vsyncs 在单独的监视器通道中显示为标记,并可在范围详细信息视图的其他类别中找到。
GPU 内存和 Direct3D 对象
在捕获以收集 Direct3D 对象信息时,启用 GPU 资源选项。 在指标视图中,可以找到多个显示总体内存使用情况的计数器。 可以配置各种预算行,以便快速了解是否达到了内存使用目标。 找到感兴趣的区域后,通过选择时间范围,单击右键上下文菜单中的缩放时间线视图以选择范围,并将选择的时间范围下拉菜单设置为选择可见范围,以便作进一步的研究。
提示
将“线型”设置为“正方形”可以更轻松地查看分配的位置。
在“范围详细信息”视图中,可以查看 Direct3D API 对象的各种信息,如堆、资源和管道状态对象。 为了更容易找出可疑对象,这些信息将按照分配和释放的时间进行分组。
驻留
有关驻留相关问题,请参阅“范围详细信息”视图中的“驻留操作”、“降级分配”和“分配迁移”类别。 这些标记和事件也显示在驻留操作通道中。
驻留操作包括 MakeResident 和 Evict 操作(通过 Direct3D 12 API 启动)以及任何 PageIn 和 PageOut 操作(有关详细信息,请参阅驻留)。 当图形内核 (DXGK) 无法在 GPU 的 VRAM 中分配资源时(由于内存压力或碎片),就会发生降级分配。 如果出现这种情况,DXGK 也会尝试对这些降级分配执行分配迁移。 需要注意的是,这些迁移都是昂贵的操作,因为它们需要挂起 GPU。
GPU 利用率和演示计数器
在进行捕获时,启用捕获 SysMon 计数器选项以收系统监视器(又名 SysMon)中存在的计数器,其中包括与 GPU 性能相关的各种计数器。 值得注意的是,有以下计数器:
- 目标进程和所有进程的 GPU 利用率按 GPU 引擎细分。
- 展示数据,如每秒帧数(以及以毫秒为单位的反向帧数 MsBetweenPresents)和 MsUntilRenderComplete(展示开始和 GPU 工作完成之间的时间)。
- GPU 内存信息,包括本地和非本地内存使用情况、驻留和预算。
提示
将鼠标悬停在系统监视器中的计数器名称上以获取说明。
这些计数器也可以实时监控,既可以在进行计时捕获的同时进行,也可以通过单击系统监视器视图中的开始计数器收集按钮进行。 图形可以重新排列,计数器可以动态添加或删除。 单击计数器以查看所有可用的计数器。
Win32 file-I/O
请参阅博客文章在计时捕获中分析 Win32 文件 IO 性能。
其他分析功能
- 统计比较有助于确定 PIX 事件层次结构中哪些部分的持续时间与一组被比较点的持续时间存在统计差异。 有关详细信息,请参阅博客文章计时捕获统计比较功能。
- 设置性能预算有助于快速发现捕获到的问题范围。 有关详细信息,请参阅博客文章在“计时捕获”指标视图中使用性能预算。
- 另请参阅博客文章计时捕获中的关键路径分析。