From 32fff11093146237ccc1109b54b7a5b9f43db671 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 10 Dec 2018 04:24:30 +0100 Subject: [PATCH] reduce vsync input lag --- src/render.c | 35 +++++++++++++++++++++++------------ src/render_d3d9.c | 33 +++++++++++++++++++++------------ src/settings.c | 10 ++++------ 3 files changed, 48 insertions(+), 30 deletions(-) diff --git a/src/render.c b/src/render.c index ac7d6c8..f166741 100644 --- a/src/render.c +++ b/src/render.c @@ -118,6 +118,7 @@ static void SetMaxFPS() ddraw->fpsLimiter.tickLengthNs = 0; ddraw->fpsLimiter.ticklength = 0; + /* if (OpenGL_ExtExists("WGL_EXT_swap_control_tear", ddraw->render.hDC)) { if (wglSwapIntervalEXT) @@ -125,20 +126,21 @@ static void SetMaxFPS() if (ddraw->vsync) { wglSwapIntervalEXT(-1); - maxFPS = 0; + maxFPS = ddraw->mode.dmDisplayFrequency; } else wglSwapIntervalEXT(0); } } - else if (OpenGL_ExtExists("WGL_EXT_swap_control", ddraw->render.hDC)) + else */ + if (OpenGL_ExtExists("WGL_EXT_swap_control", ddraw->render.hDC)) { if (wglSwapIntervalEXT) { if (ddraw->vsync) { wglSwapIntervalEXT(1); - maxFPS = 0; + maxFPS = ddraw->mode.dmDisplayFrequency; } else wglSwapIntervalEXT(0); @@ -793,20 +795,29 @@ static void Render() { if (ddraw->fpsLimiter.hTimer) { - FILETIME ft = { 0 }; - GetSystemTimeAsFileTime(&ft); - - if (CompareFileTime((FILETIME *)&ddraw->fpsLimiter.dueTime, &ft) == -1) + if (ddraw->vsync) { - memcpy(&ddraw->fpsLimiter.dueTime, &ft, sizeof(LARGE_INTEGER)); + WaitForSingleObject(ddraw->fpsLimiter.hTimer, ddraw->fpsLimiter.ticklength * 2); + LARGE_INTEGER liDueTime = { .QuadPart = -ddraw->fpsLimiter.tickLengthNs }; + SetWaitableTimer(ddraw->fpsLimiter.hTimer, &liDueTime, 0, NULL, NULL, FALSE); } else { - WaitForSingleObject(ddraw->fpsLimiter.hTimer, ddraw->fpsLimiter.ticklength * 2); - } + FILETIME ft = { 0 }; + GetSystemTimeAsFileTime(&ft); - ddraw->fpsLimiter.dueTime.QuadPart += ddraw->fpsLimiter.tickLengthNs; - SetWaitableTimer(ddraw->fpsLimiter.hTimer, &ddraw->fpsLimiter.dueTime, 0, NULL, NULL, FALSE); + if (CompareFileTime((FILETIME *)&ddraw->fpsLimiter.dueTime, &ft) == -1) + { + memcpy(&ddraw->fpsLimiter.dueTime, &ft, sizeof(LARGE_INTEGER)); + } + else + { + WaitForSingleObject(ddraw->fpsLimiter.hTimer, ddraw->fpsLimiter.ticklength * 2); + } + + ddraw->fpsLimiter.dueTime.QuadPart += ddraw->fpsLimiter.tickLengthNs; + SetWaitableTimer(ddraw->fpsLimiter.hTimer, &ddraw->fpsLimiter.dueTime, 0, NULL, NULL, FALSE); + } } else { diff --git a/src/render_d3d9.c b/src/render_d3d9.c index f247bcc..10968f7 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -278,10 +278,10 @@ static void SetMaxFPS() ddraw->fpsLimiter.tickLengthNs = 0; ddraw->fpsLimiter.ticklength = 0; - if (maxFPS < 0) + if (maxFPS < 0 || ddraw->vsync) maxFPS = ddraw->mode.dmDisplayFrequency; - if (maxFPS > 1000 || ddraw->vsync) + if (maxFPS > 1000) maxFPS = 0; if (maxFPS > 0) @@ -419,25 +419,34 @@ DWORD WINAPI render_d3d9_main(void) #if _DEBUG DrawFrameInfoEnd(); #endif - + if (ddraw->fpsLimiter.ticklength > 0) { if (ddraw->fpsLimiter.hTimer) { - FILETIME ft = { 0 }; - GetSystemTimeAsFileTime(&ft); - - if (CompareFileTime((FILETIME *)&ddraw->fpsLimiter.dueTime, &ft) == -1) + if (ddraw->vsync) { - memcpy(&ddraw->fpsLimiter.dueTime, &ft, sizeof(LARGE_INTEGER)); + WaitForSingleObject(ddraw->fpsLimiter.hTimer, ddraw->fpsLimiter.ticklength * 2); + LARGE_INTEGER liDueTime = { .QuadPart = -ddraw->fpsLimiter.tickLengthNs }; + SetWaitableTimer(ddraw->fpsLimiter.hTimer, &liDueTime, 0, NULL, NULL, FALSE); } else { - WaitForSingleObject(ddraw->fpsLimiter.hTimer, ddraw->fpsLimiter.ticklength * 2); - } + FILETIME ft = { 0 }; + GetSystemTimeAsFileTime(&ft); - ddraw->fpsLimiter.dueTime.QuadPart += ddraw->fpsLimiter.tickLengthNs; - SetWaitableTimer(ddraw->fpsLimiter.hTimer, &ddraw->fpsLimiter.dueTime, 0, NULL, NULL, FALSE); + if (CompareFileTime((FILETIME *)&ddraw->fpsLimiter.dueTime, &ft) == -1) + { + memcpy(&ddraw->fpsLimiter.dueTime, &ft, sizeof(LARGE_INTEGER)); + } + else + { + WaitForSingleObject(ddraw->fpsLimiter.hTimer, ddraw->fpsLimiter.ticklength * 2); + } + + ddraw->fpsLimiter.dueTime.QuadPart += ddraw->fpsLimiter.tickLengthNs; + SetWaitableTimer(ddraw->fpsLimiter.hTimer, &ddraw->fpsLimiter.dueTime, 0, NULL, NULL, FALSE); + } } else { diff --git a/src/settings.c b/src/settings.c index abb2d65..4bfaf3e 100644 --- a/src/settings.c +++ b/src/settings.c @@ -48,12 +48,10 @@ void Settings_Load() WindowRect.top = GetInt("posY", -32000); ddraw->render.maxfps = GetInt("maxfps", 125); - if (ddraw->render.maxfps <= 1000) - { - if (ddraw->accurateTimers) - ddraw->fpsLimiter.hTimer = CreateWaitableTimer(NULL, TRUE, NULL); - //can't fully set it up here due to missing ddraw->mode.dmDisplayFrequency - } + + if (ddraw->accurateTimers || ddraw->vsync) + ddraw->fpsLimiter.hTimer = CreateWaitableTimer(NULL, TRUE, NULL); + //can't fully set it up here due to missing ddraw->mode.dmDisplayFrequency int maxTicks = GetInt("maxgameticks", 0); if (maxTicks > 0 && maxTicks <= 1000)