2015-07-19 81 views
0

如在Optimizing DirectX apps for low latency input...中所解释的,使用DXGI_SWAP_CHAIN_FLAG_FRAME_LATENCY_WAITABLE_OBJECT可以使应用程序更具响应能力。我有几个关于这方面的问题:使用“等待对象”进行DirectX 11优化

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

感谢

回答

1

的调用Present(或Present1)是无阻塞的回报很快。它只是向API表明你已经完成了帧并准备好显示帧缓冲区。为了防止CPU在GPU之前过多,默认情况下,一旦3个帧排队,Windows将默认阻止Present。这通常会以某种稳定的速度在应用程序中消失,但这种额外的延迟对于基于触摸的UI应用程序来说可能是一个真正的问题。

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

您可以在Windows桌面应用程序做的是使用DXGI_PRESENT_DO_NOT_WAIT标志,如果Present返回DXGI_PRESENT_DO_NOT_WAIT您的应用程序的故障代码,知道它有一个数量的帧排队。你可以做其他工作来稍微等一下,扼杀你的内容,或者用其他方法来做其他事情,但大多数游戏都是“平淡无奇”的,如果游戏速度过快,就让游戏阻塞。

+0

所以实际上,即使当我看到** Present1 **每16秒毫秒返回时,实际上它会在缓冲区排队时返回,而不是缓冲区是否显示给用户? 您提到的“3帧”的数量是多少?或者可以更改一些神奇的数字? –

+0

我也看过'DXGI_PRESENT_DO_NOT_WAIT',看起来这还没有告诉我帧何时出现,只是帧没有被阻塞排队,对吧? 那么有什么方法可以知道帧何时实际显示给用户?理想情况下,我想知道演示的绝对时间,以便正确预测当时的对象。 我也尝试过使用'IDXGIOutput-> WaitForVBlank()',它似乎给出了合理的结果,但精度低。 –

+0

做了一些更多的测试后,似乎通过执行'Present(0)',然后是'WaitForVBlank()'得到最好的结果。这有意义吗? –