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); + } } }