From 2f0477e6bfb393cdf7dbd11fc068acc4c5ab4adf Mon Sep 17 00:00:00 2001 From: Michael Lidgren Date: Fri, 25 Sep 2015 10:20:12 +0200 Subject: [PATCH] Now sets NeedFlushSendQueue whenever a stored message exists in any channel --- Lidgren.Network/NetConnection.cs | 2 +- Lidgren.Network/NetReliableSenderChannel.cs | 13 +++++++++++++ Lidgren.Network/NetSenderChannelBase.cs | 2 ++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/Lidgren.Network/NetConnection.cs b/Lidgren.Network/NetConnection.cs index d9863ac..b09d41e 100644 --- a/Lidgren.Network/NetConnection.cs +++ b/Lidgren.Network/NetConnection.cs @@ -268,7 +268,7 @@ namespace Lidgren.Network if (channel != null) { channel.SendQueuedMessages(now); - if (channel.QueuedSendsCount > 0) + if (channel.NeedToSendMessages()) m_peer.m_needFlushSendQueue = true; // failed to send all queued sends; likely a full window - need to try again } NetException.Assert(m_sendBufferWritePtr < 1 || m_sendBufferNumMessages > 0); diff --git a/Lidgren.Network/NetReliableSenderChannel.cs b/Lidgren.Network/NetReliableSenderChannel.cs index 8ea1ad7..07677b4 100644 --- a/Lidgren.Network/NetReliableSenderChannel.cs +++ b/Lidgren.Network/NetReliableSenderChannel.cs @@ -13,6 +13,8 @@ namespace Lidgren.Network private int m_windowSize; private int m_sendStart; + private bool m_anyStoredResends; + private NetBitVector m_receivedAcks; internal NetStoredReliableMessage[] m_storedMessages; @@ -20,12 +22,18 @@ namespace Lidgren.Network internal override int WindowSize { get { return m_windowSize; } } + internal override bool NeedToSendMessages() + { + return base.NeedToSendMessages() || m_anyStoredResends; + } + internal NetReliableSenderChannel(NetConnection connection, int windowSize) { m_connection = connection; m_windowSize = windowSize; m_windowStart = 0; m_sendStart = 0; + m_anyStoredResends = false; m_receivedAcks = new NetBitVector(NetConstants.NumSequenceNumbers); m_storedMessages = new NetStoredReliableMessage[m_windowSize]; m_queuedSends = new NetQueue(8); @@ -44,6 +52,7 @@ namespace Lidgren.Network m_receivedAcks.Clear(); for (int i = 0; i < m_storedMessages.Length; i++) m_storedMessages[i].Reset(); + m_anyStoredResends = false; m_queuedSends.Clear(); m_windowStart = 0; m_sendStart = 0; @@ -64,6 +73,7 @@ namespace Lidgren.Network // // resends // + m_anyStoredResends = false; for (int i = 0; i < m_storedMessages.Length; i++) { var storedMsg = m_storedMessages[i]; @@ -71,6 +81,8 @@ namespace Lidgren.Network if (om == null) continue; + m_anyStoredResends = true; + double t = storedMsg.LastSent; if (t > 0 && (now - t) > m_resendDelay) { @@ -131,6 +143,7 @@ namespace Lidgren.Network m_storedMessages[storeIndex].Message = message; m_storedMessages[storeIndex].LastSent = now; m_storedMessages[storeIndex].SequenceNumber = seqNr; + m_anyStoredResends = true; return; } diff --git a/Lidgren.Network/NetSenderChannelBase.cs b/Lidgren.Network/NetSenderChannelBase.cs index 6bace1f..8bbc7b8 100644 --- a/Lidgren.Network/NetSenderChannelBase.cs +++ b/Lidgren.Network/NetSenderChannelBase.cs @@ -13,6 +13,8 @@ namespace Lidgren.Network internal int QueuedSendsCount { get { return m_queuedSends.Count; } } + internal virtual bool NeedToSendMessages() { return m_queuedSends.Count > 0; } + public int GetFreeWindowSlots() { return GetAllowedSends() - m_queuedSends.Count;