// LordHavoc: now called only by CL_Disconnect void CL_StopPlayback (void) { if (!cls.demoplayback) return; FS_Close (cls.demofile); cls.demoplayback = false; cls.demofile = NULL; if (cls.timedemo) CL_FinishTimeDemo (); if (!cls.demostarting) // only quit if not starting another demo if (COM_CheckParm("-demo") || COM_CheckParm("-capturedemo")) Host_Quit_f(); }
/* ==================== CL_FinishTimeDemo ==================== */ static void CL_FinishTimeDemo (void) { int frames; int i; double time, totalfpsavg; double fpsmin, fpsavg, fpsmax; // report min/avg/max fps static int benchmark_runs = 0; char vabuf[1024]; cls.timedemo = false; frames = cls.td_frames; time = realtime - cls.td_starttime; totalfpsavg = time > 0 ? frames / time : 0; fpsmin = cls.td_onesecondminfps; fpsavg = cls.td_onesecondavgcount ? cls.td_onesecondavgfps / cls.td_onesecondavgcount : 0; fpsmax = cls.td_onesecondmaxfps; // LordHavoc: timedemo now prints out 7 digits of fraction, and min/avg/max Con_Printf("%i frames %5.7f seconds %5.7f fps, one-second fps min/avg/max: %.0f %.0f %.0f (%i seconds)\n", frames, time, totalfpsavg, fpsmin, fpsavg, fpsmax, cls.td_onesecondavgcount); Log_Printf("benchmark.log", "date %s | enginedate %s | demo %s | commandline %s | run %d | result %i frames %5.7f seconds %5.7f fps, one-second fps min/avg/max: %.0f %.0f %.0f (%i seconds)\n", Sys_TimeString("%Y-%m-%d %H:%M:%S"), buildstring, cls.demoname, cmdline.string, benchmark_runs + 1, frames, time, totalfpsavg, fpsmin, fpsavg, fpsmax, cls.td_onesecondavgcount); if (COM_CheckParm("-benchmark")) { ++benchmark_runs; i = COM_CheckParm("-benchmarkruns"); if(i && i + 1 < com_argc) { static benchmarkhistory_t *history = NULL; if(!history) history = (benchmarkhistory_t *)Z_Malloc(sizeof(*history) * atoi(com_argv[i + 1])); history[benchmark_runs - 1].frames = frames; history[benchmark_runs - 1].time = time; history[benchmark_runs - 1].totalfpsavg = totalfpsavg; history[benchmark_runs - 1].fpsmin = fpsmin; history[benchmark_runs - 1].fpsavg = fpsavg; history[benchmark_runs - 1].fpsmax = fpsmax; if(atoi(com_argv[i + 1]) > benchmark_runs) { // restart the benchmark Cbuf_AddText(va(vabuf, sizeof(vabuf), "timedemo %s\n", cls.demoname)); // cannot execute here } else { // print statistics int first = COM_CheckParm("-benchmarkruns_skipfirst") ? 1 : 0; if(benchmark_runs > first) { #define DO_MIN(f) \ for(i = first; i < benchmark_runs; ++i) if((i == first) || (history[i].f < f)) f = history[i].f #define DO_MAX(f) \ for(i = first; i < benchmark_runs; ++i) if((i == first) || (history[i].f > f)) f = history[i].f #define DO_MED(f) \ doublecmp_offset = (char *)&history->f - (char *)history; \ qsort(history + first, benchmark_runs - first, sizeof(*history), doublecmp_withoffset); \ if((first + benchmark_runs) & 1) \ f = history[(first + benchmark_runs - 1) / 2].f; \ else \ f = (history[(first + benchmark_runs - 2) / 2].f + history[(first + benchmark_runs) / 2].f) / 2 DO_MIN(frames); DO_MAX(time); DO_MIN(totalfpsavg); DO_MIN(fpsmin); DO_MIN(fpsavg); DO_MIN(fpsmax); Con_Printf("MIN: %i frames %5.7f seconds %5.7f fps, one-second fps min/avg/max: %.0f %.0f %.0f (%i seconds)\n", frames, time, totalfpsavg, fpsmin, fpsavg, fpsmax, cls.td_onesecondavgcount); DO_MED(frames); DO_MED(time); DO_MED(totalfpsavg); DO_MED(fpsmin); DO_MED(fpsavg); DO_MED(fpsmax); Con_Printf("MED: %i frames %5.7f seconds %5.7f fps, one-second fps min/avg/max: %.0f %.0f %.0f (%i seconds)\n", frames, time, totalfpsavg, fpsmin, fpsavg, fpsmax, cls.td_onesecondavgcount); DO_MAX(frames); DO_MIN(time); DO_MAX(totalfpsavg); DO_MAX(fpsmin); DO_MAX(fpsavg); DO_MAX(fpsmax); Con_Printf("MAX: %i frames %5.7f seconds %5.7f fps, one-second fps min/avg/max: %.0f %.0f %.0f (%i seconds)\n", frames, time, totalfpsavg, fpsmin, fpsavg, fpsmax, cls.td_onesecondavgcount); } Z_Free(history); history = NULL; Host_Quit_f(); } } else Host_Quit_f(); } }