Improve lossy connections by sending diff from "known" state if it's easy
This commit is contained in:
@@ -117,8 +117,8 @@ void Transport<MyState, RemoteState>::recv( void )
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ( verbose ) {
|
if ( verbose ) {
|
||||||
fprintf( stderr, "[%u] Received state %d [ack %d]\n",
|
fprintf( stderr, "[%u] Received state %d [coming from %d, ack %d]\n",
|
||||||
(unsigned int)(timestamp() % 100000), (int)new_state.num, (int)inst.ack_num() );
|
(unsigned int)(timestamp() % 100000), (int)new_state.num, (int)inst.old_num(), (int)inst.ack_num() );
|
||||||
}
|
}
|
||||||
received_states.push_back( new_state );
|
received_states.push_back( new_state );
|
||||||
sender.set_ack_num( received_states.back().num );
|
sender.set_ack_num( received_states.back().num );
|
||||||
|
|||||||
@@ -150,6 +150,8 @@ void TransportSender<MyState>::tick( void )
|
|||||||
|
|
||||||
string diff = current_state.diff_from( assumed_receiver_state->state );
|
string diff = current_state.diff_from( assumed_receiver_state->state );
|
||||||
|
|
||||||
|
attempt_prospective_resend_optimization( diff );
|
||||||
|
|
||||||
/* verify diff has round-trip identity (modulo Unicode fallback rendering) */
|
/* verify diff has round-trip identity (modulo Unicode fallback rendering) */
|
||||||
/*
|
/*
|
||||||
MyState newstate( assumed_receiver_state->state );
|
MyState newstate( assumed_receiver_state->state );
|
||||||
@@ -349,3 +351,26 @@ void TransportSender<MyState>::set_ack_num( uint64_t s_ack_num )
|
|||||||
{
|
{
|
||||||
ack_num = s_ack_num;
|
ack_num = s_ack_num;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Investigate diff against known receiver state instead */
|
||||||
|
/* Mutates proposed_diff */
|
||||||
|
template <class MyState>
|
||||||
|
void TransportSender<MyState>::attempt_prospective_resend_optimization( string &proposed_diff )
|
||||||
|
{
|
||||||
|
if ( assumed_receiver_state == sent_states.begin() ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
string resend_diff = current_state.diff_from( sent_states.front().state );
|
||||||
|
|
||||||
|
/* We do a prophylactic resend if it would make the diff shorter,
|
||||||
|
or if it would lengthen it by no more than 100 bytes and still be
|
||||||
|
less than 1000 bytes. */
|
||||||
|
|
||||||
|
if ( (resend_diff.size() <= proposed_diff.size())
|
||||||
|
|| ( (resend_diff.size() < 1000)
|
||||||
|
&& (resend_diff.size() - proposed_diff.size() < 100) ) ) {
|
||||||
|
assumed_receiver_state = sent_states.begin();
|
||||||
|
proposed_diff = resend_diff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -48,6 +48,7 @@ namespace Network {
|
|||||||
|
|
||||||
/* helper methods for tick() */
|
/* helper methods for tick() */
|
||||||
void update_assumed_receiver_state( void );
|
void update_assumed_receiver_state( void );
|
||||||
|
void attempt_prospective_resend_optimization( string &proposed_diff );
|
||||||
void rationalize_states( void );
|
void rationalize_states( void );
|
||||||
void send_to_receiver( string diff );
|
void send_to_receiver( string diff );
|
||||||
void send_empty_ack( void );
|
void send_empty_ack( void );
|
||||||
|
|||||||
Reference in New Issue
Block a user