X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=host.c;h=1b776d7b5e761da4e48191033c170b0496debdc2;hb=560eb405cfebc3c582f09d1358c170aa4e885e1a;hp=f579dd91af3752287d9e3cddeb8351f4e797a29f;hpb=04ebd98618c773b10ada031f18b99f11020b559f;p=xonotic%2Fdarkplaces.git diff --git a/host.c b/host.c index f579dd91..1b776d7b 100644 --- a/host.c +++ b/host.c @@ -61,6 +61,7 @@ double host_starttime = 0; 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_maxwait = {0, "host_maxwait","1000", "maximum sleep time requested from the operating system in millisecond. Larger sleeps will be done using multiple host_maxwait length sleeps. Lowering this value will increase CPU load, but may help working around problems with accuracy of sleep times."}; 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"}; @@ -71,7 +72,7 @@ cvar_t cl_maxfps = {CVAR_SAVE, "cl_maxfps", "0", "maximum fps cap, 0 = unlimited 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 = {CVAR_SAVE, "developer","0", "prints debugging messages and information (recommended for all developers and level designers)"}; +cvar_t developer = {CVAR_SAVE, "developer","0", "shows debugging messages and information (recommended for all developers and level designers); the value -1 also suppresses buffering and logging these messages"}; cvar_t developer_extra = {0, "developer_extra", "0", "prints additional debugging messages, often very verbose!"}; cvar_t developer_insane = {0, "developer_insane", "0", "prints huge streams of information about internal workings, entire contents of files being read/written, etc. Not recommended!"}; cvar_t developer_loadfile = {0, "developer_loadfile","0", "prints name and size of every file loaded via the FS_LoadFile function (which is almost everything)"}; @@ -188,7 +189,7 @@ void Host_ServerOptions (void) else { // default players in some games, singleplayer in most - if (gamemode != GAME_GOODVSBAD2 && gamemode != GAME_NEXUIZ && gamemode != GAME_BATTLEMECH) + if (gamemode != GAME_GOODVSBAD2 && gamemode != GAME_NEXUIZ && gamemode != GAME_XONOTIC && gamemode != GAME_BATTLEMECH) svs.maxclients = 1; } } @@ -209,6 +210,7 @@ Host_InitLocal void Host_SaveConfig_f(void); void Host_LoadConfig_f(void); extern cvar_t sv_writepicture_quality; +extern cvar_t r_texture_jpeg_fastpicmip; static void Host_InitLocal (void) { Cmd_AddCommand("saveconfig", Host_SaveConfig_f, "save settings to config.cfg (or a specified filename) immediately (also automatic when quitting)"); @@ -216,6 +218,7 @@ static void Host_InitLocal (void) Cvar_RegisterVariable (&host_framerate); Cvar_RegisterVariable (&host_speeds); + Cvar_RegisterVariable (&host_maxwait); Cvar_RegisterVariable (&cl_minfps); Cvar_RegisterVariable (&cl_minfps_fade); Cvar_RegisterVariable (&cl_minfps_qualitymax); @@ -237,6 +240,7 @@ static void Host_InitLocal (void) Cvar_RegisterVariable (&timeformat); Cvar_RegisterVariable (&sv_writepicture_quality); + Cvar_RegisterVariable (&r_texture_jpeg_fastpicmip); } @@ -271,11 +275,11 @@ void Host_SaveConfig_to(const char *file) } void Host_SaveConfig(void) { - Host_SaveConfig_to("config.cfg"); + Host_SaveConfig_to(CONFIGFILENAME); } void Host_SaveConfig_f(void) { - const char *file = "config.cfg"; + const char *file = CONFIGFILENAME; if(Cmd_Argc() >= 2) { file = Cmd_Argv(1); @@ -297,7 +301,7 @@ void Host_LoadConfig_f(void) // unlock the cvar default strings so they can be updated by the new default.cfg Cvar_UnlockDefaults(); // reset cvars to their defaults, and then exec startup scripts again - Cbuf_InsertText("cvar_resettodefaults_all;exec quake.rc\n"); + Cbuf_InsertText("cvar_resettodefaults_all;exec " STARTCONFIGFILENAME "\n"); } /* @@ -677,6 +681,7 @@ void Host_Main(void) cl.islocalgame = NetConn_IsLocalGame(); // get new key events + Key_EventQueue_Unblock(); SndSys_SendKeyEvents(); Sys_SendKeyEvents(); @@ -700,8 +705,10 @@ void Host_Main(void) if (sv.active ? sv_timer > 0 : cl_timer > 0) { // process console commands +// R_TimeReport("preconsole"); CL_VM_PreventInformationLeaks(); Cbuf_Execute(); +// R_TimeReport("console"); } //Con_Printf("%6.0f %6.0f\n", cl_timer * 1000000.0, sv_timer * 1000000.0); @@ -713,19 +720,30 @@ void Host_Main(void) wait = cl_timer * -1000000.0; else wait = max(cl_timer, sv_timer) * -1000000.0; - wait = bound(0, wait, 100000); if (!cls.timedemo && wait >= 1) { - double time0 = Sys_DoubleTime(); - if (sv_checkforpacketsduringsleep.integer) + double time0; + + if(host_maxwait.value <= 0) + wait = min(wait, 1000000.0); + else + wait = min(wait, host_maxwait.value * 1000.0); + if(wait < 1) + wait = 1; // because we cast to int + + time0 = Sys_DoubleTime(); + if (sv_checkforpacketsduringsleep.integer && !sys_usenoclockbutbenchmark.integer) NetConn_SleepMicroseconds((int)wait); else Sys_Sleep((int)wait); svs.perf_acc_sleeptime += Sys_DoubleTime() - time0; +// R_TimeReport("sleep"); continue; } + R_TimeReport("---"); + //------------------- // // server operations @@ -794,7 +812,7 @@ void Host_Main(void) sv.frametime = advancetime * slowmo.value; if (host_framerate.value) sv.frametime = host_framerate.value; - if (sv.paused || (cl.islocalgame && (key_dest != key_game || key_consoleactive))) + if (sv.paused || (cl.islocalgame && (key_dest != key_game || key_consoleactive || cl.csqc_paused))) sv.frametime = 0; // setup the VM frame @@ -812,6 +830,7 @@ void Host_Main(void) if (framelimit > 1 && Sys_DoubleTime() >= aborttime) break; } + R_TimeReport("serverphysics"); // send all messages to the clients SV_SendClientMessages(); @@ -826,6 +845,13 @@ void Host_Main(void) // send an heartbeat if enough time has passed since the last one NetConn_Heartbeat(0); + R_TimeReport("servernetwork"); + } + else + { + // don't let r_speeds display jump around + R_TimeReport("serverphysics"); + R_TimeReport("servernetwork"); } //------------------- @@ -836,6 +862,7 @@ void Host_Main(void) if (cls.state != ca_dedicated && (cl_timer > 0 || cls.timedemo || ((vid_activewindow ? cl_maxfps : cl_maxidlefps).value < 1))) { + R_TimeReport("---"); // decide the simulation time if (cls.capturevideo.active) { @@ -876,7 +903,7 @@ void Host_Main(void) if (host_framerate.value) clframetime = host_framerate.value; - if (cl.paused || (cl.islocalgame && (key_dest != key_game || key_consoleactive))) + if (cl.paused || (cl.islocalgame && (key_dest != key_game || key_consoleactive || cl.csqc_paused))) clframetime = 0; if (cls.timedemo) @@ -891,26 +918,35 @@ void Host_Main(void) // update video if (host_speeds.integer) time1 = Sys_DoubleTime(); + R_TimeReport("pre-input"); // Collect input into cmd CL_Input(); + R_TimeReport("input"); + // check for new packets NetConn_ClientFrame(); // read a new frame from a demo if needed CL_ReadDemoMessage(); + R_TimeReport("clientnetwork"); // now that packets have been read, send input to server CL_SendMove(); + R_TimeReport("sendmove"); // update client world (interpolate entities, create trails, etc) CL_UpdateWorld(); + R_TimeReport("lerpworld"); CL_Video_Frame(); CL_Gecko_Frame(); + R_TimeReport("client"); + CL_UpdateScreen(); + R_TimeReport("render"); if (host_speeds.integer) time2 = Sys_DoubleTime(); @@ -925,6 +961,7 @@ void Host_Main(void) S_Update(&r_refdef.view.matrix); CDAudio_Update(); + R_TimeReport("audio"); // reset gathering of mouse input in_mouse_x = in_mouse_y = 0; @@ -982,6 +1019,7 @@ qboolean sys_nostdout = false; extern void u8_Init(void); extern void Render_Init(void); extern void Mathlib_Init(void); +extern void FS_Init_SelfPack(void); extern void FS_Init(void); extern void FS_Shutdown(void); extern void PR_Cmd_Init(void); @@ -1059,6 +1097,9 @@ static void Host_Init (void) // initialize console window (only used by sys_win.c) Sys_InitConsole(); + // initialize the self-pack (must be before COM_InitGameType as it may add command line options) + FS_Init_SelfPack(); + // detect gamemode from commandline options or executable name COM_InitGameType(); @@ -1081,6 +1122,7 @@ static void Host_Init (void) Mod_Init(); World_Init(); SV_Init(); + V_Init(); // some cvars needed by server player physics (cl_rollangle etc) Host_InitCommands(); Host_InitLocal(); Host_ServerOptions(); @@ -1100,26 +1142,25 @@ static void Host_Init (void) S_Init(); CDAudio_Init(); Key_Init(); - V_Init(); CL_Init(); } // set up the default startmap_sp and startmap_dm aliases (mods can // override these) and then execute the quake.rc startup script if (gamemode == GAME_NEHAHRA) - Cbuf_AddText("alias startmap_sp \"map nehstart\"\nalias startmap_dm \"map nehstart\"\nexec quake.rc\n"); + Cbuf_AddText("alias startmap_sp \"map nehstart\"\nalias startmap_dm \"map nehstart\"\nexec " STARTCONFIGFILENAME "\n"); else if (gamemode == GAME_TRANSFUSION) - Cbuf_AddText("alias startmap_sp \"map e1m1\"\n""alias startmap_dm \"map bb1\"\nexec quake.rc\n"); + Cbuf_AddText("alias startmap_sp \"map e1m1\"\n""alias startmap_dm \"map bb1\"\nexec " STARTCONFIGFILENAME "\n"); else if (gamemode == GAME_TEU) Cbuf_AddText("alias startmap_sp \"map start\"\nalias startmap_dm \"map start\"\nexec teu.rc\n"); else - Cbuf_AddText("alias startmap_sp \"map start\"\nalias startmap_dm \"map start\"\nexec quake.rc\n"); + Cbuf_AddText("alias startmap_sp \"map start\"\nalias startmap_dm \"map start\"\nexec " STARTCONFIGFILENAME "\n"); Cbuf_Execute(); // if stuffcmds wasn't run, then quake.rc is probably missing, use default if (!host_stuffcmdsrun) { - Cbuf_AddText("exec default.cfg\nexec config.cfg\nexec autoexec.cfg\nstuffcmds\n"); + Cbuf_AddText("exec default.cfg\nexec " CONFIGFILENAME "\nexec autoexec.cfg\nstuffcmds\n"); Cbuf_Execute(); }