X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=cl_demo.c;h=5741e813daac6470162cc32bba92c72874902807;hb=3dfd03a33dc34d8a469d9b2f334991de226fd897;hp=6a0f194c5b88834e522cc9b667a501aa5c7a825d;hpb=90a46021b3d3abf8077b34c0af0a587ff579c5c1;p=xonotic%2Fdarkplaces.git diff --git a/cl_demo.c b/cl_demo.c index 6a0f194c..5741e813 100644 --- a/cl_demo.c +++ b/cl_demo.c @@ -20,7 +20,10 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "quakedef.h" +#ifdef CONFIG_VIDEO_CAPTURE extern cvar_t cl_capturevideo; +extern cvar_t cl_capturevideo_demo_stop; +#endif int old_vsync = 0; static void CL_FinishTimeDemo (void); @@ -78,6 +81,11 @@ Called when a demo file runs out, or the user starts a game // LordHavoc: now called only by CL_Disconnect void CL_StopPlayback (void) { +#ifdef CONFIG_VIDEO_CAPTURE + if (cl_capturevideo_demo_stop.integer) + Cvar_Set("cl_capturevideo", "0"); +#endif + if (!cls.demoplayback) return; @@ -457,6 +465,25 @@ void CL_PlayDemo_f (void) cls.demostarting = false; } +typedef struct +{ + int frames; + double time, totalfpsavg; + double fpsmin, fpsavg, fpsmax; +} +benchmarkhistory_t; +static size_t doublecmp_offset; +static int doublecmp_withoffset(const void *a_, const void *b_) +{ + const double *a = (const double *) ((const char *) a_ + doublecmp_offset); + const double *b = (const double *) ((const char *) b_ + doublecmp_offset); + if(*a > *b) + return +1; + if(*a < *b) + return -1; + return 0; +} + /* ==================== CL_FinishTimeDemo @@ -489,6 +516,17 @@ static void CL_FinishTimeDemo (void) 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 @@ -496,7 +534,53 @@ static void CL_FinishTimeDemo (void) // 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(); @@ -533,6 +617,5 @@ void CL_TimeDemo_f (void) cls.timedemo = true; cls.td_frames = -2; // skip the first frame cls.demonum = -1; // stop demo loop - cls.demonum = -1; // stop demo loop }