DirectX VSYNC不准确

时间:2014-12-19 13:29:02

标签: directx vsync

我正试图在我的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以上。是否有一些错误的假设我正在做或只是简单的编码错误?提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

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

这里发生的事情是Windows允许你排队3帧,然后让你的线程进入睡眠状态,直到处理完一个,然后再次准备它。默认调度程序量程为15毫秒,因此一旦处于基本上由当前队列保持的稳定状态,您将获得大量延迟。

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

另外,您没有提到您正在使用的翻转模型。