1

I'm trying to achieve steady fixed 60fps in my D3D app and to do that by doing vsync. I've setup loop like this:

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;
}

I would expect to see "ms" variable to be always the same, but it's actually varying from around 16.1 ms to something over 17. Is there some wrong assumption I'm making or just plain coding error? Thanks for help in advance.

4

1 回答 1

0

空循环计时不是特别准确,很容易混淆,因此您应该创建具有实际场景的东西。然后,您可以使用GPUView或类似工具来找出代码中的任何停顿。

这里发生的是 Windows 让您排队 3 帧,然后让您的线程进入睡眠状态,直到处理完一个然后再次准备好它。默认的调度程序时间间隔是 15 毫秒,因此一旦您处于基本上被当前队列保持的稳定状态,您就会得到这么多的延迟。

如果您在 Present 中使用,您可以在代码中检测到这种行为DXGI_PRESENT_DO_NOT_WAIT,在这种情况下,您将得到一个失败代码,DXGI_ERROR_WAS_STILL_DRAWING而不是让您的线程进入睡眠状态。

此外,您没有提及您使用的是哪种翻转模型。

于 2014-12-19T16:48:05.273 回答