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:
parent
167bb4238c
commit
32fff11093
35
src/render.c
35
src/render.c
@ -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
|
||||||
{
|
{
|
||||||
|
@ -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
|
||||||
{
|
{
|
||||||
|
@ -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)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user