From c0678e5016386ab6aa6aa4f4d8607a6eb9897cbf Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Sun, 27 Mar 2022 13:17:26 -0400 Subject: [PATCH] Check FPS cap further in the main loop This allows map changes to properly run. (I also seem to be able to hit the framerate cap slightly more often ... maybe placebo lol) --- src/d_main.c | 88 ++++++++++++++++++++++++++++++---------------- src/d_netcmd.c | 2 +- src/i_system.h | 2 +- src/sdl/i_system.c | 21 ++--------- 4 files changed, 62 insertions(+), 51 deletions(-) diff --git a/src/d_main.c b/src/d_main.c index 4c750ef95..ede81dc7a 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -679,6 +679,29 @@ static void D_Display(void) } } +static boolean D_CheckFrameCap(void) +{ + static boolean init = false; + static precise_t startCap = 0; + precise_t endCap = 0; + + endCap = I_GetPreciseTime(); + + if (init == false) + { + startCap = endCap; + init = true; + } + else if (I_CheckFrameCap(startCap, endCap)) + { + // Framerate should be capped. + return true; + } + + startCap = endCap; + return false; +} + // ========================================================================= // D_SRB2Loop // ========================================================================= @@ -762,18 +785,11 @@ void D_SRB2Loop(void) #endif interp = R_UsingFrameInterpolation(); - if (interp) + if (!realtics && !singletics && !interp) { - if (I_CheckFrameCap()) - continue; - } - else - { - if (!realtics && !singletics) - { - I_Sleep(); - continue; - } + // Non-interp sleep + I_Sleep(); + continue; } #ifdef HW3SOUND @@ -788,31 +804,43 @@ void D_SRB2Loop(void) // process tics (but maybe not if realtic == 0) ticked = TryRunTics(realtics); - if (interp && !(paused || P_AutoPause())) + if (interp) { - static float tictime = 0.0f; - static float prevtime = 0.0f; - float entertime = I_GetTimeFrac(); - fixed_t entertimefrac; + if (!(paused || P_AutoPause())) + { + static float tictime = 0.0f; + static float prevtime = 0.0f; + float entertime = I_GetTimeFrac(); + fixed_t entertimefrac; - if (ticked) - tictime = entertime; + if (ticked) + tictime = entertime; - if (entertime - prevtime >= 1.0f) // Lagged for more frames than a gametic... shut off interpolation. - entertimefrac = FRACUNIT; - else - entertimefrac = min(FRACUNIT, FLOAT_TO_FIXED(entertime - tictime)); + if (entertime - prevtime >= 1.0f) // Lagged for more frames than a gametic... shut off interpolation. + entertimefrac = FRACUNIT; + else + entertimefrac = min(FRACUNIT, FLOAT_TO_FIXED(entertime - tictime)); - prevtime = entertime; + prevtime = entertime; - // renderdeltatics is a bit awkard to evaluate, since the system time interface is whole tic-based - renderdeltatics = realtics * FRACUNIT; - if (entertimefrac > rendertimefrac) - renderdeltatics += entertimefrac - rendertimefrac; - else - renderdeltatics -= rendertimefrac - entertimefrac; + // renderdeltatics is a bit awkard to evaluate, since the system time interface is whole tic-based + renderdeltatics = realtics * FRACUNIT; + if (entertimefrac > rendertimefrac) + renderdeltatics += entertimefrac - rendertimefrac; + else + renderdeltatics -= rendertimefrac - entertimefrac; - rendertimefrac = entertimefrac; + rendertimefrac = entertimefrac; + } + + // Handle interp sleep / framerate cap here. + // TryRunTics needs ran if possible to prevent lagged map changes, + // (and if that runs, the code above needs to also run) + // so this is done here after TryRunTics. + if (D_CheckFrameCap()) + { + continue; + } } else { diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 0dcc5f5b2..51b6b97d6 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -237,7 +237,7 @@ static CV_PossibleValue_t teamscramble_cons_t[] = {{0, "Off"}, {1, "Random"}, {2 static CV_PossibleValue_t startingliveslimit_cons_t[] = {{1, "MIN"}, {99, "MAX"}, {0, NULL}}; -static CV_PossibleValue_t sleeping_cons_t[] = {{-1, "MIN"}, {1000/TICRATE, "MAX"}, {0, NULL}}; +static CV_PossibleValue_t sleeping_cons_t[] = {{0, "MIN"}, {1000/TICRATE, "MAX"}, {0, NULL}}; static CV_PossibleValue_t pause_cons_t[] = {{0, "Server"}, {1, "All"}, {0, NULL}}; diff --git a/src/i_system.h b/src/i_system.h index cbe4aaf3a..47a6838a0 100644 --- a/src/i_system.h +++ b/src/i_system.h @@ -64,7 +64,7 @@ int I_PreciseToMicros(precise_t d); */ void I_Sleep(void); -boolean I_CheckFrameCap(void); +boolean I_CheckFrameCap(precise_t start, precise_t end); /** \brief Get events diff --git a/src/sdl/i_system.c b/src/sdl/i_system.c index 949d3f428..4624ac3e0 100644 --- a/src/sdl/i_system.c +++ b/src/sdl/i_system.c @@ -1701,32 +1701,16 @@ void I_Sleep(void) SDL_Delay(cv_sleep.value); } -boolean I_CheckFrameCap(void) +boolean I_CheckFrameCap(precise_t start, precise_t end) { - static boolean init = false; - - static precise_t start = 0; - precise_t end; - - int elapsed; - UINT32 capFrames = R_GetFramerateCap(); int capMicros = 0; - end = I_GetPreciseTime(); - - if (init == false) - { - // Just initialized. - start = end; - init = true; - return false; - } + int elapsed; if (capFrames == 0) { // We don't want to cap. - start = end; return false; } @@ -1760,7 +1744,6 @@ boolean I_CheckFrameCap(void) } // Waited enough to draw again. - start = end; return false; }