Skip to content

Commit 911f263

Browse files
authored
Merge pull request #1 from Yellow-Dog-Man/(feat)average-packet-size-tracking
Add additional networking statistics
2 parents fadd5e3 + 875280c commit 911f263

File tree

4 files changed

+86
-8
lines changed

4 files changed

+86
-8
lines changed

LiteNetLib/NetManager.Socket.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -608,7 +608,7 @@ internal int SendRaw(byte[] message, int start, int length, IPEndPoint remoteEnd
608608

609609
if (EnableStatistics)
610610
{
611-
Statistics.IncrementPacketsSent();
611+
Statistics.IncrementPacketsSent(1);
612612
Statistics.AddBytesSent(length);
613613
}
614614

LiteNetLib/NetPeer.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1268,7 +1268,7 @@ private void SendMerged()
12681268

12691269
if (NetManager.EnableStatistics)
12701270
{
1271-
Statistics.IncrementPacketsSent();
1271+
Statistics.IncrementPacketsSent(_mergeCount);
12721272
Statistics.AddBytesSent(bytesSent);
12731273
}
12741274

@@ -1288,7 +1288,7 @@ internal void SendUserData(NetPacket packet)
12881288

12891289
if (NetManager.EnableStatistics)
12901290
{
1291-
Statistics.IncrementPacketsSent();
1291+
Statistics.IncrementPacketsSent(1);
12921292
Statistics.AddBytesSent(bytesSent);
12931293
}
12941294

LiteNetLib/NetStatistics.cs

+77-4
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,34 @@
1-
using System.Threading;
1+
using System;
2+
using System.Collections.Concurrent;
3+
using System.Linq;
4+
using System.Threading;
25

36
namespace LiteNetLib
47
{
58
public sealed class NetStatistics
69
{
10+
public bool TrackAveragePacketSize;
11+
public int PacketSizeAverageWindow = 256;
12+
13+
public bool TrackAveragePacketMergeCount;
14+
public int PacketMergeAverageWindow = 256;
15+
716
private long _packetsSent;
817
private long _packetsReceived;
918
private long _bytesSent;
1019
private long _bytesReceived;
1120
private long _packetLoss;
21+
private long _windowWaits;
22+
23+
ConcurrentQueue<long> _packetSizes = new ConcurrentQueue<long>();
24+
ConcurrentQueue<int> _packetMerges = new ConcurrentQueue<int>();
1225

1326
public long PacketsSent => Interlocked.Read(ref _packetsSent);
1427
public long PacketsReceived => Interlocked.Read(ref _packetsReceived);
1528
public long BytesSent => Interlocked.Read(ref _bytesSent);
1629
public long BytesReceived => Interlocked.Read(ref _bytesReceived);
1730
public long PacketLoss => Interlocked.Read(ref _packetLoss);
31+
public long WindowWaitCount => Interlocked.Read(ref _windowWaits);
1832

1933
public long PacketLossPercent
2034
{
@@ -26,18 +40,68 @@ public long PacketLossPercent
2640
}
2741
}
2842

43+
public double ComputeAveragePacketSize()
44+
{
45+
if (!TrackAveragePacketSize)
46+
throw new InvalidOperationException("Tracking average packet size is not enabled");
47+
48+
return ComputeAverage(_packetSizes, size => (double)size);
49+
}
50+
51+
public double ComputeAveragePacketMerge()
52+
{
53+
if (!TrackAveragePacketMergeCount)
54+
throw new InvalidOperationException("Tracking average packet merge is not enabled");
55+
56+
return ComputeAverage(_packetMerges, count => (double)count);
57+
}
58+
59+
double ComputeAverage<T>(ConcurrentQueue<T> data, Func<T, double> selector)
60+
{
61+
int count = 0;
62+
double sum = 0;
63+
64+
foreach (var value in data)
65+
{
66+
count++;
67+
sum += selector(value);
68+
}
69+
70+
if (count == 0)
71+
return 0;
72+
73+
return sum / count;
74+
}
75+
76+
void Store<T>(ConcurrentQueue<T> data, T value, int max)
77+
{
78+
data.Enqueue(value);
79+
80+
while (data.Count > 0 && data.Count > max)
81+
data.TryDequeue(out _);
82+
}
83+
2984
public void Reset()
3085
{
3186
Interlocked.Exchange(ref _packetsSent, 0);
3287
Interlocked.Exchange(ref _packetsReceived, 0);
3388
Interlocked.Exchange(ref _bytesSent, 0);
3489
Interlocked.Exchange(ref _bytesReceived, 0);
3590
Interlocked.Exchange(ref _packetLoss, 0);
91+
Interlocked.Exchange(ref _windowWaits, 0);
92+
93+
#if NETSTANDARD2_1_OR_GREATER || NET5_0_OR_GREATER
94+
_packetSizes.Clear();
95+
_packetMerges.Clear();
96+
#endif
3697
}
3798

38-
public void IncrementPacketsSent()
99+
public void IncrementPacketsSent(int merged)
39100
{
40101
Interlocked.Increment(ref _packetsSent);
102+
103+
if (TrackAveragePacketMergeCount)
104+
Store(_packetMerges, merged, PacketMergeAverageWindow);
41105
}
42106

43107
public void IncrementPacketsReceived()
@@ -48,6 +112,9 @@ public void IncrementPacketsReceived()
48112
public void AddBytesSent(long bytesSent)
49113
{
50114
Interlocked.Add(ref _bytesSent, bytesSent);
115+
116+
if (TrackAveragePacketSize)
117+
Store(_packetSizes, bytesSent, PacketSizeAverageWindow);
51118
}
52119

53120
public void AddBytesReceived(long bytesReceived)
@@ -65,17 +132,23 @@ public void AddPacketLoss(long packetLoss)
65132
Interlocked.Add(ref _packetLoss, packetLoss);
66133
}
67134

135+
public void IncrementWindowWaits()
136+
{
137+
Interlocked.Increment(ref _windowWaits);
138+
}
139+
68140
public override string ToString()
69141
{
70142
return
71143
string.Format(
72-
"BytesReceived: {0}\nPacketsReceived: {1}\nBytesSent: {2}\nPacketsSent: {3}\nPacketLoss: {4}\nPacketLossPercent: {5}\n",
144+
"BytesReceived: {0}\nPacketsReceived: {1}\nBytesSent: {2}\nPacketsSent: {3}\nPacketLoss: {4}\nPacketLossPercent: {5}\nWindow Wait Count: {6}",
73145
BytesReceived,
74146
PacketsReceived,
75147
BytesSent,
76148
PacketsSent,
77149
PacketLoss,
78-
PacketLossPercent);
150+
PacketLossPercent,
151+
WindowWaitCount);
79152
}
80153
}
81154
}

LiteNetLib/ReliableChannel.cs

+6-1
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,12 @@ protected override bool SendNextPackets()
187187
{
188188
int relate = NetUtils.RelativeSequenceNumber(_localSeqence, _localWindowStart);
189189
if (relate >= _windowSize)
190+
{
191+
if (Peer.NetManager.EnableStatistics)
192+
Peer.Statistics.IncrementWindowWaits();
193+
190194
break;
195+
}
191196

192197
var netPacket = OutgoingQueue.Dequeue();
193198
netPacket.Sequence = (ushort) _localSeqence;
@@ -294,7 +299,7 @@ public override bool ProcessPacket(NetPacket packet)
294299
//detailed check
295300
if (seq == _remoteSequence)
296301
{
297-
NetDebug.Write("[RR]ReliableInOrder packet succes");
302+
NetDebug.Write("[RR]ReliableInOrder packet success");
298303
Peer.AddReliablePacket(_deliveryMethod, packet);
299304
_remoteSequence = (_remoteSequence + 1) % NetConstants.MaxSequence;
300305

0 commit comments

Comments
 (0)