X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=host.c;h=b419f8a963b8c75c55458689ec740051d1e6673d;hb=6fa2a4c4c869043c2b63f96aea7b861fe011e237;hp=7c165adbd9d73ee5228ab6d69971308cefdf2794;hpb=4d162c39ec059b7f3191fbb4fb18304bc9b1db59;p=xonotic%2Fdarkplaces.git diff --git a/host.c b/host.c index 7c165adb..b419f8a9 100644 --- a/host.c +++ b/host.c @@ -39,7 +39,6 @@ qboolean hostloopactive = 0; // LordHavoc: used to turn Host_Error into Sys_Err double host_frametime; double host_realframetime; // LordHavoc: the real frametime, before slowmo and clamping are applied (used for console scrolling) -double host_time; double realtime; // without any filtering or bounding double oldrealtime; // last frame run int host_framecount; @@ -120,7 +119,6 @@ This shuts down both the client and server ================ */ char hosterrorstring[4096]; -extern qboolean hostloopactive; void Host_Error (char *error, ...) { va_list argptr; @@ -146,7 +144,7 @@ void Host_Error (char *error, ...) } inerror = true; - SCR_EndLoadingPlaque (); // reenable screen updates +// SCR_EndLoadingPlaque (); // reenable screen updates va_start (argptr,error); vsprintf (hosterrorstring,error,argptr); @@ -255,8 +253,6 @@ void Host_InitLocal (void) Cvar_RegisterVariable (&timeformat); Host_FindMaxClients (); - - host_time = 1.0; // so a think at time 0 won't get called } @@ -269,13 +265,13 @@ Writes key bindings and archived cvars to config.cfg */ void Host_WriteConfiguration (void) { - FILE *f; + QFile *f; // dedicated servers initialize the host but don't parse and set the // config.cfg cvars if (host_initialized & !isDedicated) { - f = fopen (va("%s/config.cfg",com_gamedir), "w"); + f = Qopen (va("%s/config.cfg",com_gamedir), "w"); if (!f) { Con_Printf ("Couldn't write config.cfg.\n"); @@ -285,7 +281,7 @@ void Host_WriteConfiguration (void) Key_WriteBindings (f); Cvar_WriteVariables (f); - fclose (f); + Qclose (f); } } @@ -444,7 +440,7 @@ void Host_ShutdownServer(qboolean crash) CL_Disconnect (); // flush any pending messages - like the score!!! - start = Sys_FloatTime(); + start = Sys_DoubleTime(); do { count = 0; @@ -464,7 +460,7 @@ void Host_ShutdownServer(qboolean crash) } } } - if ((Sys_FloatTime() - start) > 3.0) + if ((Sys_DoubleTime() - start) > 3.0) break; } while (count); @@ -520,8 +516,9 @@ Host_FilterTime Returns false if the time is too short to run a frame =================== */ -qboolean Host_FilterTime (float time) +qboolean Host_FilterTime (double time) { + double timecap; realtime += time; if (slowmo.value < 0.0f) @@ -531,8 +528,16 @@ qboolean Host_FilterTime (float time) if (host_maxfps.value < host_minfps.value) Cvar_SetValue("host_maxfps", host_minfps.value); - if ((!cls.timedemo) && ((realtime - oldrealtime) < (1.0 / host_maxfps.value))) - return false; // framerate is too high + // check if framerate is too high + if (!cls.timedemo) + { + timecap = sys_ticrate.value; + if (cls.state == ca_connected) + timecap = 1.0 / host_maxfps.value; + + if ((realtime - oldrealtime) < timecap) + return false; + } host_realframetime = host_frametime = realtime - oldrealtime; // LordHavoc: copy into host_realframetime as well oldrealtime = realtime; @@ -549,8 +554,7 @@ qboolean Host_FilterTime (float time) host_frametime = (1.0 / host_minfps.value); } - host_frametime *= slowmo.value; - cl.frametime = host_frametime; + cl.frametime = host_frametime = bound(0, host_frametime * slowmo.value, 0.1f); // LordHavoc: the QC code relies on no less than 10fps return true; } @@ -638,7 +642,11 @@ void _Host_Frame (float time) // decide the simulation time if (!Host_FilterTime (time)) - return; // don't run too fast, or packets will flood out + { + // if time was rejected, don't totally hog the CPU + Sys_Sleep(); + return; + } // get new key events Sys_SendKeyEvents (); @@ -678,20 +686,18 @@ void _Host_Frame (float time) if (!sv.active) CL_SendCmd (); - host_time += host_frametime; - // fetch results from server if (cls.state == ca_connected) CL_ReadFromServer (); // update video if (host_speeds.value) - time1 = Sys_FloatTime (); + time1 = Sys_DoubleTime (); SCR_UpdateScreen (); if (host_speeds.value) - time2 = Sys_FloatTime (); + time2 = Sys_DoubleTime (); // update audio if (cls.signon == SIGNONS) @@ -707,7 +713,7 @@ void _Host_Frame (float time) if (host_speeds.value) { pass1 = (time1 - time3)*1000000; - time3 = Sys_FloatTime (); + time3 = Sys_DoubleTime (); pass2 = (time2 - time1)*1000000; pass3 = (time3 - time2)*1000000; Con_Printf ("%6ius total %6ius server %6ius gfx %6ius snd\n", @@ -730,9 +736,9 @@ void Host_Frame (float time) return; } - time1 = Sys_FloatTime (); + time1 = Sys_DoubleTime (); _Host_Frame (time); - time2 = Sys_FloatTime (); + time2 = Sys_DoubleTime (); timetotal += time2 - time1; timecount++; @@ -755,77 +761,14 @@ void Host_Frame (float time) //============================================================================ - -extern int vcrFile; -#define VCR_SIGNATURE 0x56435231 -// "VCR1" - -void Host_InitVCR () -{ - int i, len, n; - char *p; - - if (COM_CheckParm("-playback")) - { - if (com_argc != 2) - Sys_Error("No other parameters allowed with -playback\n"); - - Sys_FileOpenRead("quake.vcr", &vcrFile); - if (vcrFile == -1) - Sys_Error("playback file not found\n"); - - Sys_FileRead (vcrFile, &i, sizeof(int)); - if (i != VCR_SIGNATURE) - Sys_Error("Invalid signature in vcr file\n"); - - Sys_FileRead (vcrFile, &com_argc, sizeof(int)); - com_argv = qmalloc(com_argc * sizeof(char *)); - com_argv[0] = host_parms.argv[0]; - for (i = 0; i < com_argc; i++) - { - Sys_FileRead (vcrFile, &len, sizeof(int)); - p = qmalloc(len); - Sys_FileRead (vcrFile, p, len); - com_argv[i+1] = p; - } - com_argc++; /* add one for arg[0] */ - host_parms.argc = com_argc; - host_parms.argv = com_argv; - } - - if ( (n = COM_CheckParm("-record")) != 0) - { - vcrFile = Sys_FileOpenWrite("quake.vcr"); - - i = VCR_SIGNATURE; - Sys_FileWrite(vcrFile, &i, sizeof(int)); - i = com_argc - 1; - Sys_FileWrite(vcrFile, &i, sizeof(int)); - for (i = 1; i < com_argc; i++) - { - if (i == n) - { - len = 10; - Sys_FileWrite(vcrFile, &len, sizeof(int)); - Sys_FileWrite(vcrFile, "-playback", len); - continue; - } - len = strlen(com_argv[i]) + 1; - Sys_FileWrite(vcrFile, &len, sizeof(int)); - Sys_FileWrite(vcrFile, com_argv[i], len); - } - } - -} - -void Render_Init(); +void Render_Init(void); /* ==================== Host_Init ==================== */ -void Host_Init () +void Host_Init (void) { int i; /* @@ -867,7 +810,6 @@ void Host_Init () Cmd_Init (); V_Init (); Chase_Init (); - Host_InitVCR (); COM_Init (host_parms.basedir); Host_InitLocal (); W_LoadWadFile ("gfx.wad"); @@ -882,11 +824,13 @@ void Host_Init () Con_Printf ("Exe: "__TIME__" "__DATE__"\n"); Con_Printf ("%4.1f megabyte heap\n",host_parms.memsize/(1024*1024.0)); - R_InitTextures (); // needed even for dedicated servers - if (cls.state != ca_dedicated) { - Palette_Init("gfx/palette.lmp"); + VID_InitCvars(); + + Gamma_Init(); + + Palette_Init(); #ifndef _WIN32 // on non win32, mouse comes before video for security reasons IN_Init ();