make RTT calculations more TCP-like (contributed by Vladimir 'virtul' Ivannikov)
This commit is contained in:
+28
-10
@@ -851,24 +851,39 @@ enet_protocol_handle_acknowledge (ENetHost * host, ENetEvent * event, ENetPeer *
|
|||||||
if (ENET_TIME_LESS (host -> serviceTime, receivedSentTime))
|
if (ENET_TIME_LESS (host -> serviceTime, receivedSentTime))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
peer -> lastReceiveTime = host -> serviceTime;
|
|
||||||
peer -> earliestTimeout = 0;
|
|
||||||
|
|
||||||
roundTripTime = ENET_TIME_DIFFERENCE (host -> serviceTime, receivedSentTime);
|
roundTripTime = ENET_TIME_DIFFERENCE (host -> serviceTime, receivedSentTime);
|
||||||
|
|
||||||
enet_peer_throttle (peer, roundTripTime);
|
enet_peer_throttle (peer, roundTripTime);
|
||||||
|
|
||||||
peer -> roundTripTimeVariance -= peer -> roundTripTimeVariance / 4;
|
if (peer -> lastReceiveTime > 0)
|
||||||
|
|
||||||
if (roundTripTime >= peer -> roundTripTime)
|
|
||||||
{
|
{
|
||||||
peer -> roundTripTime += (roundTripTime - peer -> roundTripTime) / 8;
|
if (roundTripTime >= peer -> roundTripTime)
|
||||||
peer -> roundTripTimeVariance += (roundTripTime - peer -> roundTripTime) / 4;
|
{
|
||||||
|
enet_uint32 diff = roundTripTime - peer -> roundTripTime;
|
||||||
|
peer -> roundTripTimeVariance -= peer -> roundTripTimeVariance / 4;
|
||||||
|
peer -> roundTripTimeVariance += diff / 4;
|
||||||
|
peer -> roundTripTime += diff / 8;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
enet_uint32 diff = peer -> roundTripTime - roundTripTime;
|
||||||
|
if (diff <= peer -> roundTripTimeVariance)
|
||||||
|
{
|
||||||
|
peer -> roundTripTimeVariance -= peer -> roundTripTimeVariance / 4;
|
||||||
|
peer -> roundTripTimeVariance += diff / 4;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
peer -> roundTripTimeVariance -= peer -> roundTripTimeVariance / 32;
|
||||||
|
peer -> roundTripTimeVariance += diff / 32;
|
||||||
|
}
|
||||||
|
peer -> roundTripTime -= diff / 8;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
peer -> roundTripTime -= (peer -> roundTripTime - roundTripTime) / 8;
|
peer -> roundTripTime = roundTripTime;
|
||||||
peer -> roundTripTimeVariance += (peer -> roundTripTime - roundTripTime) / 4;
|
peer -> roundTripTimeVariance = roundTripTime / 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (peer -> roundTripTime < peer -> lowestRoundTripTime)
|
if (peer -> roundTripTime < peer -> lowestRoundTripTime)
|
||||||
@@ -887,6 +902,9 @@ enet_protocol_handle_acknowledge (ENetHost * host, ENetEvent * event, ENetPeer *
|
|||||||
peer -> packetThrottleEpoch = host -> serviceTime;
|
peer -> packetThrottleEpoch = host -> serviceTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
peer -> lastReceiveTime = ENET_MAX (host -> serviceTime, 1);
|
||||||
|
peer -> earliestTimeout = 0;
|
||||||
|
|
||||||
receivedReliableSequenceNumber = ENET_NET_TO_HOST_16 (command -> acknowledge.receivedReliableSequenceNumber);
|
receivedReliableSequenceNumber = ENET_NET_TO_HOST_16 (command -> acknowledge.receivedReliableSequenceNumber);
|
||||||
|
|
||||||
commandNumber = enet_protocol_remove_sent_reliable_command (peer, receivedReliableSequenceNumber, command -> header.channelID);
|
commandNumber = enet_protocol_remove_sent_reliable_command (peer, receivedReliableSequenceNumber, command -> header.channelID);
|
||||||
|
|||||||
Reference in New Issue
Block a user