|
@@ -48,11 +48,11 @@ enet_protocol_dispatch_state (ENetHost * host, ENetPeer * peer, ENetPeerState st
|
|
{
|
|
{
|
|
enet_protocol_change_state (host, peer, state);
|
|
enet_protocol_change_state (host, peer, state);
|
|
|
|
|
|
- if (! peer -> needsDispatch)
|
|
|
|
|
|
+ if (! (peer -> flags & ENET_PEER_FLAG_NEEDS_DISPATCH))
|
|
{
|
|
{
|
|
enet_list_insert (enet_list_end (& host -> dispatchQueue), & peer -> dispatchList);
|
|
enet_list_insert (enet_list_end (& host -> dispatchQueue), & peer -> dispatchList);
|
|
|
|
|
|
- peer -> needsDispatch = 1;
|
|
|
|
|
|
+ peer -> flags |= ENET_PEER_FLAG_NEEDS_DISPATCH;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -63,7 +63,7 @@ enet_protocol_dispatch_incoming_commands (ENetHost * host, ENetEvent * event)
|
|
{
|
|
{
|
|
ENetPeer * peer = (ENetPeer *) enet_list_remove (enet_list_begin (& host -> dispatchQueue));
|
|
ENetPeer * peer = (ENetPeer *) enet_list_remove (enet_list_begin (& host -> dispatchQueue));
|
|
|
|
|
|
- peer -> needsDispatch = 0;
|
|
|
|
|
|
+ peer -> flags &= ~ ENET_PEER_FLAG_NEEDS_DISPATCH;
|
|
|
|
|
|
switch (peer -> state)
|
|
switch (peer -> state)
|
|
{
|
|
{
|
|
@@ -101,7 +101,7 @@ enet_protocol_dispatch_incoming_commands (ENetHost * host, ENetEvent * event)
|
|
|
|
|
|
if (! enet_list_empty (& peer -> dispatchedCommands))
|
|
if (! enet_list_empty (& peer -> dispatchedCommands))
|
|
{
|
|
{
|
|
- peer -> needsDispatch = 1;
|
|
|
|
|
|
+ peer -> flags |= ENET_PEER_FLAG_NEEDS_DISPATCH;
|
|
|
|
|
|
enet_list_insert (enet_list_end (& host -> dispatchQueue), & peer -> dispatchList);
|
|
enet_list_insert (enet_list_end (& host -> dispatchQueue), & peer -> dispatchList);
|
|
}
|
|
}
|
|
@@ -851,24 +851,29 @@ 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);
|
|
|
|
+ roundTripTime = ENET_MAX (roundTripTime, 1);
|
|
|
|
|
|
- enet_peer_throttle (peer, roundTripTime);
|
|
|
|
|
|
+ if (peer -> lastReceiveTime > 0)
|
|
|
|
+ {
|
|
|
|
+ enet_uint32 accumRoundTripTime = (peer -> roundTripTime << 8) + peer -> roundTripTimeRemainder;
|
|
|
|
+ enet_uint32 accumRoundTripTimeVariance = (peer -> roundTripTimeVariance << 8) + peer -> roundTripTimeVarianceRemainder;
|
|
|
|
|
|
- peer -> roundTripTimeVariance -= peer -> roundTripTimeVariance / 4;
|
|
|
|
|
|
+ enet_peer_throttle (peer, roundTripTime);
|
|
|
|
|
|
- if (roundTripTime >= peer -> roundTripTime)
|
|
|
|
- {
|
|
|
|
- peer -> roundTripTime += (roundTripTime - peer -> roundTripTime) / 8;
|
|
|
|
- peer -> roundTripTimeVariance += (roundTripTime - peer -> roundTripTime) / 4;
|
|
|
|
|
|
+ roundTripTime <<= 8;
|
|
|
|
+ accumRoundTripTimeVariance = (accumRoundTripTimeVariance * 3 + ENET_DIFFERENCE (roundTripTime, accumRoundTripTime)) / 4;
|
|
|
|
+ accumRoundTripTime = (accumRoundTripTime * 7 + roundTripTime) / 8;
|
|
|
|
+
|
|
|
|
+ peer -> roundTripTime = accumRoundTripTime >> 8;
|
|
|
|
+ peer -> roundTripTimeRemainder = accumRoundTripTime & 0xFF;
|
|
|
|
+ peer -> roundTripTimeVariance = accumRoundTripTimeVariance >> 8;
|
|
|
|
+ peer -> roundTripTimeVarianceRemainder = accumRoundTripTimeVariance & 0xFF;
|
|
}
|
|
}
|
|
else
|
|
else
|
|
{
|
|
{
|
|
- peer -> roundTripTime -= (peer -> roundTripTime - roundTripTime) / 8;
|
|
|
|
- peer -> roundTripTimeVariance += (peer -> roundTripTime - roundTripTime) / 4;
|
|
|
|
|
|
+ peer -> roundTripTime = roundTripTime;
|
|
|
|
+ peer -> roundTripTimeVariance = (roundTripTime + 1) / 2;
|
|
}
|
|
}
|
|
|
|
|
|
if (peer -> roundTripTime < peer -> lowestRoundTripTime)
|
|
if (peer -> roundTripTime < peer -> lowestRoundTripTime)
|
|
@@ -881,12 +886,15 @@ enet_protocol_handle_acknowledge (ENetHost * host, ENetEvent * event, ENetPeer *
|
|
ENET_TIME_DIFFERENCE (host -> serviceTime, peer -> packetThrottleEpoch) >= peer -> packetThrottleInterval)
|
|
ENET_TIME_DIFFERENCE (host -> serviceTime, peer -> packetThrottleEpoch) >= peer -> packetThrottleInterval)
|
|
{
|
|
{
|
|
peer -> lastRoundTripTime = peer -> lowestRoundTripTime;
|
|
peer -> lastRoundTripTime = peer -> lowestRoundTripTime;
|
|
- peer -> lastRoundTripTimeVariance = peer -> highestRoundTripTimeVariance;
|
|
|
|
|
|
+ peer -> lastRoundTripTimeVariance = ENET_MAX (peer -> highestRoundTripTimeVariance, 2);
|
|
peer -> lowestRoundTripTime = peer -> roundTripTime;
|
|
peer -> lowestRoundTripTime = peer -> roundTripTime;
|
|
peer -> highestRoundTripTimeVariance = peer -> roundTripTimeVariance;
|
|
peer -> highestRoundTripTimeVariance = peer -> roundTripTimeVariance;
|
|
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);
|
|
@@ -1261,7 +1269,7 @@ enet_protocol_receive_incoming_commands (ENetHost * host, ENetEvent * event)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- return -1;
|
|
|
|
|
|
+ return 0;
|
|
}
|
|
}
|
|
|
|
|
|
static void
|
|
static void
|
|
@@ -1663,19 +1671,9 @@ enet_protocol_send_outgoing_commands (ENetHost * host, ENetEvent * event, int ch
|
|
#ifdef ENET_DEBUG
|
|
#ifdef ENET_DEBUG
|
|
printf ("peer %u: %f%%+-%f%% packet loss, %u+-%u ms round trip time, %f%% throttle, %u/%u outgoing, %u/%u incoming\n", currentPeer -> incomingPeerID, currentPeer -> packetLoss / (float) ENET_PEER_PACKET_LOSS_SCALE, currentPeer -> packetLossVariance / (float) ENET_PEER_PACKET_LOSS_SCALE, currentPeer -> roundTripTime, currentPeer -> roundTripTimeVariance, currentPeer -> packetThrottle / (float) ENET_PEER_PACKET_THROTTLE_SCALE, enet_list_size (& currentPeer -> outgoingReliableCommands), enet_list_size (& currentPeer -> outgoingUnreliableCommands), currentPeer -> channels != NULL ? enet_list_size (& currentPeer -> channels -> incomingReliableCommands) : 0, currentPeer -> channels != NULL ? enet_list_size (& currentPeer -> channels -> incomingUnreliableCommands) : 0);
|
|
printf ("peer %u: %f%%+-%f%% packet loss, %u+-%u ms round trip time, %f%% throttle, %u/%u outgoing, %u/%u incoming\n", currentPeer -> incomingPeerID, currentPeer -> packetLoss / (float) ENET_PEER_PACKET_LOSS_SCALE, currentPeer -> packetLossVariance / (float) ENET_PEER_PACKET_LOSS_SCALE, currentPeer -> roundTripTime, currentPeer -> roundTripTimeVariance, currentPeer -> packetThrottle / (float) ENET_PEER_PACKET_THROTTLE_SCALE, enet_list_size (& currentPeer -> outgoingReliableCommands), enet_list_size (& currentPeer -> outgoingUnreliableCommands), currentPeer -> channels != NULL ? enet_list_size (& currentPeer -> channels -> incomingReliableCommands) : 0, currentPeer -> channels != NULL ? enet_list_size (& currentPeer -> channels -> incomingUnreliableCommands) : 0);
|
|
#endif
|
|
#endif
|
|
-
|
|
|
|
- currentPeer -> packetLossVariance -= currentPeer -> packetLossVariance / 4;
|
|
|
|
|
|
|
|
- if (packetLoss >= currentPeer -> packetLoss)
|
|
|
|
- {
|
|
|
|
- currentPeer -> packetLoss += (packetLoss - currentPeer -> packetLoss) / 8;
|
|
|
|
- currentPeer -> packetLossVariance += (packetLoss - currentPeer -> packetLoss) / 4;
|
|
|
|
- }
|
|
|
|
- else
|
|
|
|
- {
|
|
|
|
- currentPeer -> packetLoss -= (currentPeer -> packetLoss - packetLoss) / 8;
|
|
|
|
- currentPeer -> packetLossVariance += (currentPeer -> packetLoss - packetLoss) / 4;
|
|
|
|
- }
|
|
|
|
|
|
+ currentPeer -> packetLossVariance = (currentPeer -> packetLossVariance * 3 + ENET_DIFFERENCE (packetLoss, currentPeer -> packetLoss)) / 4;
|
|
|
|
+ currentPeer -> packetLoss = (currentPeer -> packetLoss * 7 + packetLoss) / 8;
|
|
|
|
|
|
currentPeer -> packetLossEpoch = host -> serviceTime;
|
|
currentPeer -> packetLossEpoch = host -> serviceTime;
|
|
currentPeer -> packetsSent = 0;
|
|
currentPeer -> packetsSent = 0;
|