mirror of
https://github.com/FunkyFr3sh/cnc-ddraw.git
synced 2025-03-24 17:49:52 +01:00
adjust fps limiter for gdi renderer
This commit is contained in:
parent
0b365ac275
commit
da09069d7b
@ -94,7 +94,6 @@ typedef struct IDirectDrawImpl
|
|||||||
|
|
||||||
HANDLE thread;
|
HANDLE thread;
|
||||||
BOOL run;
|
BOOL run;
|
||||||
HANDLE ev;
|
|
||||||
HANDLE sem;
|
HANDLE sem;
|
||||||
DEVMODE mode;
|
DEVMODE mode;
|
||||||
struct { int width; int height; int x; int y; } viewport;
|
struct { int width; int height; int x; int y; } viewport;
|
||||||
|
@ -1777,12 +1777,6 @@ ULONG __stdcall ddraw_Release(IDirectDrawImpl *This)
|
|||||||
ReleaseDC(This->hWnd, This->render.hDC);
|
ReleaseDC(This->hWnd, This->render.hDC);
|
||||||
This->render.hDC = NULL;
|
This->render.hDC = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(This->render.ev)
|
|
||||||
{
|
|
||||||
CloseHandle(This->render.ev);
|
|
||||||
ddraw->render.ev = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (This->ticksLimiter.hTimer)
|
if (This->ticksLimiter.hTimer)
|
||||||
{
|
{
|
||||||
@ -1919,7 +1913,6 @@ HRESULT WINAPI DirectDrawCreate(GUID FAR* lpGUID, LPDIRECTDRAW FAR* lplpDD, IUnk
|
|||||||
}
|
}
|
||||||
|
|
||||||
InitializeCriticalSection(&This->cs);
|
InitializeCriticalSection(&This->cs);
|
||||||
This->render.ev = CreateEvent(NULL, TRUE, FALSE, NULL);
|
|
||||||
This->render.sem = CreateSemaphore(NULL, 0, 1, NULL);
|
This->render.sem = CreateSemaphore(NULL, 0, 1, NULL);
|
||||||
|
|
||||||
This->wine = GetProcAddress(GetModuleHandleA("ntdll.dll"), "wine_get_version") != 0;
|
This->wine = GetProcAddress(GetModuleHandleA("ntdll.dll"), "wine_get_version") != 0;
|
||||||
|
@ -42,7 +42,8 @@ DWORD WINAPI render_soft_main(void)
|
|||||||
|
|
||||||
Sleep(500);
|
Sleep(500);
|
||||||
|
|
||||||
DWORD lastTick = 0;
|
DWORD tickStart = 0;
|
||||||
|
DWORD tickEnd = 0;
|
||||||
int maxFPS = ddraw->render.maxfps;
|
int maxFPS = ddraw->render.maxfps;
|
||||||
ddraw->fpsLimiter.tickLengthNs = 0;
|
ddraw->fpsLimiter.tickLengthNs = 0;
|
||||||
ddraw->fpsLimiter.ticklength = 0;
|
ddraw->fpsLimiter.ticklength = 0;
|
||||||
@ -62,23 +63,13 @@ DWORD WINAPI render_soft_main(void)
|
|||||||
|
|
||||||
while (ddraw->render.run && WaitForSingleObject(ddraw->render.sem, INFINITE) != WAIT_FAILED)
|
while (ddraw->render.run && WaitForSingleObject(ddraw->render.sem, INFINITE) != WAIT_FAILED)
|
||||||
{
|
{
|
||||||
if (ddraw->fpsLimiter.ticklength > 0)
|
|
||||||
{
|
|
||||||
DWORD curTick = timeGetTime();
|
|
||||||
if (lastTick + ddraw->fpsLimiter.ticklength > curTick)
|
|
||||||
{
|
|
||||||
ReleaseSemaphore(ddraw->render.sem, 1, NULL);
|
|
||||||
SetEvent(ddraw->render.ev);
|
|
||||||
SwitchToThread();
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
lastTick = curTick;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if _DEBUG
|
#if _DEBUG
|
||||||
DrawFrameInfoStart();
|
DrawFrameInfoStart();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
if (ddraw->fpsLimiter.ticklength > 0)
|
||||||
|
tickStart = timeGetTime();
|
||||||
|
|
||||||
EnterCriticalSection(&ddraw->cs);
|
EnterCriticalSection(&ddraw->cs);
|
||||||
|
|
||||||
if (ddraw->primary && (ddraw->bpp == 16 || (ddraw->primary->palette && ddraw->primary->palette->data_rgb)))
|
if (ddraw->primary && (ddraw->bpp == 16 || (ddraw->primary->palette && ddraw->primary->palette->data_rgb)))
|
||||||
@ -168,7 +159,33 @@ DWORD WINAPI render_soft_main(void)
|
|||||||
DrawFrameInfoEnd();
|
DrawFrameInfoEnd();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
SetEvent(ddraw->render.ev);
|
if (ddraw->fpsLimiter.ticklength > 0)
|
||||||
|
{
|
||||||
|
if (ddraw->fpsLimiter.hTimer)
|
||||||
|
{
|
||||||
|
FILETIME ft = { 0 };
|
||||||
|
GetSystemTimeAsFileTime(&ft);
|
||||||
|
|
||||||
|
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
|
||||||
|
{
|
||||||
|
tickEnd = timeGetTime();
|
||||||
|
|
||||||
|
if (tickEnd - tickStart < ddraw->fpsLimiter.ticklength)
|
||||||
|
Sleep(ddraw->fpsLimiter.ticklength - (tickEnd - tickStart));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
@ -466,15 +466,7 @@ HRESULT __stdcall ddraw_surface_Blt(IDirectDrawSurfaceImpl *This, LPRECT lpDestR
|
|||||||
{
|
{
|
||||||
InterlockedExchange(&ddraw->render.surfaceUpdated, TRUE);
|
InterlockedExchange(&ddraw->render.surfaceUpdated, TRUE);
|
||||||
ReleaseSemaphore(ddraw->render.sem, 1, NULL);
|
ReleaseSemaphore(ddraw->render.sem, 1, NULL);
|
||||||
if (ddraw->renderer == render_soft_main)
|
SwitchToThread();
|
||||||
{
|
|
||||||
WaitForSingleObject(ddraw->render.ev, INFINITE);
|
|
||||||
ResetEvent(ddraw->render.ev);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
SwitchToThread();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ddraw->ticksLimiter.ticklength > 0)
|
if (ddraw->ticksLimiter.ticklength > 0)
|
||||||
{
|
{
|
||||||
@ -696,18 +688,8 @@ HRESULT __stdcall ddraw_surface_Flip(IDirectDrawSurfaceImpl *This, LPDIRECTDRAWS
|
|||||||
This->lastFlipTick = timeGetTime();
|
This->lastFlipTick = timeGetTime();
|
||||||
|
|
||||||
InterlockedExchange(&ddraw->render.surfaceUpdated, TRUE);
|
InterlockedExchange(&ddraw->render.surfaceUpdated, TRUE);
|
||||||
|
ReleaseSemaphore(ddraw->render.sem, 1, NULL);
|
||||||
if (ddraw->renderer == render_soft_main)
|
SwitchToThread();
|
||||||
{
|
|
||||||
ResetEvent(ddraw->render.ev);
|
|
||||||
ReleaseSemaphore(ddraw->render.sem, 1, NULL);
|
|
||||||
WaitForSingleObject(ddraw->render.ev, INFINITE);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ReleaseSemaphore(ddraw->render.sem, 1, NULL);
|
|
||||||
SwitchToThread();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (flags & DDFLIP_WAIT)
|
if (flags & DDFLIP_WAIT)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user