From 6ca492918e91b04e978e40b0f7a543ae616cf9ca Mon Sep 17 00:00:00 2001 From: terminx Date: Sat, 12 Jan 2019 00:21:53 +0000 Subject: [PATCH] Slightly revise framerate limiter and r_showfps 2 display git-svn-id: https://svn.eduke32.com/eduke32@7304 1a8010ca-5511-0410-912e-c29ae57300e0 --- source/duke3d/src/game.cpp | 19 ++++++++------- source/duke3d/src/game.h | 3 ++- source/duke3d/src/global.cpp | 2 +- source/duke3d/src/global.h | 6 ++--- source/duke3d/src/menus.cpp | 6 ++--- source/duke3d/src/osdcmds.cpp | 2 +- source/duke3d/src/screens.cpp | 44 +++++++++++++++++++---------------- 7 files changed, 43 insertions(+), 39 deletions(-) diff --git a/source/duke3d/src/game.cpp b/source/duke3d/src/game.cpp index cc8fad38d..67a24b8fd 100644 --- a/source/duke3d/src/game.cpp +++ b/source/duke3d/src/game.cpp @@ -117,7 +117,7 @@ int32_t g_levelTextTime = 0; int32_t r_maxfps = 60; int32_t r_maxfpsoffset = 0; -uint64_t g_frameDelay = 17; +double g_frameDelay = 0.0; #if defined(RENDERTYPEWIN) && defined(USE_OPENGL) extern char forcegl; @@ -1272,7 +1272,7 @@ int32_t A_InsertSprite(int16_t whatsect,int32_t s_x,int32_t s_y,int32_t s_z,int1 int32_t newSprite; - + #ifdef NETCODE_DISABLE newSprite = insertsprite(whatsect, s_ss); #else @@ -6130,7 +6130,7 @@ void G_MaybeAllocPlayer(int32_t pnum) int G_FPSLimit(void) { - static uint64_t nextPageTicks = 0; + static auto nextPageTicks = (double)timerGetTicksU64(); static unsigned frameWaiting = 0; if (frameWaiting) @@ -6139,7 +6139,7 @@ int G_FPSLimit(void) videoNextPage(); } - uint64_t const frameTicks = timerGetTicksU64(); + auto const frameTicks = (double)timerGetTicksU64(); if (!r_maxfps || frameTicks >= nextPageTicks) { @@ -6556,6 +6556,7 @@ int app_main(int argc, char const * const * argv) ud.setup.bpp = bpp; } + g_frameDelay = calcFrameDelay(r_maxfps + r_maxfpsoffset); videoSetPalette(ud.brightness>>2, myplayer.palette, 0); S_MusicStartup(); S_SoundStartup(); @@ -6613,8 +6614,8 @@ MAIN_LOOP_RESTART: { OSD_Printf("Waiting for initial snapshot..."); Net_WaitForInitialSnapshot(); - - + + } if (g_networkMode != NET_DEDICATED_SERVER) @@ -6734,7 +6735,7 @@ MAIN_LOOP_RESTART: OSD_DispatchQueued(); char gameUpdate = false; - uint32_t gameUpdateStartTime = timerGetTicks(); + double const gameUpdateStartTime = timerGetHiTicks(); if (((g_netClient || g_netServer) || (myplayer.gm & (MODE_MENU|MODE_DEMO)) == 0) && totalclock >= ototalclock+TICSPERFRAME) { if (g_networkMode != NET_DEDICATED_SERVER) @@ -6779,7 +6780,7 @@ MAIN_LOOP_RESTART: while (((g_netClient || g_netServer) || (myplayer.gm & (MODE_MENU|MODE_DEMO)) == 0) && totalclock >= ototalclock+TICSPERFRAME); gameUpdate = true; - g_gameUpdateTime = timerGetTicks()-gameUpdateStartTime; + g_gameUpdateTime = timerGetHiTicks()-gameUpdateStartTime; if (g_gameUpdateAvgTime < 0.f) g_gameUpdateAvgTime = g_gameUpdateTime; g_gameUpdateAvgTime = ((GAMEUPDATEAVGTIMENUMSAMPLES-1.f)*g_gameUpdateAvgTime+g_gameUpdateTime)/((float) GAMEUPDATEAVGTIMENUMSAMPLES); @@ -6816,7 +6817,7 @@ MAIN_LOOP_RESTART: if (gameUpdate) { - g_gameUpdateAndDrawTime = timerGetTicks()-gameUpdateStartTime; + g_gameUpdateAndDrawTime = timerGetHiTicks()-gameUpdateStartTime; } } diff --git a/source/duke3d/src/game.h b/source/duke3d/src/game.h index f1dfc252e..313d18cef 100644 --- a/source/duke3d/src/game.h +++ b/source/duke3d/src/game.h @@ -338,7 +338,8 @@ extern int32_t MAXCACHE1DSIZE; extern palette_t CrosshairColors; extern palette_t DefaultCrosshairColors; -extern uint64_t g_frameDelay; +extern double g_frameDelay; +static inline double calcFrameDelay(int maxFPS) { return maxFPS ? ((double)timerGetFreqU64() / (double)(maxFPS)) : 0.0; } int32_t A_CheckInventorySprite(spritetype *s); int32_t A_InsertSprite(int16_t whatsect, int32_t s_x, int32_t s_y, int32_t s_z, int16_t s_pn, int8_t s_s, uint8_t s_xr, diff --git a/source/duke3d/src/global.cpp b/source/duke3d/src/global.cpp index 50f9e6ec0..3d5868721 100644 --- a/source/duke3d/src/global.cpp +++ b/source/duke3d/src/global.cpp @@ -90,7 +90,7 @@ int32_t g_gametypeFlags[MAXGAMETYPES] = GAMETYPE_TDMSPAWN, }; -float g_gameUpdateAvgTime = -1.f; +double g_gameUpdateAvgTime = 0.001; int32_t g_actorRespawnTime = 768; int32_t g_bouncemineRadius = 2500; diff --git a/source/duke3d/src/global.h b/source/duke3d/src/global.h index b79516a2c..4cb773c5c 100644 --- a/source/duke3d/src/global.h +++ b/source/duke3d/src/global.h @@ -160,10 +160,10 @@ G_EXTERN projectile_t SpriteProjectile[MAXSPRITES]; G_EXTERN sound_t g_sounds[MAXSOUNDS]; G_EXTERN uint32_t everyothertime; G_EXTERN uint32_t g_moveThingsCount; -G_EXTERN uint32_t g_gameUpdateTime; -G_EXTERN uint32_t g_gameUpdateAndDrawTime; +G_EXTERN double g_gameUpdateTime; +G_EXTERN double g_gameUpdateAndDrawTime; #define GAMEUPDATEAVGTIMENUMSAMPLES 100 -extern float g_gameUpdateAvgTime; +extern double g_gameUpdateAvgTime; #ifndef global_c_ extern char CheatKeys[2]; diff --git a/source/duke3d/src/menus.cpp b/source/duke3d/src/menus.cpp index 3ea6ee8d5..f73a8539b 100644 --- a/source/duke3d/src/menus.cpp +++ b/source/duke3d/src/menus.cpp @@ -3220,9 +3220,7 @@ static int32_t Menu_EntryOptionModify(MenuEntry_t *entry, int32_t newOption) } } else if (entry == &ME_VIDEOSETUP_FRAMELIMIT) - { - g_frameDelay = (newOption + r_maxfpsoffset) ? (timerGetFreqU64()/(newOption + r_maxfpsoffset)) : 0; - } + g_frameDelay = calcFrameDelay(newOption + r_maxfpsoffset); switch (g_currentMenu) { @@ -3330,7 +3328,7 @@ static int32_t Menu_EntryRangeInt32Modify(MenuEntry_t *entry, int32_t newValue) else if (entry == &ME_JOYSTICKAXIS_SATU) joySetDeadZone(M_JOYSTICKAXES.currentEntry, *MEO_JOYSTICKAXIS_DEAD.variable, newValue); else if (entry == &ME_VIDEOSETUP_FRAMELIMITOFFSET) - g_frameDelay = (r_maxfps + newValue) ? (timerGetFreqU64()/(r_maxfps + newValue)) : 0; + g_frameDelay = calcFrameDelay(r_maxfps + newValue); return 0; } diff --git a/source/duke3d/src/osdcmds.cpp b/source/duke3d/src/osdcmds.cpp index 00d22d1f3..b30be216f 100644 --- a/source/duke3d/src/osdcmds.cpp +++ b/source/duke3d/src/osdcmds.cpp @@ -1393,7 +1393,7 @@ static int osdcmd_cvar_set_game(osdcmdptr_t parm) else if (!Bstrcasecmp(parm->name, "r_maxfps") || !Bstrcasecmp(parm->name, "r_maxfpsoffset")) { if (r_maxfps != 0) r_maxfps = clamp(r_maxfps, 30, 1000); - g_frameDelay = r_maxfps ? (timerGetFreqU64()/(r_maxfps + r_maxfpsoffset)) : 0; + g_frameDelay = calcFrameDelay(r_maxfps + r_maxfpsoffset); } else if (!Bstrcasecmp(parm->name, "r_ambientlight")) { diff --git a/source/duke3d/src/screens.cpp b/source/duke3d/src/screens.cpp index 14f97b38a..32af0bdef 100644 --- a/source/duke3d/src/screens.cpp +++ b/source/duke3d/src/screens.cpp @@ -773,7 +773,7 @@ static void G_ShowCacheLocks(void) } } -#define LOW_FPS 60 +#define LOW_FPS ((videoGetRenderMode() == REND_CLASSIC) ? 35 : 50) #define SLOW_FRAME_TIME 20 #if defined GEKKO @@ -786,12 +786,14 @@ static void G_ShowCacheLocks(void) static void G_PrintFPS(void) { - static int32_t frameCount = 0, lastFPS = 0, lastFrameTime = 0, cumulativeFrameDelay = 0; - static int32_t minFPS = -1, maxFPS = 0; - static uint32_t minGameUpdate = -1, maxGameUpdate = 0; + static int32_t frameCount; + static double cumulativeFrameDelay; + static double lastFrameTime; + static float lastFPS, minFPS = FLT_MAX, maxFPS; + static double minGameUpdate = DBL_MAX, maxGameUpdate; - int32_t frameTime = timerGetTicks(); - int32_t frameDelay = frameTime - lastFrameTime; + double frameTime = timerGetHiTicks(); + double frameDelay = frameTime - lastFrameTime; cumulativeFrameDelay += frameDelay; if (frameDelay >= 0) @@ -800,7 +802,7 @@ static void G_PrintFPS(void) if (ud.showfps) { - int32_t chars = Bsprintf(tempbuf, "%d ms (%3d fps)", frameDelay, lastFPS); + int32_t chars = Bsprintf(tempbuf, "%.1f ms, %5.1f fps", frameDelay, lastFPS); printext256(windowxy2.x-(chars<<(3-x))+1, windowxy1.y+2+FPS_YOFFSET, 0, -1, tempbuf, x); printext256(windowxy2.x-(chars<<(3-x)), windowxy1.y+1+FPS_YOFFSET, @@ -808,13 +810,13 @@ static void G_PrintFPS(void) if (ud.showfps > 1) { - chars = Bsprintf(tempbuf, "max fps: %3d", maxFPS); + chars = Bsprintf(tempbuf, "max: %5.1f fps", maxFPS); printext256(windowxy2.x-(chars<<(3-x))+1, windowxy1.y+10+2+FPS_YOFFSET, 0, -1, tempbuf, x); printext256(windowxy2.x-(chars<<(3-x)), windowxy1.y+10+FPS_YOFFSET, FPS_COLOR(maxFPS < LOW_FPS), -1, tempbuf, x); - chars = Bsprintf(tempbuf, "min fps: %3d", minFPS); + chars = Bsprintf(tempbuf, "min: %5.1f fps", minFPS); printext256(windowxy2.x-(chars<<(3-x))+1, windowxy1.y+20+2+FPS_YOFFSET, 0, -1, tempbuf, x); printext256(windowxy2.x-(chars<<(3-x)), windowxy1.y+20+FPS_YOFFSET, @@ -825,13 +827,13 @@ static void G_PrintFPS(void) if (g_gameUpdateTime > maxGameUpdate) maxGameUpdate = g_gameUpdateTime; if (g_gameUpdateTime < minGameUpdate) minGameUpdate = g_gameUpdateTime; - chars = Bsprintf(tempbuf, "Game Update: %2u ms + draw: %2u ms", g_gameUpdateTime, g_gameUpdateAndDrawTime); + chars = Bsprintf(tempbuf, "Game Update: %2.2f ms + draw: %2.2f ms", g_gameUpdateTime, g_gameUpdateAndDrawTime); printext256(windowxy2.x-(chars<<(3-x))+1, windowxy1.y+30+2+FPS_YOFFSET, 0, -1, tempbuf, x); printext256(windowxy2.x-(chars<<(3-x)), windowxy1.y+30+FPS_YOFFSET, FPS_COLOR(g_gameUpdateAndDrawTime >= SLOW_FRAME_TIME), -1, tempbuf, x); - chars = Bsprintf(tempbuf, "GU min/max/avg: %2u/%2u/%5.2f ms", minGameUpdate, maxGameUpdate, g_gameUpdateAvgTime); + chars = Bsprintf(tempbuf, "GU min/max/avg: %5.2f/%5.2f/%5.2f ms", minGameUpdate, maxGameUpdate, g_gameUpdateAvgTime); printext256(windowxy2.x-(chars<<(3-x))+1, windowxy1.y+40+2+FPS_YOFFSET, 0, -1, tempbuf, x); printext256(windowxy2.x-(chars<<(3-x)), windowxy1.y+40+FPS_YOFFSET, @@ -861,24 +863,26 @@ static void G_PrintFPS(void) } } - if (cumulativeFrameDelay >= 1000) + if (cumulativeFrameDelay >= 1000.0) { - g_frameRate = lastFPS = tabledivide32_noinline(1000*frameCount, cumulativeFrameDelay); + lastFPS = 1000.f * frameCount / cumulativeFrameDelay; + g_frameRate = Blrintf(lastFPS); frameCount = 0; - cumulativeFrameDelay = 0; + cumulativeFrameDelay = 0.0; if (ud.showfps > 1) { if (lastFPS > maxFPS) maxFPS = lastFPS; - if ((unsigned) lastFPS < (unsigned) minFPS) minFPS = lastFPS; + if (lastFPS < minFPS) minFPS = lastFPS; + static int secondCounter; - if (++secondCounter == 3) + if (++secondCounter == 1) { - maxFPS = (lastFPS + maxFPS) >> 1; - minFPS = (lastFPS + minFPS) >> 1; - maxGameUpdate = (g_gameUpdateTime + maxGameUpdate) >> 1; - minGameUpdate = (g_gameUpdateTime + minGameUpdate) >> 1; + maxFPS = (lastFPS + maxFPS) * .5f; + minFPS = (lastFPS + minFPS) * .5f; + maxGameUpdate = (g_gameUpdateTime + maxGameUpdate) * 0.5; + minGameUpdate = (g_gameUpdateTime + minGameUpdate) * 0.5; secondCounter = 0; } }