#include "progsvm.h"
#include "csprogs.h"
#include "sv_demo.h"
+#include "snd_main.h"
/*
cvar_t host_framerate = {0, "host_framerate","0", "locks frame timing to this value in seconds, 0.05 is 20fps for example, note that this can easily run too fast, use cl_maxfps if you want to limit your framerate instead, or sys_ticrate to limit server speed"};
// shows time used by certain subsystems
cvar_t host_speeds = {0, "host_speeds","0", "reports how much time is used in server/graphics/sound"};
-cvar_t host_sleep = {0, "host_sleep","1", "gives up some processing time to other applications each frame, value in milliseconds"};
cvar_t cl_minfps = {CVAR_SAVE, "cl_minfps", "40", "minimum fps target - while the rendering performance is below this, it will drift toward lower quality"};
cvar_t cl_minfps_fade = {CVAR_SAVE, "cl_minfps_fade", "0.2", "how fast the quality adapts to varying framerate"};
cvar_t cl_minfps_qualitymax = {CVAR_SAVE, "cl_minfps_qualitymax", "1", "highest allowed drawdistance multiplier"};
cvar_t cl_minfps_qualitypower = {CVAR_SAVE, "cl_minfps_qualitypower", "4", "raises quality value to a power of itself, higher values make quality drop more sharply in relation to framerate"};
cvar_t cl_minfps_qualityscale = {CVAR_SAVE, "cl_minfps_qualityscale", "0.5", "multiplier for quality"};
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"};
cvar_t developer = {0, "developer","0", "prints additional debugging messages and information (recommended for modders and level designers)"};
Cvar_RegisterVariable (&host_framerate);
Cvar_RegisterVariable (&host_speeds);
- Cvar_RegisterVariable (&host_sleep);
Cvar_RegisterVariable (&cl_minfps);
Cvar_RegisterVariable (&cl_minfps_fade);
Cvar_RegisterVariable (&cl_minfps_qualitymax);
Cvar_RegisterVariable (&cl_minfps_qualitypower);
Cvar_RegisterVariable (&cl_minfps_qualityscale);
Cvar_RegisterVariable (&cl_maxfps);
+ Cvar_RegisterVariable (&cl_maxfps_alwayssleep);
Cvar_RegisterVariable (&cl_maxidlefps);
Cvar_RegisterVariable (&developer);
// make sure all the clients know we're disconnecting
SV_VM_Begin();
+ World_End(&sv.world);
if(prog->loaded)
if(prog->funcoffsets.SV_Shutdown)
{
Returns a time report string, for example for
==================
*/
-const char *Host_TimingReport()
+const char *Host_TimingReport(void)
{
return va("%.1f%% CPU, %.2f%% lost, offset avg %.1fms, max %.1fms, sdev %.1fms", svs.perf_cpuload * 100, svs.perf_lost * 100, svs.perf_offset_avg * 1000, svs.perf_offset_max * 1000, svs.perf_offset_sdev * 1000);
}
for (;;)
{
if (setjmp(host_abortframe))
+ {
+ SCR_ClearLoadingScreen(false);
continue; // something bad happened, or the server disconnected
+ }
oldrealtime = realtime;
realtime = Sys_DoubleTime();
cl.islocalgame = NetConn_IsLocalGame();
- // begin gathering mouse input
- in_mouse_x = in_mouse_y = 0;
-
// get new key events
+ SndSys_SendKeyEvents();
Sys_SendKeyEvents();
NetConn_UpdateSockets();
if (sv.active ? sv_timer > 0 : cl_timer > 0)
{
// process console commands
+ CL_VM_PreventInformationLeaks();
Cbuf_Execute();
}
//
//-------------------
- if (cls.state != ca_dedicated && (cl_timer > 0 || cls.timedemo))
+ if (cls.state != ca_dedicated && (cl_timer > 0 || cls.timedemo || cl_maxfps.value < 1))
{
// decide the simulation time
if (cls.capturevideo.active)
{
+ //***
if (cls.capturevideo.realtime)
clframetime = cl.realframetime = max(cl_timer, 1.0 / cls.capturevideo.framerate);
else
cl.realframetime = max(cl_timer, clframetime);
}
}
- else if (vid_activewindow && cl_maxfps.value >= 1)
+ else if (vid_activewindow && cl_maxfps.value >= 1 && !cls.timedemo)
+ {
clframetime = cl.realframetime = max(cl_timer, 1.0 / cl_maxfps.value);
- else if (!vid_activewindow && cl_maxidlefps.value >= 1)
+ // when running slow, we need to sleep to keep input responsive
+ wait = bound(0, cl_maxfps_alwayssleep.value * 1000, 100000);
+ if (wait > 0)
+ Sys_Sleep((int)wait);
+ }
+ else if (!vid_activewindow && cl_maxidlefps.value >= 1 && !cls.timedemo)
clframetime = cl.realframetime = max(cl_timer, 1.0 / cl_maxidlefps.value);
else
clframetime = cl.realframetime = cl_timer;
if (host_framerate.value)
clframetime = host_framerate.value;
+ if (cl.paused || (cl.islocalgame && (key_dest != key_game || key_consoleactive)))
+ clframetime = 0;
+
if (cls.timedemo)
clframetime = cl.realframetime = cl_timer;
cl.oldtime = cl.time;
cl.time += clframetime;
+ // update video
+ if (host_speeds.integer)
+ time1 = Sys_DoubleTime();
+
// Collect input into cmd
CL_Input();
// update client world (interpolate entities, create trails, etc)
CL_UpdateWorld();
- // update video
- if (host_speeds.integer)
- time1 = Sys_DoubleTime();
-
CL_Video_Frame();
CL_Gecko_Frame();
CDAudio_Update();
+ // reset gathering of mouse input
+ in_mouse_x = in_mouse_y = 0;
+
if (host_speeds.integer)
{
pass1 = (int)((time1 - time3)*1000000);
Con_Printf("%6ius total %6ius server %6ius gfx %6ius snd\n",
pass1+pass2+pass3, pass1, pass2, pass3);
}
- wait = bound(0, host_sleep.value * 1000, 100000);
- if (wait >= 1)
- Sys_Sleep((int)wait);
}
+#if MEMPARANOIA
+ Mem_CheckSentinelsGlobal();
+#else
+ if (developer_memorydebug.integer)
+ Mem_CheckSentinelsGlobal();
+#endif
+
// if there is some time remaining from this frame, reset the timers
if (cl_timer >= 0)
cl_timer = 0;
srand(time(NULL));
// FIXME: this is evil, but possibly temporary
+ // LordHavoc: doesn't seem very temporary...
+ // LordHavoc: enabled this by default on debug
+#ifndef DEBUG
// COMMANDLINEOPTION: Console: -developer enables warnings and other notices (RECOMMENDED for mod developers)
if (COM_CheckParm("-developer"))
+#endif
{
developer.value = developer.integer = 1;
developer.string = "1";
}
Cmd_Shutdown();
+ Key_Shutdown();
CL_Shutdown();
Sys_Shutdown();
Log_Close();
FS_Shutdown();
+ Con_Shutdown();
Memory_Shutdown();
}