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