1
0
mirror of https://github.com/FunkyFr3sh/cnc-ddraw.git synced 2025-03-24 17:49:52 +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);
@ -793,20 +795,29 @@ static void Render()
{ {
if (ddraw->fpsLimiter.hTimer) if (ddraw->fpsLimiter.hTimer)
{ {
FILETIME ft = { 0 }; if (ddraw->vsync)
GetSystemTimeAsFileTime(&ft);
if (CompareFileTime((FILETIME *)&ddraw->fpsLimiter.dueTime, &ft) == -1)
{ {
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 else
{ {
WaitForSingleObject(ddraw->fpsLimiter.hTimer, ddraw->fpsLimiter.ticklength * 2); FILETIME ft = { 0 };
} GetSystemTimeAsFileTime(&ft);
ddraw->fpsLimiter.dueTime.QuadPart += ddraw->fpsLimiter.tickLengthNs; if (CompareFileTime((FILETIME *)&ddraw->fpsLimiter.dueTime, &ft) == -1)
SetWaitableTimer(ddraw->fpsLimiter.hTimer, &ddraw->fpsLimiter.dueTime, 0, NULL, NULL, FALSE); {
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 else
{ {

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)
@ -419,25 +419,34 @@ DWORD WINAPI render_d3d9_main(void)
#if _DEBUG #if _DEBUG
DrawFrameInfoEnd(); DrawFrameInfoEnd();
#endif #endif
if (ddraw->fpsLimiter.ticklength > 0) if (ddraw->fpsLimiter.ticklength > 0)
{ {
if (ddraw->fpsLimiter.hTimer) if (ddraw->fpsLimiter.hTimer)
{ {
FILETIME ft = { 0 }; if (ddraw->vsync)
GetSystemTimeAsFileTime(&ft);
if (CompareFileTime((FILETIME *)&ddraw->fpsLimiter.dueTime, &ft) == -1)
{ {
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 else
{ {
WaitForSingleObject(ddraw->fpsLimiter.hTimer, ddraw->fpsLimiter.ticklength * 2); FILETIME ft = { 0 };
} GetSystemTimeAsFileTime(&ft);
ddraw->fpsLimiter.dueTime.QuadPart += ddraw->fpsLimiter.tickLengthNs; if (CompareFileTime((FILETIME *)&ddraw->fpsLimiter.dueTime, &ft) == -1)
SetWaitableTimer(ddraw->fpsLimiter.hTimer, &ddraw->fpsLimiter.dueTime, 0, NULL, NULL, FALSE); {
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 else
{ {

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)