You've already forked lidgren-network-gen3
mirror of
https://github.com/lidgren/lidgren-network-gen3.git
synced 2026-05-19 00:26:30 +09:00
Added some optimizations
This commit is contained in:
@@ -228,7 +228,7 @@ namespace Lidgren.Network
|
|||||||
SendConnectResponse(true);
|
SendConnectResponse(true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
m_peer.LogDebug("Unhandled handshake: " + tp + ", status is " + m_status + " length: " + payloadLength);
|
m_peer.LogDebug("Unhandled Connect: " + tp + ", status is " + m_status + " length: " + payloadLength);
|
||||||
break;
|
break;
|
||||||
case NetMessageType.ConnectResponse:
|
case NetMessageType.ConnectResponse:
|
||||||
switch (m_status)
|
switch (m_status)
|
||||||
@@ -303,7 +303,7 @@ namespace Lidgren.Network
|
|||||||
SetStatus(NetConnectionStatus.Disconnected, reason);
|
SetStatus(NetConnectionStatus.Disconnected, reason);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
m_peer.LogDebug("Unhandled handshake: " + tp + " length: " + payloadLength);
|
m_peer.LogDebug("Unhandled type during handshake: " + tp + " length: " + payloadLength);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -68,6 +68,15 @@ namespace Lidgren.Network
|
|||||||
m_peer.LogVerbose("Updated average roundtrip time to " + NetTime.ToReadable(m_averageRoundtripTime));
|
m_peer.LogVerbose("Updated average roundtrip time to " + NetTime.ToReadable(m_averageRoundtripTime));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// update resend delay for all channels
|
||||||
|
float resendDelay = GetResendDelay();
|
||||||
|
foreach (var chan in m_sendChannels)
|
||||||
|
{
|
||||||
|
var rchan = chan as NetReliableSenderChannel;
|
||||||
|
if (rchan != null)
|
||||||
|
rchan.m_resendDelay = resendDelay;
|
||||||
|
}
|
||||||
|
|
||||||
m_peer.LogVerbose("Timeout deadline pushed to " + m_timeoutDeadline);
|
m_peer.LogVerbose("Timeout deadline pushed to " + m_timeoutDeadline);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -115,12 +115,14 @@ namespace Lidgren.Network
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void Heartbeat(float now)
|
internal void Heartbeat(float now, uint frameCounter)
|
||||||
{
|
{
|
||||||
m_peer.VerifyNetworkThread();
|
m_peer.VerifyNetworkThread();
|
||||||
|
|
||||||
NetException.Assert(m_status != NetConnectionStatus.InitiatedConnect && m_status != NetConnectionStatus.RespondedConnect);
|
NetException.Assert(m_status != NetConnectionStatus.InitiatedConnect && m_status != NetConnectionStatus.RespondedConnect);
|
||||||
|
|
||||||
|
if ((frameCounter % 5) == 0)
|
||||||
|
{
|
||||||
if (now > m_timeoutDeadline)
|
if (now > m_timeoutDeadline)
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
@@ -136,6 +138,7 @@ namespace Lidgren.Network
|
|||||||
if (now > m_sentPingTime + m_peer.m_configuration.m_pingInterval)
|
if (now > m_sentPingTime + m_peer.m_configuration.m_pingInterval)
|
||||||
SendPing();
|
SendPing();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool connectionReset; // TODO: handle connection reset
|
bool connectionReset; // TODO: handle connection reset
|
||||||
|
|
||||||
@@ -146,6 +149,8 @@ namespace Lidgren.Network
|
|||||||
byte[] sendBuffer = m_peer.m_sendBuffer;
|
byte[] sendBuffer = m_peer.m_sendBuffer;
|
||||||
int mtu = m_peerConfiguration.m_maximumTransmissionUnit;
|
int mtu = m_peerConfiguration.m_maximumTransmissionUnit;
|
||||||
|
|
||||||
|
if ((frameCounter % 3) == 0) // coalesce a few frames
|
||||||
|
{
|
||||||
//
|
//
|
||||||
// send ack messages
|
// send ack messages
|
||||||
//
|
//
|
||||||
@@ -168,7 +173,7 @@ namespace Lidgren.Network
|
|||||||
sendBuffer[m_sendBufferWritePtr++] = (byte)(len >> 8);
|
sendBuffer[m_sendBufferWritePtr++] = (byte)(len >> 8);
|
||||||
|
|
||||||
// write acks
|
// write acks
|
||||||
for(int i=0;i<acks;i++)
|
for (int i = 0; i < acks; i++)
|
||||||
{
|
{
|
||||||
NetTuple<NetMessageType, int> tuple;
|
NetTuple<NetMessageType, int> tuple;
|
||||||
m_queuedAcks.TryDequeue(out tuple);
|
m_queuedAcks.TryDequeue(out tuple);
|
||||||
@@ -190,6 +195,7 @@ namespace Lidgren.Network
|
|||||||
m_sendBufferNumMessages = 0;
|
m_sendBufferNumMessages = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// send queued messages
|
// send queued messages
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ namespace Lidgren.Network
|
|||||||
internal NetIncomingMessage m_readHelperMessage;
|
internal NetIncomingMessage m_readHelperMessage;
|
||||||
private EndPoint m_senderRemote;
|
private EndPoint m_senderRemote;
|
||||||
private object m_initializeLock = new object();
|
private object m_initializeLock = new object();
|
||||||
|
private uint m_frameCounter;
|
||||||
|
|
||||||
internal readonly NetPeerConfiguration m_configuration;
|
internal readonly NetPeerConfiguration m_configuration;
|
||||||
private readonly NetQueue<NetIncomingMessage> m_releasedIncomingMessages;
|
private readonly NetQueue<NetIncomingMessage> m_releasedIncomingMessages;
|
||||||
@@ -195,12 +196,17 @@ namespace Lidgren.Network
|
|||||||
|
|
||||||
float now = (float)NetTime.Now;
|
float now = (float)NetTime.Now;
|
||||||
|
|
||||||
|
m_frameCounter++;
|
||||||
|
|
||||||
// do handshake heartbeats
|
// do handshake heartbeats
|
||||||
|
if ((m_frameCounter % 3) == 0)
|
||||||
|
{
|
||||||
foreach (NetConnection conn in m_handshakes.Values)
|
foreach (NetConnection conn in m_handshakes.Values)
|
||||||
{
|
{
|
||||||
conn.UnconnectedHeartbeat(now);
|
conn.UnconnectedHeartbeat(now);
|
||||||
if (conn.m_status == NetConnectionStatus.Connected || conn.m_status == NetConnectionStatus.Disconnected)
|
if (conn.m_status == NetConnectionStatus.Connected || conn.m_status == NetConnectionStatus.Disconnected)
|
||||||
break; // collection is modified
|
break; // collection has been modified
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
@@ -212,7 +218,7 @@ namespace Lidgren.Network
|
|||||||
{
|
{
|
||||||
foreach (NetConnection conn in m_connections)
|
foreach (NetConnection conn in m_connections)
|
||||||
{
|
{
|
||||||
conn.Heartbeat(now);
|
conn.Heartbeat(now, m_frameCounter);
|
||||||
if (conn.m_status == NetConnectionStatus.Disconnected)
|
if (conn.m_status == NetConnectionStatus.Disconnected)
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
@@ -246,7 +252,7 @@ namespace Lidgren.Network
|
|||||||
if (m_socket == null)
|
if (m_socket == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!m_socket.Poll(500, SelectMode.SelectRead)) // wait up to 1/2 ms for data to arrive
|
if (!m_socket.Poll(1000, SelectMode.SelectRead)) // wait up to 1 ms for data to arrive
|
||||||
return;
|
return;
|
||||||
|
|
||||||
//if (m_socket == null || m_socket.Available < 1)
|
//if (m_socket == null || m_socket.Available < 1)
|
||||||
@@ -359,7 +365,7 @@ namespace Lidgren.Network
|
|||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
LogError("Packet parsing error: " + ex.Message);
|
LogError("Packet parsing error: " + ex.Message + " from " + ipsender);
|
||||||
}
|
}
|
||||||
ptr += payloadByteLength;
|
ptr += payloadByteLength;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -70,7 +70,7 @@ namespace Lidgren.Network
|
|||||||
m_acceptIncomingConnections = false;
|
m_acceptIncomingConnections = false;
|
||||||
m_maximumConnections = 32;
|
m_maximumConnections = 32;
|
||||||
m_defaultOutgoingMessageCapacity = 16;
|
m_defaultOutgoingMessageCapacity = 16;
|
||||||
m_pingInterval = 3.0f;
|
m_pingInterval = 4.0f;
|
||||||
m_connectionTimeout = 25.0f;
|
m_connectionTimeout = 25.0f;
|
||||||
m_useMessageRecycling = true;
|
m_useMessageRecycling = true;
|
||||||
|
|
||||||
|
|||||||
@@ -16,6 +16,8 @@ namespace Lidgren.Network
|
|||||||
private NetBitVector m_receivedAcks;
|
private NetBitVector m_receivedAcks;
|
||||||
internal NetStoredReliableMessage[] m_storedMessages;
|
internal NetStoredReliableMessage[] m_storedMessages;
|
||||||
|
|
||||||
|
internal float m_resendDelay;
|
||||||
|
|
||||||
internal override int WindowSize { get { return m_windowSize; } }
|
internal override int WindowSize { get { return m_windowSize; } }
|
||||||
|
|
||||||
internal NetReliableSenderChannel(NetConnection connection, int windowSize)
|
internal NetReliableSenderChannel(NetConnection connection, int windowSize)
|
||||||
@@ -27,6 +29,7 @@ namespace Lidgren.Network
|
|||||||
m_receivedAcks = new NetBitVector(NetConstants.NumSequenceNumbers);
|
m_receivedAcks = new NetBitVector(NetConstants.NumSequenceNumbers);
|
||||||
m_storedMessages = new NetStoredReliableMessage[m_windowSize];
|
m_storedMessages = new NetStoredReliableMessage[m_windowSize];
|
||||||
m_queuedSends = new NetQueue<NetOutgoingMessage>(8);
|
m_queuedSends = new NetQueue<NetOutgoingMessage>(8);
|
||||||
|
m_resendDelay = m_connection.GetResendDelay();
|
||||||
}
|
}
|
||||||
|
|
||||||
internal override int GetAllowedSends()
|
internal override int GetAllowedSends()
|
||||||
@@ -60,8 +63,9 @@ namespace Lidgren.Network
|
|||||||
// call this regularely
|
// call this regularely
|
||||||
internal override void SendQueuedMessages(float now)
|
internal override void SendQueuedMessages(float now)
|
||||||
{
|
{
|
||||||
|
//
|
||||||
// resends
|
// resends
|
||||||
float resendDelay = m_connection.GetResendDelay();
|
//
|
||||||
for (int i = 0; i < m_storedMessages.Length; i++)
|
for (int i = 0; i < m_storedMessages.Length; i++)
|
||||||
{
|
{
|
||||||
NetOutgoingMessage om = m_storedMessages[i].Message;
|
NetOutgoingMessage om = m_storedMessages[i].Message;
|
||||||
@@ -69,7 +73,7 @@ namespace Lidgren.Network
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
float t = m_storedMessages[i].LastSent;
|
float t = m_storedMessages[i].LastSent;
|
||||||
if (t > 0 && (now - t) > resendDelay)
|
if (t > 0 && (now - t) > m_resendDelay)
|
||||||
{
|
{
|
||||||
// deduce sequence number
|
// deduce sequence number
|
||||||
int startSlot = m_windowStart % m_windowSize;
|
int startSlot = m_windowStart % m_windowSize;
|
||||||
|
|||||||
Reference in New Issue
Block a user