这篇文章开始发表在 NVIDIA 技术博客上。

假如你是 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 功能。

阅读原文