diff --git a/Lidgren.Network/NetConnection.Latency.cs b/Lidgren.Network/NetConnection.Latency.cs
index 61afc68..c1f85ba 100644
--- a/Lidgren.Network/NetConnection.Latency.cs
+++ b/Lidgren.Network/NetConnection.Latency.cs
@@ -88,7 +88,7 @@ namespace Lidgren.Network
if (m_averageRoundtripTime < 0)
{
m_remoteTimeOffset = diff;
- m_averageRoundtripTime = rtt; // initial estimate
+ m_averageRoundtripTime = rtt * 1.15f; // initially over-estimate
m_peer.LogDebug("Initiated average roundtrip time to " + NetTime.ToReadable(m_averageRoundtripTime) + " Server time is: " + (now + diff));
}
else
diff --git a/Lidgren.Network/NetConnection.MTU.cs b/Lidgren.Network/NetConnection.MTU.cs
index 28ff6c4..f4b0ddb 100644
--- a/Lidgren.Network/NetConnection.MTU.cs
+++ b/Lidgren.Network/NetConnection.MTU.cs
@@ -127,7 +127,6 @@ namespace Lidgren.Network
m_lastSentMTUAttemptSize = size;
m_lastSentMTUAttemptTime = now;
- //m_peer.LogDebug("Requesting MTU expand " + size + " bytes");
m_statistics.PacketSent(len, 1);
}
@@ -137,7 +136,8 @@ namespace Lidgren.Network
return;
m_expandMTUStatus = ExpandMTUStatus.Finished;
m_currentMTU = size;
- m_peer.LogVerbose("Maximum Transmission Unit set to: " + m_currentMTU + " bytes");
+ if (m_currentMTU != m_peerConfiguration.m_maximumTransmissionUnit)
+ m_peer.LogDebug("Expanded Maximum Transmission Unit to: " + m_currentMTU + " bytes");
return;
}
diff --git a/Lidgren.Network/NetConnection.cs b/Lidgren.Network/NetConnection.cs
index d5916b1..89c8642 100644
--- a/Lidgren.Network/NetConnection.cs
+++ b/Lidgren.Network/NetConnection.cs
@@ -66,7 +66,7 @@ namespace Lidgren.Network
float avgRtt = m_averageRoundtripTime;
if (avgRtt <= 0)
avgRtt = 0.1f; // "default" resend is based on 100 ms roundtrip time
- return 0.01f + (avgRtt * 2); // 10 ms + double rtt
+ return 0.02f + (avgRtt * 2.0f); // 20 ms + double rtt
}
internal NetConnection(NetPeer peer, IPEndPoint remoteEndpoint)
diff --git a/Lidgren.Network/NetConnectionStatistics.cs b/Lidgren.Network/NetConnectionStatistics.cs
index f4ad610..3b51247 100644
--- a/Lidgren.Network/NetConnectionStatistics.cs
+++ b/Lidgren.Network/NetConnectionStatistics.cs
@@ -23,6 +23,12 @@ using System.Diagnostics;
namespace Lidgren.Network
{
+ internal enum MessageResendReason
+ {
+ Delay,
+ HoleInSequence
+ }
+
///
/// Statistics for a NetConnection instance
///
@@ -39,7 +45,8 @@ namespace Lidgren.Network
internal int m_sentBytes;
internal int m_receivedBytes;
- internal int m_resentMessages;
+ internal int m_resentMessagesDueToDelay;
+ internal int m_resentMessagesDueToHole;
internal NetConnectionStatistics(NetConnection conn)
{
@@ -78,7 +85,7 @@ namespace Lidgren.Network
///
/// Gets the number of resent reliable messages for this connection
///
- public int ResentMessages { get { return m_resentMessages; } }
+ public int ResentMessages { get { return m_resentMessagesDueToHole + m_resentMessagesDueToDelay; } }
// public double LastSendRespondedTo { get { return m_connection.m_lastSendRespondedTo; } }
@@ -101,9 +108,12 @@ namespace Lidgren.Network
}
[Conditional("DEBUG")]
- internal void MessageResent()
+ internal void MessageResent(MessageResendReason reason)
{
- m_resentMessages++;
+ if (reason == MessageResendReason.Delay)
+ m_resentMessagesDueToDelay++;
+ else
+ m_resentMessagesDueToHole++;
}
///
@@ -116,8 +126,10 @@ namespace Lidgren.Network
bdr.AppendLine("Sent " + m_sentBytes + " bytes in " + m_sentMessages + " messages in " + m_sentPackets + " packets");
bdr.AppendLine("Received " + m_receivedBytes + " bytes in " + m_receivedMessages + " messages in " + m_receivedPackets + " packets");
- if (m_resentMessages > 0)
- bdr.AppendLine("Resent messages: " + m_resentMessages);
+ if (m_resentMessagesDueToDelay > 0)
+ bdr.AppendLine("Resent messages (delay): " + m_resentMessagesDueToDelay);
+ if (m_resentMessagesDueToDelay > 0)
+ bdr.AppendLine("Resent messages (holes): " + m_resentMessagesDueToHole);
int numUnsent = 0;
int numStored = 0;
diff --git a/Lidgren.Network/NetPeer.Send.cs b/Lidgren.Network/NetPeer.Send.cs
index a55825e..4033fa5 100644
--- a/Lidgren.Network/NetPeer.Send.cs
+++ b/Lidgren.Network/NetPeer.Send.cs
@@ -95,7 +95,10 @@ namespace Lidgren.Network
}
NetSendResult res = conn.EnqueueMessage(msg, method, sequenceChannel);
if (res == NetSendResult.Dropped)
+ {
+ LogDebug(msg + " dropped immediately due to full queues");
Interlocked.Decrement(ref msg.m_recyclingCount);
+ }
}
}
else
diff --git a/Lidgren.Network/NetPeerConfiguration.cs b/Lidgren.Network/NetPeerConfiguration.cs
index f6748b3..df07cfb 100644
--- a/Lidgren.Network/NetPeerConfiguration.cs
+++ b/Lidgren.Network/NetPeerConfiguration.cs
@@ -89,7 +89,7 @@ namespace Lidgren.Network
// Total 1408 bytes
// Note that lidgren headers (5 bytes) are not included here; since it's part of the "mtu payload"
m_maximumTransmissionUnit = 1408;
- m_autoExpandMTU = true;
+ m_autoExpandMTU = false;
m_expandMTUFrequency = 2.0f;
m_expandMTUFailAttempts = 5;
diff --git a/Lidgren.Network/NetReliableSenderChannel.cs b/Lidgren.Network/NetReliableSenderChannel.cs
index 112f5f6..3fbd58b 100644
--- a/Lidgren.Network/NetReliableSenderChannel.cs
+++ b/Lidgren.Network/NetReliableSenderChannel.cs
@@ -86,8 +86,8 @@ namespace Lidgren.Network
seqNr--;
}
- m_connection.m_peer.LogVerbose("Resending due to delay #" + seqNr + " " + om.ToString());
- m_connection.m_statistics.MessageResent();
+ //m_connection.m_peer.LogVerbose("Resending due to delay #" + seqNr + " " + om.ToString());
+ m_connection.m_statistics.MessageResent(MessageResendReason.Delay);
m_connection.QueueSendMessage(om, seqNr);
@@ -165,7 +165,7 @@ namespace Lidgren.Network
m_windowStart = (m_windowStart + 1) % NetConstants.NumSequenceNumbers;
// advance window if we already have early acks
- while (m_receivedAcks[m_windowStart])
+ while (m_receivedAcks.Get(m_windowStart))
{
//m_connection.m_peer.LogDebug("Using early ack for #" + m_windowStart + "...");
m_receivedAcks[m_windowStart] = false;
@@ -226,11 +226,19 @@ namespace Lidgren.Network
{
// just sent once; resend immediately since we found gap in ack sequence
NetOutgoingMessage rmsg = m_storedMessages[slot].Message;
- m_connection.m_peer.LogVerbose("Resending #" + rnr + " (" + rmsg + ")");
- m_storedMessages[slot].LastSent = now;
- m_storedMessages[slot].NumSent++;
- m_connection.m_statistics.MessageResent();
- m_connection.QueueSendMessage(rmsg, rnr);
+ //m_connection.m_peer.LogVerbose("Resending #" + rnr + " (" + rmsg + ")");
+
+ if (now - m_storedMessages[slot].LastSent < (m_resendDelay * 0.35f))
+ {
+ // already resent recently
+ }
+ else
+ {
+ m_storedMessages[slot].LastSent = now;
+ m_storedMessages[slot].NumSent++;
+ m_connection.m_statistics.MessageResent(MessageResendReason.HoleInSequence);
+ m_connection.QueueSendMessage(rmsg, rnr);
+ }
}
}