我正试图在我的D3D应用程序中实现稳定的固定60fps并通过执行vsync来实现这一点。 我设置了这样的循环:
while(isRunning)
{
ProcessMessages(window);
renderer->context->ClearRenderTargetView(renderer->renderTarget, color);
renderer->swapChain->Present(1, 0);
end = GetCurrentTick();
double ms = GetElapsedMilliseconds(start, end);
start = end;
}
// Function definitions
inline LONGLONG GetCurrentTick()
{
LARGE_INTEGER count;
QueryPerformanceCounter(&count);
return count.QuadPart;
}
inline double GetElapsedMilliseconds(LONGLONG start, LONGLONG end)
{
return (1000.0 * (double)(end - start)) / (double)freq.QuadPart;
}
我希望看到“ms”变量总是相同,但它实际上从大约16.1 ms变化到17以上。是否有一些错误的假设我正在做或只是简单的编码错误?提前感谢您的帮助。
答案 0 :(得分:0)
空循环时序不是特别准确,很容易混淆,所以你应该创建一个具有实际场景的东西。然后,您可以使用GPUView或类似工具来确定代码中的任何停顿。
这里发生的事情是Windows允许你排队3帧,然后让你的线程进入睡眠状态,直到处理完一个,然后再次准备它。默认调度程序量程为15毫秒,因此一旦处于基本上由当前队列保持的稳定状态,您将获得大量延迟。
如果您在Present中使用DXGI_PRESENT_DO_NOT_WAIT
,则可以在代码中检测到此行为,在这种情况下,您将获得失败代码DXGI_ERROR_WAS_STILL_DRAWING
,而不是让您的线程进入睡眠状态。
另外,您没有提到您正在使用的翻转模型。