From 4ce5d4ca10849704721ae799952cb3eeb25487ed Mon Sep 17 00:00:00 2001 From: Frooxius Date: Fri, 12 Apr 2024 23:17:13 +0200 Subject: [PATCH 1/4] feat: Add support for tracking average size of recently sent packets --- LiteNetLib/NetStatistics.cs | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/LiteNetLib/NetStatistics.cs b/LiteNetLib/NetStatistics.cs index 032e2754..b3ba7025 100644 --- a/LiteNetLib/NetStatistics.cs +++ b/LiteNetLib/NetStatistics.cs @@ -1,15 +1,22 @@ -using System.Threading; +using System; +using System.Collections.Concurrent; +using System.Threading; namespace LiteNetLib { public sealed class NetStatistics { + public bool TrackAveragePacketSize; + public int PacketSizeAverageWindow = 256; + private long _packetsSent; private long _packetsReceived; private long _bytesSent; private long _bytesReceived; private long _packetLoss; + ConcurrentQueue _packetSizes = new ConcurrentQueue(); + public long PacketsSent => Interlocked.Read(ref _packetsSent); public long PacketsReceived => Interlocked.Read(ref _packetsReceived); public long BytesSent => Interlocked.Read(ref _bytesSent); @@ -26,6 +33,26 @@ public long PacketLossPercent } } + public double ComputeAveragePacketSize() + { + if (!TrackAveragePacketSize) + throw new InvalidOperationException("Tracking average packet size is not enabled"); + + int count = 0; + long sum = 0; + + foreach(var size in _packetSizes) + { + count++; + sum += size; + } + + if (count == 0) + return 0; + + return sum / (double)count; + } + public void Reset() { Interlocked.Exchange(ref _packetsSent, 0); @@ -48,6 +75,14 @@ public void IncrementPacketsReceived() public void AddBytesSent(long bytesSent) { Interlocked.Add(ref _bytesSent, bytesSent); + + if (TrackAveragePacketSize) + { + _packetSizes.Enqueue(bytesSent); + + while (_packetSizes.Count > 0 && _packetSizes.Count > PacketSizeAverageWindow) + _packetSizes.TryDequeue(out _); + } } public void AddBytesReceived(long bytesReceived) From 4627a2dc2a4a548861e211faab95ec43e062065b Mon Sep 17 00:00:00 2001 From: Frooxius Date: Fri, 12 Apr 2024 23:32:38 +0200 Subject: [PATCH 2/4] feat: Add support for tracking average merge count --- LiteNetLib/NetManager.Socket.cs | 2 +- LiteNetLib/NetPeer.cs | 4 +-- LiteNetLib/NetStatistics.cs | 51 ++++++++++++++++++++++++++------- 3 files changed, 43 insertions(+), 14 deletions(-) diff --git a/LiteNetLib/NetManager.Socket.cs b/LiteNetLib/NetManager.Socket.cs index 67b07f33..61f5024d 100644 --- a/LiteNetLib/NetManager.Socket.cs +++ b/LiteNetLib/NetManager.Socket.cs @@ -608,7 +608,7 @@ internal int SendRaw(byte[] message, int start, int length, IPEndPoint remoteEnd if (EnableStatistics) { - Statistics.IncrementPacketsSent(); + Statistics.IncrementPacketsSent(1); Statistics.AddBytesSent(length); } diff --git a/LiteNetLib/NetPeer.cs b/LiteNetLib/NetPeer.cs index 1852e69c..5cd95639 100644 --- a/LiteNetLib/NetPeer.cs +++ b/LiteNetLib/NetPeer.cs @@ -1268,7 +1268,7 @@ private void SendMerged() if (NetManager.EnableStatistics) { - Statistics.IncrementPacketsSent(); + Statistics.IncrementPacketsSent(_mergeCount); Statistics.AddBytesSent(bytesSent); } @@ -1288,7 +1288,7 @@ internal void SendUserData(NetPacket packet) if (NetManager.EnableStatistics) { - Statistics.IncrementPacketsSent(); + Statistics.IncrementPacketsSent(1); Statistics.AddBytesSent(bytesSent); } diff --git a/LiteNetLib/NetStatistics.cs b/LiteNetLib/NetStatistics.cs index b3ba7025..20e26664 100644 --- a/LiteNetLib/NetStatistics.cs +++ b/LiteNetLib/NetStatistics.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Concurrent; +using System.Linq; using System.Threading; namespace LiteNetLib @@ -9,6 +10,9 @@ public sealed class NetStatistics public bool TrackAveragePacketSize; public int PacketSizeAverageWindow = 256; + public bool TrackAveragePacketMergeCount; + public int PacketMergeAverageWindow = 256; + private long _packetsSent; private long _packetsReceived; private long _bytesSent; @@ -16,6 +20,7 @@ public sealed class NetStatistics private long _packetLoss; ConcurrentQueue _packetSizes = new ConcurrentQueue(); + ConcurrentQueue _packetMerges = new ConcurrentQueue(); public long PacketsSent => Interlocked.Read(ref _packetsSent); public long PacketsReceived => Interlocked.Read(ref _packetsReceived); @@ -38,19 +43,40 @@ public double ComputeAveragePacketSize() if (!TrackAveragePacketSize) throw new InvalidOperationException("Tracking average packet size is not enabled"); + return ComputeAverage(_packetSizes, size => (double)size); + } + + public double ComputeAveragePacketMerge() + { + if (!TrackAveragePacketMergeCount) + throw new InvalidOperationException("Tracking average packet merge is not enabled"); + + return ComputeAverage(_packetMerges, count => (double)count); + } + + double ComputeAverage(ConcurrentQueue data, Func selector) + { int count = 0; - long sum = 0; + double sum = 0; - foreach(var size in _packetSizes) + foreach (var value in data) { count++; - sum += size; + sum += selector(value); } if (count == 0) return 0; - return sum / (double)count; + return sum / count; + } + + void Store(ConcurrentQueue data, T value, int max) + { + data.Enqueue(value); + + while (data.Count > 0 && data.Count > max) + data.TryDequeue(out _); } public void Reset() @@ -60,11 +86,19 @@ public void Reset() Interlocked.Exchange(ref _bytesSent, 0); Interlocked.Exchange(ref _bytesReceived, 0); Interlocked.Exchange(ref _packetLoss, 0); + +#if NETSTANDARD2_1_OR_GREATER || NET5_0_OR_GREATER + _packetSizes.Clear(); + _packetMerges.Clear(); +#endif } - public void IncrementPacketsSent() + public void IncrementPacketsSent(int merged) { Interlocked.Increment(ref _packetsSent); + + if (TrackAveragePacketMergeCount) + Store(_packetMerges, merged, PacketMergeAverageWindow); } public void IncrementPacketsReceived() @@ -77,12 +111,7 @@ public void AddBytesSent(long bytesSent) Interlocked.Add(ref _bytesSent, bytesSent); if (TrackAveragePacketSize) - { - _packetSizes.Enqueue(bytesSent); - - while (_packetSizes.Count > 0 && _packetSizes.Count > PacketSizeAverageWindow) - _packetSizes.TryDequeue(out _); - } + Store(_packetSizes, bytesSent, PacketSizeAverageWindow); } public void AddBytesReceived(long bytesReceived) From 50dd9b4d0defb785742adbd08e540ee9afe91efa Mon Sep 17 00:00:00 2001 From: Frooxius Date: Fri, 12 Apr 2024 23:38:15 +0200 Subject: [PATCH 3/4] fix: Fix typo --- LiteNetLib/ReliableChannel.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LiteNetLib/ReliableChannel.cs b/LiteNetLib/ReliableChannel.cs index 4a10d170..395f687b 100644 --- a/LiteNetLib/ReliableChannel.cs +++ b/LiteNetLib/ReliableChannel.cs @@ -294,7 +294,7 @@ public override bool ProcessPacket(NetPacket packet) //detailed check if (seq == _remoteSequence) { - NetDebug.Write("[RR]ReliableInOrder packet succes"); + NetDebug.Write("[RR]ReliableInOrder packet success"); Peer.AddReliablePacket(_deliveryMethod, packet); _remoteSequence = (_remoteSequence + 1) % NetConstants.MaxSequence; From 875280ca542a51567a1eb385caafef765784bcaa Mon Sep 17 00:00:00 2001 From: Frooxius Date: Fri, 12 Apr 2024 23:47:33 +0200 Subject: [PATCH 4/4] feat: Add statistic for number of times that the outgoing packets had to wait on the window to be free --- LiteNetLib/NetStatistics.cs | 13 +++++++++++-- LiteNetLib/ReliableChannel.cs | 5 +++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/LiteNetLib/NetStatistics.cs b/LiteNetLib/NetStatistics.cs index 20e26664..17402205 100644 --- a/LiteNetLib/NetStatistics.cs +++ b/LiteNetLib/NetStatistics.cs @@ -18,6 +18,7 @@ public sealed class NetStatistics private long _bytesSent; private long _bytesReceived; private long _packetLoss; + private long _windowWaits; ConcurrentQueue _packetSizes = new ConcurrentQueue(); ConcurrentQueue _packetMerges = new ConcurrentQueue(); @@ -27,6 +28,7 @@ public sealed class NetStatistics public long BytesSent => Interlocked.Read(ref _bytesSent); public long BytesReceived => Interlocked.Read(ref _bytesReceived); public long PacketLoss => Interlocked.Read(ref _packetLoss); + public long WindowWaitCount => Interlocked.Read(ref _windowWaits); public long PacketLossPercent { @@ -86,6 +88,7 @@ public void Reset() Interlocked.Exchange(ref _bytesSent, 0); Interlocked.Exchange(ref _bytesReceived, 0); Interlocked.Exchange(ref _packetLoss, 0); + Interlocked.Exchange(ref _windowWaits, 0); #if NETSTANDARD2_1_OR_GREATER || NET5_0_OR_GREATER _packetSizes.Clear(); @@ -129,17 +132,23 @@ public void AddPacketLoss(long packetLoss) Interlocked.Add(ref _packetLoss, packetLoss); } + public void IncrementWindowWaits() + { + Interlocked.Increment(ref _windowWaits); + } + public override string ToString() { return string.Format( - "BytesReceived: {0}\nPacketsReceived: {1}\nBytesSent: {2}\nPacketsSent: {3}\nPacketLoss: {4}\nPacketLossPercent: {5}\n", + "BytesReceived: {0}\nPacketsReceived: {1}\nBytesSent: {2}\nPacketsSent: {3}\nPacketLoss: {4}\nPacketLossPercent: {5}\nWindow Wait Count: {6}", BytesReceived, PacketsReceived, BytesSent, PacketsSent, PacketLoss, - PacketLossPercent); + PacketLossPercent, + WindowWaitCount); } } } diff --git a/LiteNetLib/ReliableChannel.cs b/LiteNetLib/ReliableChannel.cs index 395f687b..fabc0fd2 100644 --- a/LiteNetLib/ReliableChannel.cs +++ b/LiteNetLib/ReliableChannel.cs @@ -187,7 +187,12 @@ protected override bool SendNextPackets() { int relate = NetUtils.RelativeSequenceNumber(_localSeqence, _localWindowStart); if (relate >= _windowSize) + { + if (Peer.NetManager.EnableStatistics) + Peer.Statistics.IncrementWindowWaits(); + break; + } var netPacket = OutgoingQueue.Dequeue(); netPacket.Sequence = (ushort) _localSeqence;