DirectX垂直同步误差

DirectX垂直同步误差,directx,vsync,Directx,Vsync,我试图在我的D3D应用程序中实现稳定的固定60fps,并通过执行vsync来实现这一点。 我设置了如下循环: while(isRunning) { ProcessMessages(window); renderer->context->ClearRenderTargetView(renderer->renderTarget, color); renderer

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

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

这里发生的事情是,Windows允许您排队3帧,然后将线程置于睡眠状态,直到其中一帧被处理,然后再次准备。默认的调度程序量是15毫秒,因此,一旦处于基本上由当前队列控制的稳定状态,您就会得到很大的延迟

如果您在当前使用
DXGI\u PRESENT\u DO\u NOT\u WAIT
,您可以在代码中检测到这种行为,在这种情况下,您将返回一个失败代码
DXGI\u ERROR\u WAS\u STILL\u DRAWING
,而不是让线程休眠


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

我使用的是DXGI\u SWAP\u EFFECT\u DISCARD