if (cls.demopaused)
return;
- // decide if it is time to grab the next message
- // always grab until fully connected
- if (cls.signon == SIGNONS)
+ while (1)
{
- if (cls.timedemo)
+ // decide if it is time to grab the next message
+ // always grab until fully connected
+ if (cls.signon == SIGNONS)
{
- if (host_framecount == cls.td_lastframe)
+ if (cls.timedemo)
{
- // already read this frame's message
+ if (host_framecount == cls.td_lastframe)
+ {
+ // already read this frame's message
+ return;
+ }
+ if (cls.td_lastframe == -1)
+ {
+ // we start counting on the second frame
+ // (after parsing connection stuff)
+ cls.td_startframe = host_framecount + 1;
+ }
+ cls.td_lastframe = host_framecount;
+ // if this is the first official frame we can now grab the real
+ // td_starttime so the bogus time on the first frame doesn't
+ // count against the final report
+ if (host_framecount == cls.td_startframe)
+ cls.td_starttime = realtime;
+ if (host_framecount > cls.td_startframe + 2)
+ {
+ cls.td_minframetime = min(cls.td_minframetime, host_realframetime);
+ cls.td_maxframetime = max(cls.td_maxframetime, host_realframetime);
+ }
+ else
+ cls.td_minframetime = cls.td_maxframetime = host_realframetime;
+ }
+ else if (cl.time <= cl.mtime[0])
+ {
+ // don't need another message yet
return;
}
- cls.td_lastframe = host_framecount;
- // if this is the second frame, grab the real td_starttime
- // so the bogus time on the first frame doesn't count
- if (host_framecount == cls.td_startframe + 1)
- cls.td_starttime = realtime;
}
- else if (cl.time <= cl.mtime[0])
+
+ // get the next message
+ FS_Read(cls.demofile, &net_message.cursize, 4);
+ net_message.cursize = LittleLong(net_message.cursize);
+ if (net_message.cursize > net_message.maxsize)
+ Host_Error("Demo message (%i) > net_message.maxsize (%i)", net_message.cursize, net_message.maxsize);
+ VectorCopy(cl.mviewangles[0], cl.mviewangles[1]);
+ for (i = 0;i < 3;i++)
{
- // don't need another message yet
- return;
+ r = FS_Read(cls.demofile, &f, 4);
+ cl.mviewangles[0][i] = LittleFloat(f);
}
- }
- // get the next message
- FS_Read(cls.demofile, &net_message.cursize, 4);
- net_message.cursize = LittleLong(net_message.cursize);
- VectorCopy(cl.mviewangles[0], cl.mviewangles[1]);
- for (i = 0;i < 3;i++)
- {
- r = FS_Read(cls.demofile, &f, 4);
- cl.mviewangles[0][i] = LittleFloat(f);
- }
-
- if (net_message.cursize > NET_MAXMESSAGE)
- Host_Error("Demo message > NET_MAXMESSAGE");
- if (FS_Read(cls.demofile, net_message.data, net_message.cursize) == (size_t)net_message.cursize)
- {
- MSG_BeginReading();
- CL_ParseServerMessage();
+ if (FS_Read(cls.demofile, net_message.data, net_message.cursize) == (size_t)net_message.cursize)
+ {
+ MSG_BeginReading();
+ CL_ParseServerMessage();
+ }
+ else
+ {
+ CL_Disconnect();
+ return;
+ }
}
- else
- CL_Disconnect();
}
track = -1;
// get the demo name
- strncpy (name, Cmd_Argv(1), sizeof (name) - 1);
- name[sizeof (name) - 1] = '\0';
- FS_DefaultExtension (name, ".dem");
+ strlcpy (name, Cmd_Argv(1), sizeof (name));
+ FS_DefaultExtension (name, ".dem", sizeof (name));
// start the map up
if (c > 2)
// disconnect from server
CL_Disconnect ();
+ // update networking ports (this is mainly just needed at startup)
+ NetConn_ClientFrame();
+
// open the demo file
- strcpy (name, Cmd_Argv(1));
- FS_DefaultExtension (name, ".dem");
+ strlcpy (name, Cmd_Argv(1), sizeof (name));
+ FS_DefaultExtension (name, ".dem", sizeof (name));
Con_Printf ("Playing demo from %s.\n", name);
cls.demofile = FS_Open (name, "rb", false);
*/
void CL_FinishTimeDemo (void)
{
- int frames;
- double time; // LordHavoc: changed timedemo accuracy to double
+ int frames;
+ double time; // LordHavoc: changed timedemo accuracy to double
+ double fpsmin, fpsavg, fpsmax; // report min/avg/max fps
cls.timedemo = false;
// the first frame didn't count
frames = (host_framecount - cls.td_startframe) - 1;
time = realtime - cls.td_starttime;
- if (!time)
- time = 1;
- // LordHavoc: timedemo now prints out 7 digits of fraction
- Con_Printf ("%i frames %5.7f seconds %5.7f fps\n", frames, time, frames/time);
+ fpsmin = cls.td_maxframetime > 0 ? 1.0 / cls.td_maxframetime : 0;
+ fpsavg = time > 0 ? frames / time : 0;
+ fpsmax = cls.td_minframetime > 0 ? 1.0 / cls.td_minframetime : 0;
+ // LordHavoc: timedemo now prints out 7 digits of fraction, and min/avg/max
+ Con_Printf ("%i frames %5.7f seconds %5.7f fps\nmin/avg/max: %5.7f/%5.7f/%5.7f\n", frames, time, fpsavg, fpsmin, fpsavg, fpsmax);
}
/*
scr_con_current = 0;
cls.timedemo = true;
- cls.td_startframe = host_framecount;
- cls.td_lastframe = -1; // get a new message this frame
+ // get first message this frame
+ cls.td_lastframe = -1;
}