X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=host.c;h=7bc799dd8b37a30a4e4c79e89b301358aec05b9b;hb=fed221a2c140ee0d1b002ccc01eac33cf0a114c3;hp=60db8ba1b1fa896a144e3f4cd028430f350444a4;hpb=70b6de8a98705a7d7097803a84bdd224b05103cc;p=xonotic%2Fdarkplaces.git diff --git a/host.c b/host.c index 60db8ba1..7bc799dd 100644 --- a/host.c +++ b/host.c @@ -70,8 +70,9 @@ cvar_t cl_minfps_fade = {CVAR_SAVE, "cl_minfps_fade", "1", "how fast the quality cvar_t cl_minfps_qualitymax = {CVAR_SAVE, "cl_minfps_qualitymax", "1", "highest allowed drawdistance multiplier"}; cvar_t cl_minfps_qualitymin = {CVAR_SAVE, "cl_minfps_qualitymin", "0.25", "lowest allowed drawdistance multiplier"}; cvar_t cl_minfps_qualitymultiply = {CVAR_SAVE, "cl_minfps_qualitymultiply", "0.2", "multiplier for quality changes in quality change per second render time (1 assumes linearity of quality and render time)"}; -cvar_t cl_minfps_qualityhysteresis = {CVAR_SAVE, "cl_minfps_qualityhysteresis", "0.025", "reduce all quality changes by this to reduce flickering"}; +cvar_t cl_minfps_qualityhysteresis = {CVAR_SAVE, "cl_minfps_qualityhysteresis", "0.05", "reduce all quality increments by this to reduce flickering"}; cvar_t cl_minfps_qualitystepmax = {CVAR_SAVE, "cl_minfps_qualitystepmax", "0.1", "maximum quality change in a single frame"}; +cvar_t cl_minfps_force = {0, "cl_minfps_force", "0", "also apply quality reductions in timedemo/capturevideo"}; cvar_t cl_maxfps = {CVAR_SAVE, "cl_maxfps", "0", "maximum fps cap, 0 = unlimited, if game is running faster than this it will wait before running another frame (useful to make cpu time available to other programs)"}; cvar_t cl_maxfps_alwayssleep = {0, "cl_maxfps_alwayssleep","1", "gives up some processing time to other applications each frame, value in milliseconds, disabled if cl_maxfps is 0"}; cvar_t cl_maxidlefps = {CVAR_SAVE, "cl_maxidlefps", "20", "maximum fps cap when the game is not the active window (makes cpu time available to other programs"}; @@ -96,6 +97,7 @@ Host_AbortCurrentFrame aborts the current host frame and goes on with the next one ================ */ +void Host_AbortCurrentFrame(void) DP_FUNC_NORETURN; void Host_AbortCurrentFrame(void) { // in case we were previously nice, make us mean again @@ -244,6 +246,7 @@ static void Host_InitLocal (void) Cvar_RegisterVariable (&cl_minfps_qualitystepmax); Cvar_RegisterVariable (&cl_minfps_qualityhysteresis); Cvar_RegisterVariable (&cl_minfps_qualitymultiply); + Cvar_RegisterVariable (&cl_minfps_force); Cvar_RegisterVariable (&cl_maxfps); Cvar_RegisterVariable (&cl_maxfps_alwayssleep); Cvar_RegisterVariable (&cl_maxidlefps); @@ -665,11 +668,11 @@ void Host_Main(void) double wait; int pass1, pass2, pass3, i; char vabuf[1024]; + qboolean playing; Host_Init(); realtime = 0; - dirtytime = Sys_DirtyTime(); for (;;) { if (setjmp(host_abortframe)) @@ -704,14 +707,15 @@ void Host_Main(void) svs.perf_acc_realtime += deltacleantime; // Look for clients who have spawned + playing = false; for (i = 0, host_client = svs.clients;i < svs.maxclients;i++, host_client++) if(host_client->spawned) if(host_client->netconnection) - break; - if(i == svs.maxclients) + playing = true; + if(sv.time < 10) { - // Nobody is looking? Then we won't do timing... - // Instead, reset it to zero + // don't accumulate time for the first 10 seconds of a match + // so things can settle svs.perf_acc_realtime = svs.perf_acc_sleeptime = svs.perf_acc_lost = svs.perf_acc_offset = svs.perf_acc_offset_squared = svs.perf_acc_offset_max = svs.perf_acc_offset_samples = 0; } else if(svs.perf_acc_realtime > 5) @@ -725,7 +729,8 @@ void Host_Main(void) svs.perf_offset_sdev = sqrt(svs.perf_acc_offset_squared / svs.perf_acc_offset_samples - svs.perf_offset_avg * svs.perf_offset_avg); } if(svs.perf_lost > 0 && developer_extra.integer) - Con_DPrintf("Server can't keep up: %s\n", Host_TimingReport(vabuf, sizeof(vabuf))); + if(playing) // only complain if anyone is looking + Con_DPrintf("Server can't keep up: %s\n", Host_TimingReport(vabuf, sizeof(vabuf))); svs.perf_acc_realtime = svs.perf_acc_sleeptime = svs.perf_acc_lost = svs.perf_acc_offset = svs.perf_acc_offset_squared = svs.perf_acc_offset_max = svs.perf_acc_offset_samples = 0; } } @@ -894,7 +899,7 @@ void Host_Main(void) SV_SendClientMessages(); if (sv.paused == 1 && realtime > sv.pausedstart && sv.pausedstart > 0) { - prog->globals.generic[OFS_PARM0] = realtime - sv.pausedstart; + prog->globals.fp[OFS_PARM0] = realtime - sv.pausedstart; PRVM_serverglobalfloat(time) = sv.time; prog->ExecuteProgram(prog, PRVM_serverfunction(SV_PausedTic), "QC function SV_PausedTic is missing"); } @@ -956,13 +961,15 @@ void Host_Main(void) if (cls.demopaused) clframetime = 0; } + else + { + // host_framerate overrides all else + if (host_framerate.value) + clframetime = host_framerate.value; - // host_framerate overrides all else - if (host_framerate.value) - clframetime = host_framerate.value; - - if (cl.paused || (cl.islocalgame && (key_dest != key_game || key_consoleactive || cl.csqc_paused))) - clframetime = 0; + if (cl.paused || (cl.islocalgame && (key_dest != key_game || key_consoleactive || cl.csqc_paused))) + clframetime = 0; + } if (cls.timedemo) clframetime = cl.realframetime = cl_timer; @@ -1295,7 +1302,7 @@ static void Host_Init (void) } // put up the loading image so the user doesn't stare at a black screen... - SCR_BeginLoadingPlaque(); + SCR_BeginLoadingPlaque(true); if (cls.state != ca_dedicated) { @@ -1340,7 +1347,7 @@ static void Host_Init (void) if (!sv.active && !cls.demoplayback && !cls.connect_trying) { - Cbuf_AddText("togglemenu\n"); + Cbuf_AddText("togglemenu 1\n"); Cbuf_Execute(); }