diff --git a/engine/client/cl_input.c b/engine/client/cl_input.c index 456f3c478..de613ca6e 100644 --- a/engine/client/cl_input.c +++ b/engine/client/cl_input.c @@ -1029,7 +1029,7 @@ void CL_AllowIndependantSendCmd(qboolean allow) int CL_IndepPhysicsThread(void *param) { - unsigned int sleeptime; + double sleeptime; double fps; double time, lasttime; double spare; @@ -1058,7 +1058,7 @@ int CL_IndepPhysicsThread(void *param) while (fps < 100) fps*=2; - sleeptime = (1000*1000)/fps; + sleeptime = 1/fps; Sys_Sleep(sleeptime); } diff --git a/engine/client/cl_main.c b/engine/client/cl_main.c index ff1998c8e..687b9c090 100644 --- a/engine/client/cl_main.c +++ b/engine/client/cl_main.c @@ -48,6 +48,7 @@ cvar_t cl_shownet = SCVAR("cl_shownet","0"); // can be 0, 1, or 2 cvar_t cl_sbar = CVARFC("cl_sbar", "0", CVAR_ARCHIVE, CL_Sbar_Callback); cvar_t cl_hudswap = CVARF("cl_hudswap", "0", CVAR_ARCHIVE); cvar_t cl_maxfps = CVARF("cl_maxfps", "500", CVAR_ARCHIVE); +cvar_t cl_idlefps = CVARF("cl_idlefps", "0", CVAR_ARCHIVE); cvar_t cl_nopext = CVARF("cl_nopext", "0", CVAR_ARCHIVE); cvar_t cl_pext_mask = CVAR("cl_pext_mask", "0xffffffff"); cvar_t cl_nolerp = CVAR("cl_nolerp", "2"); @@ -3001,6 +3002,7 @@ void CL_Init (void) Cvar_Register (&cl_sbar, cl_screengroup); Cvar_Register (&cl_hudswap, cl_screengroup); Cvar_Register (&cl_maxfps, cl_screengroup); + Cvar_Register (&cl_idlefps, cl_screengroup); Cvar_Register (&cl_timeout, cl_controlgroup); Cvar_Register (&lookspring, cl_inputgroup); Cvar_Register (&lookstrafe, cl_inputgroup); @@ -3349,7 +3351,7 @@ extern cvar_t cl_sparemsec; int nopacketcount; void SNDDMA_SetUnderWater(qboolean underwater); -float Host_Frame (double time) +double Host_Frame (double time) { static double time1 = 0; static double time2 = 0; @@ -3360,6 +3362,7 @@ float Host_Frame (double time) static double spare; float maxfps; qboolean maxfpsignoreserver; + qboolean idle; RSpeedLocals(); @@ -3401,6 +3404,22 @@ float Host_Frame (double time) if (cl.paused) cl.gametimemark += time; + idle = (cls.state == ca_disconnected) || + UI_MenuState() != 0 || + key_dest == key_menu || + key_dest == key_editor || + cl.paused; + // TODO: check if minimized or unfocused + + if (idle && cl_idlefps.value > 0) + { + double idlesec = 1.0 / cl_idlefps.value; + if (idlesec > 0.1) + idlesec = 0.1; // limit to at least 10 fps + if ((realtime - oldrealtime) < idlesec) + return idlesec - (realtime - oldrealtime); + } + /* if (cl_maxfps.value) fps = cl_maxfps.value;//max(30.0, min(cl_maxfps.value, 72.0)); @@ -3432,7 +3451,7 @@ float Host_Frame (double time) realtime += spare/1000; //don't use it all! spare = CL_FilterTime((realtime - oldrealtime)*1000, maxfps, maxfpsignoreserver); if (!spare) - return 1; + return 0; if (spare < 0 || cls.state < ca_onserver) spare = 0; //uncapped. if (spare > cl_sparemsec.ival) @@ -3473,7 +3492,7 @@ float Host_Frame (double time) #ifndef CLIENTONLY if (isDedicated) //someone changed it. - return true; + return 0; #endif cls.framecount++; diff --git a/engine/client/quakedef.h b/engine/client/quakedef.h index 6ee65337d..8608e9247 100644 --- a/engine/client/quakedef.h +++ b/engine/client/quakedef.h @@ -252,7 +252,7 @@ void Host_Shutdown(void); NORETURN void VARGS Host_Error (char *error, ...) LIKEPRINTF(1); NORETURN void VARGS Host_EndGame (char *message, ...) LIKEPRINTF(1); qboolean Host_SimulationTime(float time); -float Host_Frame (double time); +double Host_Frame (double time); void Host_Quit_f (void); void VARGS Host_ClientCommands (char *fmt, ...) LIKEPRINTF(1); void Host_ShutdownServer (qboolean crash); diff --git a/engine/client/renderer.c b/engine/client/renderer.c index 99d183d9d..79313bfdf 100644 --- a/engine/client/renderer.c +++ b/engine/client/renderer.c @@ -988,16 +988,6 @@ q2colormap: TRACE(("dbg: R_ApplyRenderer: Palette loaded\n")); -#ifdef _WIN32 -#ifndef _SDL - if (hwnd_dialog) - { - DestroyWindow (hwnd_dialog); - hwnd_dialog = NULL; - } -#endif -#endif - if (newr) if (!VID_Init(newr, host_basepal)) { diff --git a/engine/client/sys_linux.c b/engine/client/sys_linux.c index 6df598f9a..4755c8c65 100644 --- a/engine/client/sys_linux.c +++ b/engine/client/sys_linux.c @@ -25,6 +25,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include #include +#include #include #include #include @@ -591,14 +592,6 @@ char *Sys_ConsoleInput(void) return NULL; } -void Sys_HighFPPrecision (void) -{ -} - -void Sys_LowFPPrecision (void) -{ -} - int main (int c, const char **v) { double time, oldtime, newtime; @@ -639,6 +632,8 @@ int main (int c, const char **v) oldtime = Sys_DoubleTime (); while (1) { + double sleeptime; + #ifdef __MACOSX__ //wow, not even windows was this absurd. #ifdef RGLQUAKE @@ -654,8 +649,10 @@ int main (int c, const char **v) newtime = Sys_DoubleTime (); time = newtime - oldtime; - Host_Frame(time); + sleeptime = Host_Frame(time); oldtime = newtime; + + Sys_Sleep(sleeptime); } } @@ -878,9 +875,15 @@ void Sys_DestroyConditional(void *condv) free(cv->mutex); free(cv); } - -void Sys_Sleep (unsigned int microseconds) -{ - usleep(microseconds); -} #endif + +void Sys_Sleep (double seconds) +{ + struct timespec ts; + + ts.tv_sec = (time_t)seconds; + seconds -= ts.tv_sec; + ts.tv_nsec = seconds * 1000000000.0; + + nanosleep(&ts, NULL); +} diff --git a/engine/client/sys_morphos.c b/engine/client/sys_morphos.c index 89e846b60..d09239733 100755 --- a/engine/client/sys_morphos.c +++ b/engine/client/sys_morphos.c @@ -423,9 +423,13 @@ int main(int argc, char **argv) oldtime = Sys_DoubleTime (); while(!(SetSignal(0, 0)&SIGBREAKF_CTRL_C)) { + double sleeptime; + newtime = Sys_DoubleTime (); - Host_Frame(newtime - oldtime); + sleeptime = Host_Frame(newtime - oldtime); oldtime = newtime; + + Sys_Sleep(sleeptime); } } @@ -468,14 +472,7 @@ qboolean Sys_GetDesktopParameters(int *width, int *height, int *bpp, int *refres return false; } -/* x86 crap */ -void Sys_HighFPPrecision (void) -{ -} -void Sys_LowFPPrecision (void) -{ -} #ifdef MULTITHREAD /* Everything here is stubbed because I don't know MorphOS */ @@ -496,6 +493,6 @@ qboolean Sys_ConditionWait(void *condv) { return false; } qboolean Sys_ConditionSignal(void *condv) { return false; } qboolean Sys_ConditionBroadcast(void *condv) { return false; } void Sys_DestroyConditional(void *condv) {} - -void Sys_Sleep(int microseconds) {} #endif + +void Sys_Sleep(double seconds) {} diff --git a/engine/client/sys_sdl.c b/engine/client/sys_sdl.c index 577d85d87..8b5e78e5b 100644 --- a/engine/client/sys_sdl.c +++ b/engine/client/sys_sdl.c @@ -542,14 +542,18 @@ int main(int argc, char **argv) else #endif { + double sleeptime; + // yield the CPU for a little while when paused, minimized, or not the focus if (!(SDL_GetAppState() & SDL_APPACTIVE)) SDL_Delay(1); newtime = Sys_DoubleTime (); time = newtime - oldtime; - Host_Frame (time); + sleeptime = Host_Frame (time); oldtime = newtime; + + Sys_Sleep(sleeptime); } } return 0; @@ -560,14 +564,6 @@ qboolean Sys_GetDesktopParameters(int *width, int *height, int *bpp, int *refres return false; } -void Sys_HighFPPrecision(void) -{ -} - -void Sys_LowFPPrecision(void) -{ -} - @@ -694,9 +690,9 @@ void Sys_DestroyConditional(void *condv) free(cv); } -void Sys_Sleep (unsigned int microseconds) +void Sys_Sleep (double seconds) { - SDL_Delay(microseconds / 1000000); + SDL_Delay(seconds * 1000); } #endif diff --git a/engine/client/sys_win.c b/engine/client/sys_win.c index 6fd0826fb..89ce54118 100644 --- a/engine/client/sys_win.c +++ b/engine/client/sys_win.c @@ -267,8 +267,6 @@ int starttime; qboolean ActiveApp, Minimized; qboolean WinNT; -HWND hwnd_dialog; // startup dialog box - static HANDLE hinput, houtput; HANDLE qwclsemaphore; @@ -1063,11 +1061,6 @@ qboolean Sys_InitTerminal (void) } #endif - //if we still have the splash screen, kill it - if (hwnd_dialog) - DestroyWindow(hwnd_dialog); - hwnd_dialog = NULL; - SetConsoleCtrlHandler (HandlerRoutine, TRUE); SetConsoleTitle (FULLENGINENAME " dedicated server"); hinput = GetStdHandle (STD_INPUT_HANDLE); @@ -1239,13 +1232,16 @@ void NPQTV_Sys_MainLoop(void) else { #ifndef SERVERONLY + double sleeptime; + newtime = Sys_DoubleTime (); duratrion = newtime - lastlooptime; - Host_Frame (duratrion); + sleeptime = Host_Frame (duratrion); lastlooptime = newtime; SetHookState(sys_disableWinKeys.ival); + Sys_Sleep(sleeptime); // Sleep(0); #else Sys_Error("wut?"); @@ -1595,35 +1591,10 @@ int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLin if (isDedicated) { #if !defined(CLIENTONLY) - hwnd_dialog=NULL; - if (!Sys_InitTerminal()) Sys_Error ("Couldn't allocate dedicated server console"); #endif } - #ifdef IDD_DIALOG1 - else - hwnd_dialog = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, NULL); - - if (hwnd_dialog) - { - RECT rect; - if (GetWindowRect (hwnd_dialog, &rect)) - { - if (rect.left > (rect.top * 2)) - { - SetWindowPos (hwnd_dialog, 0, - (rect.left / 2) - ((rect.right - rect.left) / 2), - rect.top, 0, 0, - SWP_NOZORDER | SWP_NOSIZE); - } - } - - ShowWindow (hwnd_dialog, SW_SHOWDEFAULT); - UpdateWindow (hwnd_dialog); - SetForegroundWindow (hwnd_dialog); - } - #endif if (!Sys_Startup_CheckMem(&parms)) Sys_Error ("Not enough memory free; check disk space\n"); @@ -1715,7 +1686,7 @@ int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLin else { #ifndef SERVERONLY - int sleeptime; + double sleeptime; newtime = Sys_DoubleTime (); time = newtime - oldtime; sleeptime = Host_Frame (time); @@ -1724,8 +1695,7 @@ int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLin SetHookState(sys_disableWinKeys.ival); /*sleep if its not yet time for a frame*/ - //if (sleeptime > 0) - // Sleep(sleeptime); + Sys_Sleep(sleeptime); #else Sys_Error("wut?"); #endif @@ -1789,23 +1759,6 @@ qboolean Sys_GetDesktopParameters(int *width, int *height, int *bpp, int *refres return true; } - -void Sys_HighFPPrecision (void) -{ -} - -void Sys_LowFPPrecision (void) -{ -} - -void VARGS Sys_SetFPCW (void) -{ -} - -void VARGS MaskExceptions (void) -{ -} - #ifdef MULTITHREAD /* Thread creation calls */ typedef struct threadwrap_s @@ -2050,9 +2003,9 @@ void Sys_DestroyConditional(void *condv) DeleteCriticalSection(&cv->mainlock); free(cv); } - -void Sys_Sleep (unsigned int microseconds) -{ - Sleep(microseconds / 1000000); -} #endif + +void Sys_Sleep (double seconds) +{ + Sleep(seconds * 1000); +} diff --git a/engine/client/winquake.h b/engine/client/winquake.h index 5e9e41e99..e117b3b12 100644 --- a/engine/client/winquake.h +++ b/engine/client/winquake.h @@ -83,7 +83,6 @@ extern int window_center_x, window_center_y; extern RECT window_rect; extern qboolean mouseinitialized; -extern HWND hwnd_dialog; //extern HANDLE hinput, houtput; diff --git a/engine/common/sys.h b/engine/common/sys.h index 63b4260b2..758cb590f 100644 --- a/engine/common/sys.h +++ b/engine/common/sys.h @@ -107,10 +107,10 @@ qboolean Sys_ConditionWait(void *condv); qboolean Sys_ConditionSignal(void *condv); qboolean Sys_ConditionBroadcast(void *condv); void Sys_DestroyConditional(void *condv); - -void Sys_Sleep(unsigned int microseconds); #endif +void Sys_Sleep(double seconds); + #ifdef NPQTV qboolean NPQTV_Sys_Startup(int argc, char *argv[]); void NPQTV_Sys_MainLoop(void); diff --git a/engine/gl/gl_vidnt.c b/engine/gl/gl_vidnt.c index 2520523a6..fcc575a4a 100644 --- a/engine/gl/gl_vidnt.c +++ b/engine/gl/gl_vidnt.c @@ -1881,9 +1881,6 @@ qboolean GLVID_Init (rendererstate_t *info, unsigned char *palette) vid.colormap = host_colormap; - if (hwnd_dialog) - DestroyWindow (hwnd_dialog); - VID_SetPalette (palette); if (!GLVID_SetMode (info, palette)) diff --git a/engine/qclib/qcdecomp.c b/engine/qclib/qcdecomp.c index bb564f847..a8d466e13 100644 --- a/engine/qclib/qcdecomp.c +++ b/engine/qclib/qcdecomp.c @@ -714,7 +714,7 @@ void WriteAsmStatements(progfuncs_t *progfuncs, progstate_t *progs, int num, int break; case ev_vector: if (v->_vector[0] || v->_vector[1] || v->_vector[2]) - writes(f, "\tlocal vector %s = '%f %f %f';\r\n", def->s_name, v->_vector[0], v->_vector[1], v->_vector[2]); + writes(f, "\tlocal vector %s = '%f %f %f';\r\n", progfuncs->stringtable+def->s_name, v->_vector[0], v->_vector[1], v->_vector[2]); else writes(f, "\tlocal %s %s;\r\n", "vector",progfuncs->stringtable+def->s_name); ofs+=2; //skip floats; diff --git a/engine/server/sv_sys_unix.c b/engine/server/sv_sys_unix.c index 93f3a8170..40f00db06 100644 --- a/engine/server/sv_sys_unix.c +++ b/engine/server/sv_sys_unix.c @@ -36,6 +36,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include #include +#include #ifdef MULTITHREAD #include @@ -1049,10 +1050,15 @@ void Sys_DestroyConditional(void *condv) free(cv->mutex); free(cv); } - -void Sys_Sleep (unsigned int microseconds) -{ - usleep(microseconds); -} #endif +void Sys_Sleep (double seconds) +{ + struct timespec ts; + + ts.tv_sec = (time_t)seconds; + seconds -= ts.tv_sec; + ts.tv_nsec = seconds * 1000000000.0; + + nanosleep(&ts, NULL); +} diff --git a/engine/server/sv_sys_win.c b/engine/server/sv_sys_win.c index 281e942ec..17b5ef751 100644 --- a/engine/server/sv_sys_win.c +++ b/engine/server/sv_sys_win.c @@ -1634,11 +1634,10 @@ void Sys_DestroyConditional(void *condv) DeleteCriticalSection(&cv->mainlock); free(cv); } +#endif -void Sys_Sleep (unsigned int microseconds) +void Sys_Sleep (double seconds) { - Sleep(microseconds / 1000000); + Sleep(seconds * 1000); } #endif - -#endif