1
0
mirror of https://github.com/FunkyFr3sh/cnc-ddraw.git synced 2025-03-15 14:14:47 +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.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
{

View File

@ -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
{

View File

@ -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)