You've already forked lidgren-network-gen3
mirror of
https://github.com/lidgren/lidgren-network-gen3.git
synced 2026-05-18 16:16:35 +09:00
Added configuration setting to suppress acks for unreliable unordered messages
This commit is contained in:
@@ -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));
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user