Change Windows mainloop to microseconds.

While at it have another look at it's Sys_*seconds() implementations.
Also add a Sys_Nanosleep() and use it to throttle the game a litte bit.
This commit is contained in:
Yamagi Burmeister 2017-09-06 18:07:34 +02:00
parent 0c3c2976cf
commit d0cb89ff52
3 changed files with 39 additions and 30 deletions

View file

@ -41,6 +41,7 @@ main(int argc, char **argv)
int verLen, i; int verLen, i;
long long oldtime, newtime; long long oldtime, newtime;
const char* versionString; const char* versionString;
struct timespec t = {0, 5000};
/* register signal handler */ /* register signal handler */
registerHandler(); registerHandler();
@ -135,7 +136,7 @@ main(int argc, char **argv)
/* The mainloop. The legend. */ /* The mainloop. The legend. */
while (1) while (1)
{ {
struct timespec t = {0, 5000}; // Throttle the game a little bit.
nanosleep(&t, NULL); nanosleep(&t, NULL);
newtime = Sys_Microseconds(); newtime = Sys_Microseconds();

View file

@ -44,6 +44,7 @@
#include <errno.h> #include <errno.h>
#include <dlfcn.h> #include <dlfcn.h>
#include <dirent.h> #include <dirent.h>
#include <time.h>
#include "../../common/header/common.h" #include "../../common/header/common.h"
#include "../../common/header/glob.h" #include "../../common/header/glob.h"
@ -85,21 +86,24 @@ Sys_Microseconds(void)
static struct timespec last; static struct timespec last;
struct timespec now; struct timespec now;
clock_gettime(CLOCK_REALTIME, &now); clock_gettime(CLOCK_MONOTONIC, &now);
if(last.tv_sec == 0) if(last.tv_sec == 0)
{ {
clock_gettime(CLOCK_REALTIME, &last); clock_gettime(CLOCK_MONOTONIC, &last);
return last.tv_nsec / 1000ll; return last.tv_nsec / 1000ll;
} }
long long sec = now.tv_sec - last.tv_sec; long long sec = now.tv_sec - last.tv_sec;
long long nsec = now.tv_nsec - last.tv_nsec; long long nsec = now.tv_nsec - last.tv_nsec;
if(nsec < 0) if(nsec < 0)
{ {
nsec += 1000000000ll; // 1s in ns nsec += 1000000000ll; // 1s in ns
--sec; --sec;
} }
curtime = (int)((sec*1000000ll + nsec/1000ll) / 1000ll);
return sec*1000000ll + nsec/1000ll; return sec*1000000ll + nsec/1000ll;
} }

View file

@ -414,28 +414,10 @@ ParseCommandLine(LPSTR lpCmdLine)
/* ======================================================================= */ /* ======================================================================= */
int
Sys_Milliseconds(void)
{
static int base;
static qboolean initialized = false;
if (!initialized)
{ /* let base retain 16 bits of effectively random data */
base = timeGetTime() & 0xffff0000;
initialized = true;
}
curtime = timeGetTime() - base;
return curtime;
}
long long long long
Sys_Microseconds(void) Sys_Microseconds(void)
{ {
long long microseconds; long long microseconds;
long long seconds;
static long long uSecbase; static long long uSecbase;
FILETIME ft; FILETIME ft;
@ -457,15 +439,40 @@ Sys_Microseconds(void)
uSecbase = microseconds - 1001; uSecbase = microseconds - 1001;
} }
curtime = (int)((microseconds - uSecbase) / 1000ll);
return microseconds - uSecbase; return microseconds - uSecbase;
} }
int
Sys_Milliseconds(void)
{
curtime = (int)(Sys_Microseconds()/1000ll);
return curtime;
}
void void
Sys_Sleep(int msec) Sys_Sleep(int msec)
{ {
Sleep(msec); Sleep(msec);
} }
void Sys_Nanosleep(int nanosec)
{
HANDLE timer;
LARGE_INTEGER li;
timer = CreateWaitableTimer(NULL, TRUE, NULL);
// Windows has a max. resolution of 100ns.
li.QuadPart = -nanosec / 100;
SetWaitableTimer(timer, &li, 0, NULL, NULL, FALSE);
WaitForSingleObject(timer, INFINITE);
CloseHandle(timer);
}
/* ======================================================================= */ /* ======================================================================= */
static qboolean static qboolean
@ -774,7 +781,7 @@ WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow) LPSTR lpCmdLine, int nCmdShow)
{ {
MSG msg; MSG msg;
int time, oldtime, newtime; long long oldtime, newtime;
/* Previous instances do not exist in Win32 */ /* Previous instances do not exist in Win32 */
if (hPrevInstance) if (hPrevInstance)
@ -846,7 +853,7 @@ WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
Qcommon_Init(argc, argv); Qcommon_Init(argc, argv);
/* Save our time */ /* Save our time */
oldtime = Sys_Milliseconds(); oldtime = Sys_Microseconds();
/* The legendary main loop */ /* The legendary main loop */
while (1) while (1)
@ -869,14 +876,11 @@ WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
DispatchMessage(&msg); DispatchMessage(&msg);
} }
do // Throttle the game a little bit
{ Sys_Nanosleep(5000);
newtime = Sys_Milliseconds();
time = newtime - oldtime;
}
while (time < 1);
Qcommon_Frame(time); newtime = Sys_Microseconds();
Qcommon_Frame(newtime - oldtime);
oldtime = newtime; oldtime = newtime;
} }