From 1b49a96eed927e80e019b580c5a94e13ae3e0640 Mon Sep 17 00:00:00 2001 From: James R Date: Wed, 12 Jan 2022 03:36:02 -0800 Subject: [PATCH] Interpolate from time of previous tic Previously interpolated from last 35th of a second, which may be offset from game time due to connection lag. Consider this the proper fix to 54148a0dd0 too. --- src/d_clisrv.c | 16 ++++++++++++---- src/d_clisrv.h | 2 +- src/d_main.c | 16 +++++++++++++--- src/i_system.h | 4 ++-- src/sdl/i_system.c | 5 ++--- 5 files changed, 30 insertions(+), 13 deletions(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index ac8bba608..2972502a7 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -5206,8 +5206,10 @@ static void SV_Maketic(void) maketic++; } -void TryRunTics(tic_t realtics) +boolean TryRunTics(tic_t realtics) { + boolean ticking; + // the machine has lagged but it is not so bad if (realtics > TICRATE/7) // FIXME: consistency failure!! { @@ -5251,10 +5253,14 @@ void TryRunTics(tic_t realtics) } #endif - if (player_joining) - return; + ticking = neededtic > gametic; - if (neededtic > gametic) + if (player_joining) + { + return false; + } + + if (ticking) { if (advancedemo) { @@ -5290,6 +5296,8 @@ void TryRunTics(tic_t realtics) break; } } + + return ticking; } /* diff --git a/src/d_clisrv.h b/src/d_clisrv.h index bf3f0b64f..c75f7f0bf 100644 --- a/src/d_clisrv.h +++ b/src/d_clisrv.h @@ -430,7 +430,7 @@ boolean Playing(void); void D_QuitNetGame(void); //? How many ticks to run? -void TryRunTics(tic_t realtic); +boolean TryRunTics(tic_t realtic); // extra data for lmps // these functions scare me. they contain magic. diff --git a/src/d_main.c b/src/d_main.c index 963439d66..155913320 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -697,6 +697,7 @@ void D_SRB2Loop(void) { tic_t oldentertics = 0, entertic = 0, realtics = 0, rendertimeout = INFTICS; static lumpnum_t gstartuplumpnum; + boolean ticked; if (dedicated) server = true; @@ -783,11 +784,20 @@ void D_SRB2Loop(void) realtics = 1; // process tics (but maybe not if realtic == 0) - TryRunTics(realtics); + ticked = TryRunTics(realtics); - if (cv_frameinterpolation.value == 1) + if (cv_frameinterpolation.value == 1 && !(paused || P_AutoPause())) { - fixed_t entertimefrac = I_GetTimeFrac(); + static float tictime; + float entertime = I_GetTimeFrac(); + + fixed_t entertimefrac; + + if (ticked) + tictime = entertime; + + entertimefrac = FLOAT_TO_FIXED(entertime - tictime); + // renderdeltatics is a bit awkard to evaluate, since the system time interface is whole tic-based renderdeltatics = realtics * FRACUNIT; if (entertimefrac > rendertimefrac) diff --git a/src/i_system.h b/src/i_system.h index 0cdc7db85..93bb34a21 100644 --- a/src/i_system.h +++ b/src/i_system.h @@ -46,9 +46,9 @@ UINT32 I_GetFreeMem(UINT32 *total); */ tic_t I_GetTime(void); -/** \brief Get the current time as a fraction of a tic since the last tic. +/** \brief Get the current time in tics including fractions. */ -fixed_t I_GetTimeFrac(void); +float I_GetTimeFrac(void); /** \brief Returns precise time value for performance measurement. */ diff --git a/src/sdl/i_system.c b/src/sdl/i_system.c index 2d99f5c1f..bf2e42cfd 100644 --- a/src/sdl/i_system.c +++ b/src/sdl/i_system.c @@ -2160,11 +2160,10 @@ tic_t I_GetTime(void) return (tic_t) floor(elapsed_tics); } -fixed_t I_GetTimeFrac(void) +float I_GetTimeFrac(void) { UpdateElapsedTics(); - - return FLOAT_TO_FIXED((float) (elapsed_tics - floor(elapsed_tics))); + return elapsed_tics; } precise_t I_GetPreciseTime(void)