1
0
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:
lidgren
2010-11-03 10:38:13 +00:00
parent 9b24fa7f38
commit 6a30a00172
6 changed files with 87 additions and 62 deletions

View File

@@ -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;
} }
} }

View File

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

View File

@@ -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
// //
@@ -190,6 +195,7 @@ namespace Lidgren.Network
m_sendBufferNumMessages = 0; m_sendBufferNumMessages = 0;
} }
} }
}
// //
// send queued messages // send queued messages

View File

@@ -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;
} }

View File

@@ -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;

View File

@@ -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;