engine: server: merge SV_FindBestBaseline for normal entities and static entities into single function

This commit is contained in:
Alibek Omarov 2024-12-18 06:57:07 +03:00
parent 98e587285b
commit 93c5853356
3 changed files with 16 additions and 41 deletions

View file

@ -593,7 +593,7 @@ qboolean SV_CheckID( const char *id );
// sv_frame.c // sv_frame.c
// //
void SV_InactivateClients( void ); void SV_InactivateClients( void );
int SV_FindBestBaselineForStatic( int index, entity_state_t **baseline, entity_state_t *to ); int SV_FindBestBaseline( int index, entity_state_t **baseline, entity_state_t *to, client_frame_t *frame, qboolean player );
void SV_SkipUpdates( void ); void SV_SkipUpdates( void );
// //

View file

@ -178,9 +178,10 @@ Encode a client frame onto the network channel
SV_FindBestBaseline SV_FindBestBaseline
trying to deltas with previous entities trying to deltas with previous entities
set frame to NULL to check for static entities
============= =============
*/ */
static int SV_FindBestBaseline( sv_client_t *cl, int index, entity_state_t **baseline, entity_state_t *to, client_frame_t *frame, qboolean player ) int SV_FindBestBaseline( int index, entity_state_t **baseline, entity_state_t *to, client_frame_t *frame, qboolean player )
{ {
int bestBitCount; int bestBitCount;
int i, bitCount; int i, bitCount;
@ -193,7 +194,13 @@ static int SV_FindBestBaseline( sv_client_t *cl, int index, entity_state_t **bas
for( i = index - 1; bestBitCount > 0 && i >= 0 && ( index - i ) < ( MAX_CUSTOM_BASELINES - 1 ); i-- ) for( i = index - 1; bestBitCount > 0 && i >= 0 && ( index - i ) < ( MAX_CUSTOM_BASELINES - 1 ); i-- )
{ {
// don't worry about underflow in circular buffer // don't worry about underflow in circular buffer
entity_state_t *test = &svs.packet_entities[(frame->first_entity+i) % svs.num_client_entities]; entity_state_t *test;
// if set, then it's normal entity
if( frame != NULL )
test = &svs.packet_entities[(frame->first_entity+i) % svs.num_client_entities];
else
test = &svs.static_entities[i];
if( to->entityType == test->entityType ) if( to->entityType == test->entityType )
{ {
@ -209,44 +216,12 @@ static int SV_FindBestBaseline( sv_client_t *cl, int index, entity_state_t **bas
// using delta from previous entity as baseline for current // using delta from previous entity as baseline for current
if( index != bestfound ) if( index != bestfound )
{
if( frame != NULL )
*baseline = &svs.packet_entities[(frame->first_entity+bestfound) % svs.num_client_entities]; *baseline = &svs.packet_entities[(frame->first_entity+bestfound) % svs.num_client_entities];
return index - bestfound; else
}
/*
=============
SV_FindBestBaselineForStatic
trying to deltas with previous static entities
=============
*/
int SV_FindBestBaselineForStatic( int index, entity_state_t **baseline, entity_state_t *to )
{
int bestBitCount;
int i, bitCount;
int bestfound, j;
bestBitCount = j = Delta_TestBaseline( *baseline, to, false, sv.time );
bestfound = index;
// lookup backward for previous 64 states and try to interpret current delta as baseline
for( i = index - 1; bestBitCount > 0 && i >= 0 && ( index - i ) < ( MAX_CUSTOM_BASELINES - 1 ); i-- )
{
// don't worry about underflow in circular buffer
entity_state_t *test = &svs.static_entities[i];
bitCount = Delta_TestBaseline( test, to, false, sv.time );
if( bitCount < bestBitCount )
{
bestBitCount = bitCount;
bestfound = i;
}
}
// using delta from previous entity as baseline for current
if( index != bestfound )
*baseline = &svs.static_entities[bestfound]; *baseline = &svs.static_entities[bestfound];
}
return index - bestfound; return index - bestfound;
} }
@ -347,7 +322,7 @@ static void SV_EmitPacketEntities( sv_client_t *cl, client_frame_t *to, sizebuf_
// trying to reduce message by select optimal baseline // trying to reduce message by select optimal baseline
if( !sv_instancedbaseline.value || !sv.num_instanced || sv.last_valid_baseline > newnum ) if( !sv_instancedbaseline.value || !sv.num_instanced || sv.last_valid_baseline > newnum )
{ {
offset = SV_FindBestBaseline( cl, newindex, &baseline, newent, to, player ); offset = SV_FindBestBaseline( newindex, &baseline, newent, to, player );
} }
else else
{ {

View file

@ -578,7 +578,7 @@ qboolean SV_CreateStaticEntity( sizebuf_t *msg, int index )
state->number = 0; state->number = 0;
// trying to compress with previous delta's // trying to compress with previous delta's
offset = SV_FindBestBaselineForStatic( index, &baseline, state ); offset = SV_FindBestBaseline( index, &baseline, state, NULL, false );
MSG_BeginServerCmd( msg, svc_spawnstatic ); MSG_BeginServerCmd( msg, svc_spawnstatic );
MSG_WriteDeltaEntity( baseline, state, msg, true, DELTA_STATIC, sv.time, offset ); MSG_WriteDeltaEntity( baseline, state, msg, true, DELTA_STATIC, sv.time, offset );