使用“等待对象”进行DirectX 11优化

时间:2015-07-19 09:54:37

标签: directx-11

正如Optimizing DirectX apps for low latency input...所述,使用 DXGI_SWAP_CHAIN_FLAG_FRAME_LATENCY_WAITABLE_OBJECT 可以提高应用程序的响应速度。我对此有几个问题:

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

1 个答案:

答案 0 :(得分:5)

Present(或Present1)的调用是非阻塞的,并且很快就会返回。它只是向API指示您已完成帧并准备好显示帧缓冲区。为了防止CPU远远超出GPU,默认情况下,一旦3帧排队,Windows将在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,则应用程序知道它有多个帧排队起来。你可以做其他的工作来等待,限制你的内容,或做其他聪明的事情,但大多数游戏只是运行'平坦'并让游戏阻止,如果它渲染得太快。