1
0
mirror of https://github.com/lidgren/lidgren-network-gen3.git synced 2026-05-18 08:06:33 +09:00

Added configuration setting to suppress acks for unreliable unordered messages

This commit is contained in:
Michael Lidgren
2015-04-13 13:25:30 +02:00
parent 86a695cf2b
commit 2d060cced8
4 changed files with 30 additions and 4 deletions

View File

@@ -377,7 +377,7 @@ namespace Lidgren.Network
{ {
case NetDeliveryMethod.Unreliable: case NetDeliveryMethod.Unreliable:
case NetDeliveryMethod.UnreliableSequenced: case NetDeliveryMethod.UnreliableSequenced:
chan = new NetUnreliableSenderChannel(this, NetUtility.GetWindowSize(method)); chan = new NetUnreliableSenderChannel(this, NetUtility.GetWindowSize(method), method);
break; break;
case NetDeliveryMethod.ReliableOrdered: case NetDeliveryMethod.ReliableOrdered:
chan = new NetReliableSenderChannel(this, NetUtility.GetWindowSize(method)); chan = new NetReliableSenderChannel(this, NetUtility.GetWindowSize(method));

View File

@@ -58,6 +58,7 @@ namespace Lidgren.Network
internal bool m_enableUPnP; internal bool m_enableUPnP;
internal bool m_autoFlushSendQueue; internal bool m_autoFlushSendQueue;
private NetUnreliableSizeBehaviour m_unreliableSizeBehaviour; private NetUnreliableSizeBehaviour m_unreliableSizeBehaviour;
internal bool m_suppressUnreliableUnorderedAcks;
internal NetIncomingMessageType m_disabledTypes; internal NetIncomingMessageType m_disabledTypes;
internal int m_port; internal int m_port;
@@ -112,6 +113,7 @@ namespace Lidgren.Network
m_resendHandshakeInterval = 3.0f; m_resendHandshakeInterval = 3.0f;
m_maximumHandshakeAttempts = 5; m_maximumHandshakeAttempts = 5;
m_autoFlushSendQueue = true; m_autoFlushSendQueue = true;
m_suppressUnreliableUnorderedAcks = true;
m_maximumTransmissionUnit = kDefaultMTU; m_maximumTransmissionUnit = kDefaultMTU;
m_autoExpandMTU = false; m_autoExpandMTU = false;
@@ -311,6 +313,20 @@ namespace Lidgren.Network
set { m_autoFlushSendQueue = value; } set { m_autoFlushSendQueue = value; }
} }
/// <summary>
/// If true, will not send acks for unreliable unordered messages. This will save bandwidth, but disable flow control and duplicate detection for this type of messages.
/// </summary>
public bool SuppressUnreliableUnorderedAcks
{
get { return m_suppressUnreliableUnorderedAcks; }
set
{
if (m_isLocked)
throw new NetException(c_isLockedMessage);
m_suppressUnreliableUnorderedAcks = value;
}
}
/// <summary> /// <summary>
/// Gets or sets the local ip address to bind to. Defaults to IPAddress.Any. Cannot be changed once NetPeer is initialized. /// Gets or sets the local ip address to bind to. Defaults to IPAddress.Any. Cannot be changed once NetPeer is initialized.
/// </summary> /// </summary>

View File

@@ -12,12 +12,13 @@ namespace Lidgren.Network
private int m_windowStart; private int m_windowStart;
private int m_windowSize; private int m_windowSize;
private int m_sendStart; private int m_sendStart;
private bool m_doFlowControl;
private NetBitVector m_receivedAcks; private NetBitVector m_receivedAcks;
internal override int WindowSize { get { return m_windowSize; } } internal override int WindowSize { get { return m_windowSize; } }
internal NetUnreliableSenderChannel(NetConnection connection, int windowSize) internal NetUnreliableSenderChannel(NetConnection connection, int windowSize, NetDeliveryMethod method)
{ {
m_connection = connection; m_connection = connection;
m_windowSize = windowSize; m_windowSize = windowSize;
@@ -25,10 +26,16 @@ namespace Lidgren.Network
m_sendStart = 0; m_sendStart = 0;
m_receivedAcks = new NetBitVector(NetConstants.NumSequenceNumbers); m_receivedAcks = new NetBitVector(NetConstants.NumSequenceNumbers);
m_queuedSends = new NetQueue<NetOutgoingMessage>(8); m_queuedSends = new NetQueue<NetOutgoingMessage>(8);
m_doFlowControl = true;
if (method == NetDeliveryMethod.Unreliable && connection.Peer.Configuration.SuppressUnreliableUnorderedAcks == true)
m_doFlowControl = false;
} }
internal override int GetAllowedSends() internal override int GetAllowedSends()
{ {
if (!m_doFlowControl)
return 2; // always allowed to send without flow control!
int retval = m_windowSize - ((m_sendStart + NetConstants.NumSequenceNumbers) - m_windowStart) % m_windowSize; int retval = m_windowSize - ((m_sendStart + NetConstants.NumSequenceNumbers) - m_windowStart) % m_windowSize;
NetException.Assert(retval >= 0 && retval <= m_windowSize); NetException.Assert(retval >= 0 && retval <= m_windowSize);
return retval; return retval;

View File

@@ -4,15 +4,18 @@ namespace Lidgren.Network
{ {
internal sealed class NetUnreliableUnorderedReceiver : NetReceiverChannelBase internal sealed class NetUnreliableUnorderedReceiver : NetReceiverChannelBase
{ {
private bool m_doFlowControl;
public NetUnreliableUnorderedReceiver(NetConnection connection) public NetUnreliableUnorderedReceiver(NetConnection connection)
: base(connection) : base(connection)
{ {
m_doFlowControl = connection.Peer.Configuration.SuppressUnreliableUnorderedAcks == false;
} }
internal override void ReceiveMessage(NetIncomingMessage msg) internal override void ReceiveMessage(NetIncomingMessage msg)
{ {
// ack no matter what if (m_doFlowControl)
m_connection.QueueAck(msg.m_receivedMessageType, msg.m_sequenceNumber); m_connection.QueueAck(msg.m_receivedMessageType, msg.m_sequenceNumber);
m_peer.ReleaseMessage(msg); m_peer.ReleaseMessage(msg);
} }