From 7449c15eba027ea8e846fcb8a6a99a821f4d38f8 Mon Sep 17 00:00:00 2001 From: James R Date: Mon, 29 Jan 2024 02:20:23 -0800 Subject: [PATCH] devmode DEMO: replay buffer usage displayed in real-time on the HUD - Buffer usage in megabytes, bytes and percentage - Approximate usage per second - Estimated time until buffer runs out and replay is stopped --- src/doomdef.h | 1 + src/g_demo.c | 3 ++- src/g_demo.h | 1 + src/m_cheat.c | 2 ++ src/st_stuff.c | 30 ++++++++++++++++++++++++++++++ 5 files changed, 36 insertions(+), 1 deletion(-) diff --git a/src/doomdef.h b/src/doomdef.h index a2c0bec26..5c6702db1 100644 --- a/src/doomdef.h +++ b/src/doomdef.h @@ -386,6 +386,7 @@ typedef enum DBG_SETUP = 0x00000400, DBG_LUA = 0x00000800, DBG_RNG = 0x00001000, + DBG_DEMO = 0x00002000, } debugFlags_t; struct debugFlagNames_s diff --git a/src/g_demo.c b/src/g_demo.c index 27ede650e..fb1d277de 100644 --- a/src/g_demo.c +++ b/src/g_demo.c @@ -2013,7 +2013,7 @@ void G_RecordDemo(const char *name) demobuf.p = NULL; demo.recording = true; - //demo.buffer = &demobuf; + demo.buffer = &demobuf; /* FIXME: This whole file is in a wretched state. Take a look at G_WriteAllGhostTics and G_WriteDemoTiccmd, they @@ -2925,6 +2925,7 @@ void G_DoPlayDemo(char *defdemoname) // read demo header gameaction = ga_nothing; demo.playback = true; + demo.buffer = &demobuf; if (memcmp(demobuf.p, DEMOHEADER, 12)) { snprintf(msg, 1024, M_GetText("%s is not a SRB2Kart replay file.\n"), pdemoname); diff --git a/src/g_demo.h b/src/g_demo.h index a8e2c15d2..fe85550d1 100644 --- a/src/g_demo.h +++ b/src/g_demo.h @@ -58,6 +58,7 @@ struct demovars_s { boolean freecam; + const savebuffer_t *buffer; // debug, valid only if recording or playback }; extern struct demovars_s demo; diff --git a/src/m_cheat.c b/src/m_cheat.c index 8cf65b60e..1fcadfe32 100644 --- a/src/m_cheat.c +++ b/src/m_cheat.c @@ -759,6 +759,8 @@ struct debugFlagNames_s const debug_flag_names[] = {"Lua", DBG_LUA}, {"RNG", DBG_RNG}, {"Randomizer", DBG_RNG}, // alt name + {"Demo", DBG_DEMO}, + {"Replay", DBG_DEMO}, // alt name {NULL, 0} }; diff --git a/src/st_stuff.c b/src/st_stuff.c index 8b0e5a491..28e0379cb 100644 --- a/src/st_stuff.c +++ b/src/st_stuff.c @@ -438,6 +438,31 @@ static void ST_drawRenderDebug(INT32 *height) ST_pushDebugString(height, va("Skybox Portals: %4s", sizeu1(i->skybox_portals))); } +static void ST_drawDemoDebug(INT32 *height) +{ + if (!demo.recording && !demo.playback) + return; + + size_t needle = demo.buffer->p - demo.buffer->buffer; + size_t size = demo.buffer->size; + double percent = (double)needle / size * 100.0; + double avg = (double)needle / leveltime; + + ST_pushDebugString(height, va("%s/%s bytes", sizeu1(needle), sizeu2(size))); + ST_pushDebugString(height, va( + "%.2f/%.2f MB %5.2f%%", + needle / (1024.0 * 1024.0), + size / (1024.0 * 1024.0), + percent + )); + ST_pushDebugString(height, va( + "%.2f KB/s (ETA %.2f minutes)", + avg * TICRATE / 1024.0, + (size - needle) / (avg * TICRATE * 60.0) + )); + ST_pushDebugString(height, va("Demo (%s)", demo.recording ? "recording" : "playback")); +} + static void ST_drawDebugInfo(void) { INT32 height = 192; @@ -508,6 +533,11 @@ static void ST_drawDebugInfo(void) ST_drawRenderDebug(&height); } + if (cht_debug & DBG_DEMO) + { + ST_drawDemoDebug(&height); + } + if (cht_debug & DBG_MEMORY) V_DrawRightAlignedString(320, height, V_MONOSPACE, va("Heap used: %7sKB", sizeu1(Z_TagsUsage(0, INT32_MAX)>>10))); }