内容创建/渲染

使用 SetBackgroundProcessingMode 对 DirectX 12 进行游戏内 GPU 分析

 

如果你是 DirectX 12(DX12) 游戏开发人员,你可能已经注意到,即使应用程序端没有任何变化,游戏 HUD 中实时显示的 GPU 时间也可能会随着时间的推移而变化。

GPU 时间变化的一个原因可能是 GPU Boost 动态地改变 GPU 核心时钟频率。即使使用 DX12 禁用了 GPU 升压 SetStablePowerState API,GPU 游戏中测得的计时也可能在不同的跑步或每帧之间发生意外变化。需要考虑的因素包括是否进行了背景驱动程序优化,以及何时部署了优化后的着色器。

这篇文章提供了在使用 DX12 监控后台驱动程序优化状态的同时,在 NVIDIA GPU 上执行游戏内 GPU 评测的最佳实践,使用 SetBackgroundProcessingMode API。

始终启用后台驱动程序优化

如果 DX12 驱动程序检测到 CPU 开销可能对 DX12 应用程序的帧速率产生负面影响的风险,它会自动禁用所有后台优化。因此,例如,使用应用程序的 Debug 构建运行可能会导致优化程度较低的 GPU 工作负载。即使对于 Release 版本,驱动程序后台优化也可以逐帧动态打开和关闭。

为了避免根据应用程序的 CPU 负载获得不一致的分析结果,您可以请求驱动程序后台优化始终处于启用状态,即使这可能会降低帧速率。使用以下调用(一次就足够了,无需对每帧进行重做):

if (FAILED(pDevice6->SetBackgroundProcessingMode(
  D3D12_BACKGROUND_PROCESSING_MODE_ALLOW_INTRUSIVE_MEASUREMENTS, 
  D3D12_MEASUREMENTS_ACTION_KEEP_ALL,
  nullptr, nullptr)) {
        // handle error.
      }

等待后台驱动程序优化线程

即使驱动程序后台优化始终处于启用状态,优化通常也需要多个帧来收集观察结果。然后,这些观察结果将用于异步编译着色器。相比之下, DX12 创建用于编译的调用块。这种新二进制文件的异步交付可能会导致一个着色器的 GPU 性能突然从一帧变到下一帧,而应用程序端没有任何变化。

可以理解的是,这可能会导致着色器计时时出现大量混乱。您仍然应该以测量这些背景优化的着色器为目标,以避免驱动程序已经提供的应用程序优化工作。
要知道所有后台驱动程序优化何时完成,以便在游戏内探查器中进行 GPU 性能测量,请在 Present 上使用以下代码。继续渲染帧,直到wantMoreFrames返回为 false 。

出席:

BOOL wantMoreFrames;
if (FAILED(pDevice6->SetBackgroundProcessingMode(
    D3D12_BACKGROUND_PROCESSING_MODE_ALLOW_INTRUSIVE_MEASUREMENTS,
    D3D12_MEASUREMENTS_ACTION_KEEP_ALL,
    nullptr,
    &wantMoreFrames))) {
        // handle error.
    }

注意事项:

  • 这个wantMoreFrames返回值结合了驱动程序的两条信息:“后台编译当前是否正在运行”和“驱动程序是否希望向优化器演示更多的帧”
  • 我们建议您在游戏中 GPU 计时旁边的游戏 HUD 中实时显示此布尔值。
  • 有可能wantMoreFrames如果驱动程序继续生成新的二进制文件,则永远不会变为 false 。我们建议您暂停游戏时间,不要移动相机以避免这种可能性。
  • 如果wantMoreFrames在你的情况下,布尔值永远不会变为假,即使在你暂停了所有模拟之后,你也可以回头看看游戏 HUD 中的 GPU 时间是否已经确定。

将后台处理模式重置为默认模式

使用以下调用返回 DX12 驱动程序的默认模式。在这种模式下,驱动程序根据内部启发打开和关闭后台优化。

if (FAILED(pDevice6->SetBackgroundProcessingMode(
  D3D12_BACKGROUND_PROCESSING_MODE_ALLOWED, 
  D3D12_MEASUREMENTS_ACTION_KEEP_ALL,
  nullptr, nullptr)) {
        // handle error.
      }

结论

要使用 DX12 游戏内 GPU 探查器在 NVIDIA GPU 上进行更具确定性的性能测量,我们建议您显示wantMoreFrames游戏中 HUD 中的布尔值位于游戏中 GPU 时间旁边,以了解背景驱动程序优化是否正在进行中。

通过在开发期间以这种方式在游戏引擎中使用 DX12 SetBackgroundProcessingMode API ,游戏内 GPU 探查器将提供更可靠的信息。通过使用ALLOW_INTRUSIVE_MEASUREMENTS背景处理模式下,您不应该再根据游戏的 CPU 负载获得不同的 GPU 时间。通过等待wantMoreFrames如果为 false ,则可以确保始终查看完全优化的着色器的 GPU 性能。

 

标签