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:
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.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
|
||||
{
|
||||
|
@ -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
|
||||
{
|
||||
|
@ -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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user