1
0
mirror of https://github.com/FunkyFr3sh/cnc-ddraw.git synced 2025-03-26 02:19:24 +01:00

reduce vsync input lag

This commit is contained in:
FunkyFr3sh 2018-12-10 04:24:30 +01:00
parent 167bb4238c
commit 32fff11093
3 changed files with 48 additions and 30 deletions

View File

@ -118,6 +118,7 @@ static void SetMaxFPS()
ddraw->fpsLimiter.tickLengthNs = 0; ddraw->fpsLimiter.tickLengthNs = 0;
ddraw->fpsLimiter.ticklength = 0; ddraw->fpsLimiter.ticklength = 0;
/*
if (OpenGL_ExtExists("WGL_EXT_swap_control_tear", ddraw->render.hDC)) if (OpenGL_ExtExists("WGL_EXT_swap_control_tear", ddraw->render.hDC))
{ {
if (wglSwapIntervalEXT) if (wglSwapIntervalEXT)
@ -125,20 +126,21 @@ static void SetMaxFPS()
if (ddraw->vsync) if (ddraw->vsync)
{ {
wglSwapIntervalEXT(-1); wglSwapIntervalEXT(-1);
maxFPS = 0; maxFPS = ddraw->mode.dmDisplayFrequency;
} }
else else
wglSwapIntervalEXT(0); 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 (wglSwapIntervalEXT)
{ {
if (ddraw->vsync) if (ddraw->vsync)
{ {
wglSwapIntervalEXT(1); wglSwapIntervalEXT(1);
maxFPS = 0; maxFPS = ddraw->mode.dmDisplayFrequency;
} }
else else
wglSwapIntervalEXT(0); wglSwapIntervalEXT(0);
@ -792,6 +794,14 @@ static void Render()
if (ddraw->fpsLimiter.ticklength > 0) if (ddraw->fpsLimiter.ticklength > 0)
{ {
if (ddraw->fpsLimiter.hTimer) if (ddraw->fpsLimiter.hTimer)
{
if (ddraw->vsync)
{
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
{ {
FILETIME ft = { 0 }; FILETIME ft = { 0 };
GetSystemTimeAsFileTime(&ft); GetSystemTimeAsFileTime(&ft);
@ -808,6 +818,7 @@ static void Render()
ddraw->fpsLimiter.dueTime.QuadPart += ddraw->fpsLimiter.tickLengthNs; ddraw->fpsLimiter.dueTime.QuadPart += ddraw->fpsLimiter.tickLengthNs;
SetWaitableTimer(ddraw->fpsLimiter.hTimer, &ddraw->fpsLimiter.dueTime, 0, NULL, NULL, FALSE); SetWaitableTimer(ddraw->fpsLimiter.hTimer, &ddraw->fpsLimiter.dueTime, 0, NULL, NULL, FALSE);
} }
}
else else
{ {
tickEnd = timeGetTime(); tickEnd = timeGetTime();

View File

@ -278,10 +278,10 @@ static void SetMaxFPS()
ddraw->fpsLimiter.tickLengthNs = 0; ddraw->fpsLimiter.tickLengthNs = 0;
ddraw->fpsLimiter.ticklength = 0; ddraw->fpsLimiter.ticklength = 0;
if (maxFPS < 0) if (maxFPS < 0 || ddraw->vsync)
maxFPS = ddraw->mode.dmDisplayFrequency; maxFPS = ddraw->mode.dmDisplayFrequency;
if (maxFPS > 1000 || ddraw->vsync) if (maxFPS > 1000)
maxFPS = 0; maxFPS = 0;
if (maxFPS > 0) if (maxFPS > 0)
@ -423,6 +423,14 @@ DWORD WINAPI render_d3d9_main(void)
if (ddraw->fpsLimiter.ticklength > 0) if (ddraw->fpsLimiter.ticklength > 0)
{ {
if (ddraw->fpsLimiter.hTimer) if (ddraw->fpsLimiter.hTimer)
{
if (ddraw->vsync)
{
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
{ {
FILETIME ft = { 0 }; FILETIME ft = { 0 };
GetSystemTimeAsFileTime(&ft); GetSystemTimeAsFileTime(&ft);
@ -439,6 +447,7 @@ DWORD WINAPI render_d3d9_main(void)
ddraw->fpsLimiter.dueTime.QuadPart += ddraw->fpsLimiter.tickLengthNs; ddraw->fpsLimiter.dueTime.QuadPart += ddraw->fpsLimiter.tickLengthNs;
SetWaitableTimer(ddraw->fpsLimiter.hTimer, &ddraw->fpsLimiter.dueTime, 0, NULL, NULL, FALSE); SetWaitableTimer(ddraw->fpsLimiter.hTimer, &ddraw->fpsLimiter.dueTime, 0, NULL, NULL, FALSE);
} }
}
else else
{ {
tickEnd = timeGetTime(); tickEnd = timeGetTime();

View File

@ -48,12 +48,10 @@ void Settings_Load()
WindowRect.top = GetInt("posY", -32000); WindowRect.top = GetInt("posY", -32000);
ddraw->render.maxfps = GetInt("maxfps", 125); ddraw->render.maxfps = GetInt("maxfps", 125);
if (ddraw->render.maxfps <= 1000)
{ if (ddraw->accurateTimers || ddraw->vsync)
if (ddraw->accurateTimers)
ddraw->fpsLimiter.hTimer = CreateWaitableTimer(NULL, TRUE, NULL); ddraw->fpsLimiter.hTimer = CreateWaitableTimer(NULL, TRUE, NULL);
//can't fully set it up here due to missing ddraw->mode.dmDisplayFrequency //can't fully set it up here due to missing ddraw->mode.dmDisplayFrequency
}
int maxTicks = GetInt("maxgameticks", 0); int maxTicks = GetInt("maxgameticks", 0);
if (maxTicks > 0 && maxTicks <= 1000) if (maxTicks > 0 && maxTicks <= 1000)