如果你是 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 性能。