我需要实现忙等待。
如果您认为我不应该这样做,请提供一个低延迟替代方案,而不是忙于等待ID3D11DeviceContext::GetData返回S_OK
,这适用于 Windows 7 SP1。
我发现KeStallExecutionProcessor API 正是我需要的。该 API 是否暴露于用户模式?如果没有,它是如何实施的?我知道如何调用_mm_pause
内在函数,但我不知道如何以足够的精度测量时间:QueryPerformanceCounter
对于忙碌的等待来说太贵了,GetTickCount
便宜但没有我需要的分辨率,并且_rdtsc
可能随 CPU 频率而扩展。
更新#1:我可以很好地停止CPU,例如,for ( int i = 0; i < 1000; i++ ) _mm_pause();
这就是我现在正在做的一段时间,然后开始调用Sleep( 1 )
外部循环。
更新 #2:仅在 Windows 10 1703 “Creators Update”中实现了正确等待 GPU,请参阅ID3D11Device5::CreateFence和ID3D11Fence::SetEventOnCompletion API。在 1703 之前的 Windows 7、8、8.1 和 10 中,忙碌等待是获得通知的唯一方式。我需要尽快得到通知,每一毫秒都很重要。我只有 16ms 的时间来渲染一帧,一些用户有 144Hz 的显示器,在他们的 PC 上只有 7ms。