engine: client: another interpolation fix

This commit is contained in:
SNMetamorph 2021-05-07 21:53:15 +04:00 committed by Alibek Omarov #SupportRMS
parent b289de26a6
commit 386ae2067b
2 changed files with 26 additions and 25 deletions

View File

@ -241,6 +241,11 @@ void CL_SignonReply( void )
}
}
float CL_LerpInterval( void )
{
return max( cl_interp->value, 1.f / cl_updaterate->value );
}
/*
===============
CL_LerpPoint
@ -291,12 +296,13 @@ static float CL_LerpPoint( void )
if( cl_interp->value > 0.001f )
{
// manual lerp value (goldsrc mode)
frac = ( cl.time - cl.mtime[1] ) / cl_interp->value;
float td = max( 0.f, cl.time - cl.mtime[0] );
frac = td / CL_LerpInterval();
}
else if( server_frametime > 0.001f )
{
// automatic lerp (classic mode)
frac = ( cl.time - cl.mtime[1] ) / server_frametime;
frac = ( cl.time - cl.mtime[1] ) / server_frametime;
}
#endif
return frac;
@ -339,10 +345,10 @@ Validate interpolation cvars, calc interpolation window
*/
void CL_ComputeClientInterpolationAmount( usercmd_t *cmd )
{
int min_interp = MIN_EX_INTERP;
int max_interp = MAX_EX_INTERP;
int interpolation_msec;
qboolean forced = false;
const float epsilon = 0.001f; // to avoid float invalid comparision
float min_interp = MIN_EX_INTERP;
float max_interp = MAX_EX_INTERP;
float interpolation_time;
if( cl_updaterate->value < MIN_UPDATERATE )
{
@ -357,29 +363,24 @@ void CL_ComputeClientInterpolationAmount( usercmd_t *cmd )
}
if( cls.spectator )
max_interp = 200;
max_interp = 0.2f;
min_interp = 1000.0f / cl_updaterate->value;
min_interp = Q_max( 1, min_interp );
interpolation_msec = cl_interp->value * 1000.0f;
if(( interpolation_msec + 1 ) < min_interp )
min_interp = 1.0f / cl_updaterate->value;
interpolation_time = CL_LerpInterval( );
if( (cl_interp->value + epsilon) < min_interp )
{
Con_Printf( "ex_interp forced up to %i msec\n", interpolation_msec );
interpolation_msec = min_interp;
forced = true;
Con_Printf( "ex_interp forced up to %.1f msec\n", min_interp * 1000.f );
Cvar_SetValue( "ex_interp", min_interp );
}
else if(( interpolation_msec - 1 ) > max_interp )
else if( (cl_interp->value - epsilon) > max_interp )
{
Con_Printf( "ex_interp forced down to %i msec\n", interpolation_msec );
interpolation_msec = max_interp;
forced = true;
Con_Printf( "ex_interp forced down to %.1f msec\n", max_interp * 1000.f );
Cvar_SetValue( "ex_interp", max_interp );
}
if( forced ) Cvar_SetValue( "ex_interp", (float)interpolation_msec * 0.001f );
interpolation_msec = bound( min_interp, interpolation_msec, max_interp );
cmd->lerp_msec = CL_DriftInterpolationAmount( interpolation_msec );
interpolation_time = bound( min_interp, interpolation_time, max_interp );
cmd->lerp_msec = CL_DriftInterpolationAmount( interpolation_time * 1000 );
}
/*

View File

@ -107,8 +107,8 @@ extern int CL_UPDATE_BACKUP;
#define MIN_UPDATERATE 10.0f
#define MAX_UPDATERATE 102.0f
#define MIN_EX_INTERP 50.0f
#define MAX_EX_INTERP 100.0f
#define MIN_EX_INTERP 0.005f
#define MAX_EX_INTERP 0.1f
#define CL_MIN_RESEND_TIME 1.5f // mininum time gap (in seconds) before a subsequent connection request is sent.
#define CL_MAX_RESEND_TIME 20.0f // max time. The cvar cl_resend is bounded by these.