【问题标题】:DirectX 11 optimization with "waitable object"DirectX 11 优化与“等待对象”
【发布时间】:2015-07-20 14:46:33
【问题描述】:

正如Optimizing DirectX apps for low latency input... 所解释的,使用DXGI_SWAP_CHAIN_FLAG_FRAME_LATENCY_WAITABLE_OBJECT 可以使应用程序更具响应性。我对此有几个问题:

  1. 为什么在执行下一个游戏循环之前,仅等待上一次对“Present1”的调用结束就不能达到相同的效果?
  2. 根据MSDN article,我可以通过使用CreateSwapChainForCoreWindow创建交换链来获得等待对象。有没有办法从常规 Win32 应用程序(不是 Windows 应用商店应用程序)获取 CoreWindow

谢谢

【问题讨论】:

    标签: directx-11


    【解决方案1】:

    Present(或Present1)的调用是非阻塞的,并且返回很快。它只是向 API 表明您已完成帧并准备好显示帧缓冲区。为了防止 CPU 远远领先于 GPU,Windows 默认会在 3 帧排队时阻止 Present。这通常会在应用程序中以某种稳定的速率平滑,但这种额外的延迟对于基于触摸的 UI 应用程序来说可能是一个真正的问题。

    CoreWindow API 仅适用于基于 WinRT 的平台,例如 UWP for Windows 10、Windows Store、Windows phone 8 和 Xbox one。它们不适用于 Windows 桌面应用程序。

    您可以在 Windows 桌面应用程序中执行的操作是使用 DXGI_PRESENT_DO_NOT_WAIT 标志,如果 Present 返回失败代码 DXGI_PRESENT_DO_NOT_WAIT,则您的应用程序知道它有许多帧排队。你可以做其他工作来稍等片刻,限制你的内容,或者用这个做其他聪明的事情,但大多数游戏只是“平稳”运行,如果渲染太快就让游戏阻塞。

    【讨论】:

    • 所以实际上,即使我看到 Present1 每 16 毫秒返回一次,实际上它在缓冲区排队时返回,这并不表示缓冲区已提交给用户?您提到的“3 帧”的数量是一个神奇的数字,还是可以更改?
    • 我也看过DXGI_PRESENT_DO_NOT_WAIT,好像这仍然没有告诉我帧是什么时候出现的,只是帧在没有阻塞的情况下排队,对吧?那么有什么方法可以知道框架何时实际显示给用户?理想情况下,我想知道演示的绝对时间,以便正确预测该时间的对象。我也尝试过使用IDXGIOutput->WaitForVBlank(),似乎给出了合理的结果,但准确率较低。
    • 在进行了更多测试之后,似乎我通过执行Present(0) 获得了最好的结果,然后执行WaitForVBlank()。这有意义吗?
    • 这可能会最大限度地减少延迟,但我怀疑您这样做会浪费大量 GPU 性能......
    • @ChuckWalbourn 您也可以将 waitable-object 标志与 CreateSwapChainForHwnd 一起使用。该功能不仅限于基于 CoreWindow 的应用程序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-16
    • 1970-01-01
    • 2021-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-02
    相关资源
    最近更新 更多