X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=sys_win.c;h=1479e7c8f9a7ab8a5cdc8fb6a78283a2d0b98bdf;hb=483aebc27ed79f1477b144add31c6b09c58c2966;hp=f239daf6b0aeb957b4f54f77f1e793c9da276b77;hpb=ee1558ddc0664f2fa549a36e86e9748da225f584;p=xonotic%2Fdarkplaces.git diff --git a/sys_win.c b/sys_win.c index f239daf6..1479e7c8 100644 --- a/sys_win.c +++ b/sys_win.c @@ -19,8 +19,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ // sys_win.c -- Win32 system interface code -#define WIN32_USETIMEGETTIME 0 - #include "quakedef.h" #include "winquake.h" #include "errno.h" @@ -28,6 +26,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "conproc.h" #include "direct.h" +cvar_t sys_usetimegettime = {CVAR_SAVE, "sys_usetimegettime", "1"}; + // # of seconds to wait on Sys_Error running dedicated before exiting #define CONSOLE_ERROR_TIMEOUT 60.0 // sleep time on pause or minimization @@ -36,7 +36,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #define NOT_FOCUS_SLEEP 20 int starttime; -qboolean ActiveApp, Minimized; static qboolean sc_return_on_enter = false; HANDLE hinput, houtput; @@ -178,6 +177,8 @@ SYSTEM IO =============================================================================== */ +void SleepUntilInput (int time); + void Sys_Error (char *error, ...) { va_list argptr; @@ -277,45 +278,52 @@ double Sys_DoubleTime (void) static double oldtime = 0.0, curtime = 0.0; double newtime; // LordHavoc: note to people modifying this code, DWORD is specifically defined as an unsigned 32bit number, therefore the 65536.0 * 65536.0 is fine. -#if WIN32_USETIMEGETTIME - // timeGetTime - // platform: - // Windows 95/98/ME/NT/2000 - // features: - // reasonable accuracy (millisecond) - // issues: - // wraps around every 47 days or so (but this is non-fatal to us, odd times are rejected, only causes a one frame stutter) - - // make sure the timer is high precision, otherwise different versions of windows have varying accuracy - if (first) - timeBeginPeriod (1); - - newtime = (double) timeGetTime () / 1000.0; -#else - // QueryPerformanceCounter - // platform: - // Windows 95/98/ME/NT/2000 - // features: - // very accurate (CPU cycles) - // known issues: - // does not necessarily match realtime too well (tends to get faster and faster in win98) - // wraps around occasionally on some platforms (depends on CPU speed and probably other unknown factors) - static double timescale = 0.0; - LARGE_INTEGER PerformanceFreq; - LARGE_INTEGER PerformanceCount; - - if (!QueryPerformanceFrequency (&PerformanceFreq)) - Sys_Error ("No hardware timer available"); - QueryPerformanceCounter (&PerformanceCount); - -#ifdef __BORLANDC__ - timescale = 1.0 / ((double) PerformanceFreq.u.LowPart + (double) PerformanceFreq.u.HighPart * 65536.0 * 65536.0); - newtime = ((double) PerformanceCount.u.LowPart + (double) PerformanceCount.u.HighPart * 65536.0 * 65536.0) * timescale; -#else - timescale = 1.0 / ((double) PerformanceFreq.LowPart + (double) PerformanceFreq.HighPart * 65536.0 * 65536.0); - newtime = ((double) PerformanceCount.LowPart + (double) PerformanceCount.HighPart * 65536.0 * 65536.0) * timescale; -#endif -#endif + if (sys_usetimegettime.integer) + { + static int firsttimegettime = true; + // timeGetTime + // platform: + // Windows 95/98/ME/NT/2000/XP + // features: + // reasonable accuracy (millisecond) + // issues: + // wraps around every 47 days or so (but this is non-fatal to us, odd times are rejected, only causes a one frame stutter) + + // make sure the timer is high precision, otherwise different versions of windows have varying accuracy + if (firsttimegettime) + { + timeBeginPeriod (1); + firsttimegettime = false; + } + + newtime = (double) timeGetTime () / 1000.0; + } + else + { + // QueryPerformanceCounter + // platform: + // Windows 95/98/ME/NT/2000/XP + // features: + // very accurate (CPU cycles) + // known issues: + // does not necessarily match realtime too well (tends to get faster and faster in win98) + // wraps around occasionally on some platforms (depends on CPU speed and probably other unknown factors) + double timescale; + LARGE_INTEGER PerformanceFreq; + LARGE_INTEGER PerformanceCount; + + if (!QueryPerformanceFrequency (&PerformanceFreq)) + Sys_Error ("No hardware timer available"); + QueryPerformanceCounter (&PerformanceCount); + + #ifdef __BORLANDC__ + timescale = 1.0 / ((double) PerformanceFreq.u.LowPart + (double) PerformanceFreq.u.HighPart * 65536.0 * 65536.0); + newtime = ((double) PerformanceCount.u.LowPart + (double) PerformanceCount.u.HighPart * 65536.0 * 65536.0) * timescale; + #else + timescale = 1.0 / ((double) PerformanceFreq.LowPart + (double) PerformanceFreq.HighPart * 65536.0 * 65536.0); + newtime = ((double) PerformanceCount.LowPart + (double) PerformanceCount.HighPart * 65536.0 * 65536.0) * timescale; + #endif + } if (first) { @@ -324,12 +332,14 @@ double Sys_DoubleTime (void) } if (newtime < oldtime) - Con_Printf("Sys_DoubleTime: time running backwards??\n"); - else { - curtime += newtime - oldtime; - oldtime = newtime; + // warn if it's significant + if (newtime - oldtime < -0.01) + Con_Printf("Sys_DoubleTime: time stepped backwards (went from %f to %f, difference %f)\n", oldtime, newtime, newtime - oldtime); } + else + curtime += newtime - oldtime; + oldtime = newtime; return curtime; } @@ -465,7 +475,7 @@ static char *empty_string = ""; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { - double oldtime, newtime; + double frameoldtime, framenewtime; MEMORYSTATUS lpBuffer; static char cwd[1024]; int t; @@ -474,6 +484,8 @@ int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLin if (hPrevInstance) return 0; + Cvar_RegisterVariable(&sys_usetimegettime); + global_hInstance = hInstance; global_nCmdShow = nCmdShow; @@ -568,7 +580,7 @@ int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLin Sys_Shared_LateInit(); - oldtime = Sys_DoubleTime (); + frameoldtime = Sys_DoubleTime (); /* main window message loop */ while (1) @@ -576,18 +588,18 @@ int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLin if (cls.state != ca_dedicated) { // yield the CPU for a little while when paused, minimized, or not the focus - if ((cl.paused && !ActiveApp) || Minimized) + if ((cl.paused && !vid_activewindow) || vid_hidden) { SleepUntilInput (PAUSE_SLEEP); scr_skipupdate = 1; // no point in bothering to draw } - else if (!ActiveApp) + else if (!vid_activewindow) SleepUntilInput (NOT_FOCUS_SLEEP); } - newtime = Sys_DoubleTime (); - Host_Frame (newtime - oldtime); - oldtime = newtime; + framenewtime = Sys_DoubleTime (); + Host_Frame (framenewtime - frameoldtime); + frameoldtime = framenewtime; } /* return success of application */