Skip to content

Commit f1e94e5

Browse files
Adding in Performance Tick Data that can be propagated out for external consumption
1 parent 6b1de43 commit f1e94e5

15 files changed

+184
-0
lines changed

com.unity.multiplayer.mlapi/Runtime/Core/NetworkedBehaviour.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -800,6 +800,7 @@ internal static void HandleNetworkedVarDeltas(List<INetworkedVar> networkedVarLi
800800
long readStartPos = stream.Position;
801801

802802
networkedVarList[i].ReadDelta(stream, IsServer);
803+
PerformanceDataManager.Increment(ProfilerConstants.NumberNetworkVarsReceived);
803804
ProfilerStatManager.networkVarsRcvd.Record();
804805

805806
if (NetworkingManager.Singleton.NetworkConfig.EnsureNetworkedVarLengthSafety)
@@ -867,6 +868,7 @@ internal static void HandleNetworkedVarUpdate(List<INetworkedVar> networkedVarLi
867868
long readStartPos = stream.Position;
868869

869870
networkedVarList[i].ReadField(stream);
871+
PerformanceDataManager.Increment(ProfilerConstants.NumberNetworkVarsReceived);
870872
ProfilerStatManager.networkVarsRcvd.Record();
871873

872874
if (NetworkingManager.Singleton.NetworkConfig.EnsureNetworkedVarLengthSafety)

com.unity.multiplayer.mlapi/Runtime/Core/NetworkingManager.cs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,10 @@ public class NetworkingManager : UpdateLoopBehaviour
7272
#endif
7373
public RpcQueueContainer rpcQueueContainer { get; private set; }
7474

75+
public delegate void PerformanceDataEventHandler(PerformanceTickData profilerData);
76+
77+
public event PerformanceDataEventHandler OnPerformanceDataEvent;
78+
7579
/// <summary>
7680
/// A synchronized time, represents the time in seconds since the server application started. Is replicated across all clients
7781
/// </summary>
@@ -735,11 +739,14 @@ private void Awake()
735739
/// </summary>
736740
private void NetworkPreUpdate()
737741
{
742+
PerformanceDataManager.BeginNewTick();
743+
738744
if (IsListening)
739745
{
740746
// Process received data
741747
if ((NetworkTime - m_LastReceiveTickTime >= (1f / NetworkConfig.ReceiveTickrate)) || NetworkConfig.ReceiveTickrate <= 0)
742748
{
749+
PerformanceDataManager.Increment(ProfilerConstants.ReceiveTickRate);
743750
ProfilerStatManager.rcvTickRate.Record();
744751
#if DEVELOPMENT_BUILD || UNITY_EDITOR
745752
s_ReceiveTick.Begin();
@@ -853,6 +860,15 @@ private void NetworkUpdate()
853860
currentNetworkTimeOffset += Mathf.Clamp(networkTimeOffset - currentNetworkTimeOffset, -maxDelta, maxDelta);
854861
}
855862
}
863+
864+
var profileTransport = NetworkConfig.NetworkTransport as ITransportProfilerData;
865+
if (profileTransport != null)
866+
{
867+
var transportProfilerData = profileTransport.GetTransportGetData();
868+
PerformanceDataManager.AddTransportData(transportProfilerData);
869+
}
870+
871+
OnPerformanceDataEvent?.Invoke(PerformanceDataManager.GetData());
856872
}
857873

858874
internal void UpdateNetworkTime(ulong clientId, float netTime, float receiveTime, bool warp = false)
@@ -906,6 +922,7 @@ internal IEnumerator TimeOutSwitchSceneProgress(SceneSwitchProgress switchSceneP
906922

907923
private void HandleRawTransportPoll(NetEventType eventType, ulong clientId, Channel channel, ArraySegment<byte> payload, float receiveTime)
908924
{
925+
PerformanceDataManager.Increment(ProfilerConstants.NumberBytesReceived, payload.Count);
909926
ProfilerStatManager.bytesRcvd.Record(payload.Count);
910927
switch (eventType)
911928
{
@@ -1166,6 +1183,7 @@ internal void HandleIncomingData(ulong clientId, Channel channel, ArraySegment<b
11661183
{
11671184
m_RpcBatcher.ReceiveItems(messageStream, ReceiveCallback, RpcQueueContainer.QueueItemType.ServerRpc, clientId, receiveTime);
11681185
ProfilerStatManager.rpcBatchesRcvd.Record();
1186+
PerformanceDataManager.Increment(ProfilerConstants.NumberOfRPCBatchesReceived);
11691187
}
11701188
else
11711189
{
@@ -1188,6 +1206,7 @@ internal void HandleIncomingData(ulong clientId, Channel channel, ArraySegment<b
11881206
{
11891207
m_RpcBatcher.ReceiveItems(messageStream, ReceiveCallback, RpcQueueContainer.QueueItemType.ClientRpc, clientId, receiveTime);
11901208
ProfilerStatManager.rpcBatchesRcvd.Record();
1209+
PerformanceDataManager.Increment(ProfilerConstants.NumberOfRPCBatchesReceived);
11911210
}
11921211
else
11931212
{
@@ -1339,6 +1358,7 @@ public void DisconnectClient(ulong clientId)
13391358
{
13401359
if (ConnectedClientsList[i].ClientId == clientId) {
13411360
ConnectedClientsList.RemoveAt(i);
1361+
PerformanceDataManager.Increment(ProfilerConstants.NumberOfConnections, -1);
13421362
ProfilerStatManager.connections.Record(-1);
13431363
}
13441364
}
@@ -1404,6 +1424,7 @@ internal void OnClientDisconnectFromServer(ulong clientId)
14041424
if (ConnectedClientsList[i].ClientId == clientId)
14051425
{
14061426
ConnectedClientsList.RemoveAt(i);
1427+
PerformanceDataManager.Increment(ProfilerConstants.NumberOfConnections, -1);
14071428
ProfilerStatManager.connections.Record(-1);
14081429
break;
14091430
}
@@ -1452,6 +1473,7 @@ internal void HandleApproval(ulong clientId, bool createPlayerObject, ulong? pla
14521473
ConnectedClients.Add(clientId, client);
14531474
ConnectedClientsList.Add(client);
14541475

1476+
PerformanceDataManager.Increment(ProfilerConstants.NumberOfConnections);
14551477
ProfilerStatManager.connections.Record();
14561478

14571479
// This packet is unreliable, but if it gets through it should provide a much better sync than the potentially huge approval message.

com.unity.multiplayer.mlapi/Runtime/Messaging/InternalMessageHandler.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -694,13 +694,15 @@ internal static void RPCReceiveQueueItem(ulong clientId, Stream stream, float re
694694
}
695695

696696
ProfilerStatManager.rpcsRcvd.Record();
697+
PerformanceDataManager.Increment(ProfilerConstants.NumberOfRPCsReceived);
697698

698699
var rpcQueueContainer = NetworkingManager.Singleton.rpcQueueContainer;
699700
rpcQueueContainer.AddQueueItemToInboundFrame(queueItemType, receiveTime, clientId, (BitStream)stream);
700701
}
701702

702703
internal static void HandleUnnamedMessage(ulong clientId, Stream stream)
703704
{
705+
PerformanceDataManager.Increment(ProfilerConstants.NumberOfUnnamedMessages);
704706
ProfilerStatManager.unnamedMessage.Record();
705707
#if DEVELOPMENT_BUILD || UNITY_EDITOR
706708
s_HandleUnnamedMessage.Begin();
@@ -713,6 +715,7 @@ internal static void HandleUnnamedMessage(ulong clientId, Stream stream)
713715

714716
internal static void HandleNamedMessage(ulong clientId, Stream stream)
715717
{
718+
PerformanceDataManager.Increment(ProfilerConstants.NumberOfNamedMessages);
716719
ProfilerStatManager.namedMessage.Record();
717720
#if DEVELOPMENT_BUILD || UNITY_EDITOR
718721
s_HandleNamedMessage.Begin();

com.unity.multiplayer.mlapi/Runtime/Messaging/InternalMessageSender.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ internal static void Send(ulong clientId, byte messageType, Channel channel, Bit
2626

2727
NetworkingManager.Singleton.NetworkConfig.NetworkTransport.Send(clientId, new ArraySegment<byte>(stream.GetBuffer(), 0, (int)stream.Length), channel);
2828
ProfilerStatManager.bytesSent.Record((int)stream.Length);
29+
PerformanceDataManager.Increment(ProfilerConstants.NumberBytesSent, (int)stream.Length);
2930

3031
NetworkProfiler.EndEvent();
3132
}
@@ -57,6 +58,7 @@ internal static void Send(byte messageType, Channel channel, BitStream messageSt
5758

5859
NetworkingManager.Singleton.NetworkConfig.NetworkTransport.Send(NetworkingManager.Singleton.ConnectedClientsList[i].ClientId, new ArraySegment<byte>(stream.GetBuffer(), 0, (int)stream.Length), channel);
5960
ProfilerStatManager.bytesSent.Record((int)stream.Length);
61+
PerformanceDataManager.Increment(ProfilerConstants.NumberBytesSent, (int)stream.Length);
6062
}
6163
NetworkProfiler.EndEvent();
6264
}
@@ -95,6 +97,7 @@ internal static void Send(byte messageType, Channel channel, List<ulong> clientI
9597

9698
NetworkingManager.Singleton.NetworkConfig.NetworkTransport.Send(clientIds[i], new ArraySegment<byte>(stream.GetBuffer(), 0, (int)stream.Length), channel);
9799
ProfilerStatManager.bytesSent.Record((int)stream.Length);
100+
PerformanceDataManager.Increment(ProfilerConstants.NumberBytesSent, (int)stream.Length);
98101
}
99102
NetworkProfiler.EndEvent();
100103
}
@@ -131,6 +134,7 @@ internal static void Send(byte messageType, Channel channel, ulong clientIdToIgn
131134

132135
NetworkingManager.Singleton.NetworkConfig.NetworkTransport.Send(NetworkingManager.Singleton.ConnectedClientsList[i].ClientId, new ArraySegment<byte>(stream.GetBuffer(), 0, (int)stream.Length), channel);
133136
ProfilerStatManager.bytesSent.Record((int)stream.Length);
137+
PerformanceDataManager.Increment(ProfilerConstants.NumberBytesSent, (int)stream.Length);
134138
}
135139
NetworkProfiler.EndEvent();
136140
}

com.unity.multiplayer.mlapi/Runtime/Messaging/RpcBatcher.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,8 @@ public void QueueItem(in RpcFrameQueueItem queueItem)
149149

150150
ProfilerStatManager.bytesSent.Record(queueItem.messageData.Count);
151151
ProfilerStatManager.rpcsSent.Record();
152+
PerformanceDataManager.Increment(ProfilerConstants.NumberBytesSent, queueItem.messageData.Count);
153+
PerformanceDataManager.Increment(ProfilerConstants.NumberOfRPCsSent);
152154
}
153155
}
154156

@@ -178,6 +180,7 @@ public void SendItems(int thresholdBytes, SendCallbackType sendCallback)
178180
entry.Value.Stream.Position = 0;
179181
entry.Value.IsEmpty = true;
180182
ProfilerStatManager.rpcBatchesSent.Record();
183+
PerformanceDataManager.Increment(ProfilerConstants.NumberOfRPCBatchesSent);
181184
}
182185
}
183186
}

com.unity.multiplayer.mlapi/Runtime/Messaging/RpcQueue/RpcQueueContainer.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,10 +251,12 @@ public void AdvanceFrameHistory(QueueHistoryFrame.QueueFrameType queueType)
251251
if (queueType == QueueHistoryFrame.QueueFrameType.Inbound)
252252
{
253253
ProfilerStatManager.rpcInQueueSize.Record((int)queueHistoryItem.totalSize);
254+
PerformanceDataManager.Increment(ProfilerConstants.NumberOfRPCsInQueueSize, (int)queueHistoryItem.totalSize);
254255
}
255256
else
256257
{
257258
ProfilerStatManager.rpcOutQueueSize.Record((int)queueHistoryItem.totalSize);
259+
PerformanceDataManager.Increment(ProfilerConstants.NumberOfRPCsOutQueueSize, (int)queueHistoryItem.totalSize);
258260
}
259261
}
260262

com.unity.multiplayer.mlapi/Runtime/Messaging/RpcQueue/RpcQueueProcessor.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ public void ProcessReceiveQueue(NetworkUpdateManager.NetworkUpdateStage currentS
6262

6363
NetworkingManager.InvokeRpc(currentQueueItem);
6464
ProfilerStatManager.rpcsQueueProc.Record();
65+
PerformanceDataManager.Increment(ProfilerConstants.NumberOfRPCQueueProcessed);
6566
currentQueueItem = CurrentFrame.GetNextQueueItem();
6667
}
6768

@@ -130,6 +131,7 @@ public void InternalMessagesSendAndFlush()
130131
InternalMessageSender.Send(clientId, MLAPIConstants.MLAPI_ADD_OBJECT, queueItem.channel, PoolStream, queueItem.sendFlags);
131132
}
132133

134+
PerformanceDataManager.Increment(ProfilerConstants.NumberOfRPCsSent, queueItem.clientIds.Length);
133135
ProfilerStatManager.rpcsSent.Record(queueItem.clientIds.Length);
134136
break;
135137
}
@@ -140,6 +142,7 @@ public void InternalMessagesSendAndFlush()
140142
InternalMessageSender.Send(clientId, MLAPIConstants.MLAPI_DESTROY_OBJECT, queueItem.channel, PoolStream, queueItem.sendFlags);
141143
}
142144

145+
PerformanceDataManager.Increment(ProfilerConstants.NumberOfRPCsSent, queueItem.clientIds.Length);
143146
ProfilerStatManager.rpcsSent.Record(queueItem.clientIds.Length);
144147
break;
145148
}
@@ -228,6 +231,9 @@ private void SendFrameQueueItem(RpcFrameQueueItem queueItem)
228231
NetworkingManager.Singleton.NetworkConfig.NetworkTransport.Send(queueItem.networkId, queueItem.messageData, queueItem.channel);
229232

230233
//For each packet sent, we want to record how much data we have sent
234+
235+
PerformanceDataManager.Increment(ProfilerConstants.NumberBytesSent, (int)queueItem.streamSize);
236+
PerformanceDataManager.Increment(ProfilerConstants.NumberOfRPCsSent);
231237
ProfilerStatManager.bytesSent.Record((int)queueItem.streamSize);
232238
ProfilerStatManager.rpcsSent.Record();
233239
break;
@@ -239,10 +245,12 @@ private void SendFrameQueueItem(RpcFrameQueueItem queueItem)
239245
NetworkingManager.Singleton.NetworkConfig.NetworkTransport.Send(clientid, queueItem.messageData, queueItem.channel);
240246

241247
//For each packet sent, we want to record how much data we have sent
248+
PerformanceDataManager.Increment(ProfilerConstants.NumberBytesSent, (int)queueItem.streamSize);
242249
ProfilerStatManager.bytesSent.Record((int)queueItem.streamSize);
243250
}
244251

245252
//For each client we send to, we want to record how many RPCs we have sent
253+
PerformanceDataManager.Increment(ProfilerConstants.NumberOfRPCsSent, queueItem.clientIds.Length);
246254
ProfilerStatManager.rpcsSent.Record(queueItem.clientIds.Length);
247255

248256
break;
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
using System.Collections.Generic;
2+
3+
namespace MLAPI.Profiling
4+
{
5+
public interface ITransportProfilerData
6+
{
7+
Dictionary<string, int> GetTransportGetData();
8+
}
9+
}

com.unity.multiplayer.mlapi/Runtime/Profiling/ITransportProfilerData.cs.meta

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
using System.Collections.Generic;
2+
using System.Linq;
3+
4+
namespace MLAPI.Profiling
5+
{
6+
public static class PerformanceDataManager
7+
{
8+
static PerformanceTickData s_ProfilerData;
9+
static int s_TickID;
10+
11+
public static void BeginNewTick()
12+
{
13+
s_ProfilerData = new PerformanceTickData
14+
{
15+
tickID = s_TickID++,
16+
};
17+
}
18+
19+
public static void Increment(ProfilerConstants fieldName, int count = 1)
20+
{
21+
s_ProfilerData.Increment(fieldName, count);
22+
}
23+
24+
public static void AddTransportData(Dictionary<string, int> transportProfilerData)
25+
{
26+
IEnumerable<KeyValuePair<string, int>> nonDuplicates = transportProfilerData.Where(entry => !s_ProfilerData.tickData.ContainsKey(entry.Key));
27+
foreach (KeyValuePair<string, int> entry in nonDuplicates)
28+
{
29+
s_ProfilerData.tickData.Add(entry.Key, entry.Value);
30+
}
31+
}
32+
33+
public static PerformanceTickData GetData()
34+
{
35+
return s_ProfilerData;
36+
}
37+
}
38+
}

com.unity.multiplayer.mlapi/Runtime/Profiling/PerformanceDataManager.cs.meta

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
using System.Collections.Generic;
2+
3+
namespace MLAPI.Profiling
4+
{
5+
public class PerformanceTickData
6+
{
7+
public int tickID;
8+
9+
public readonly Dictionary<string, int> tickData = new Dictionary<string, int>();
10+
11+
public void Increment(ProfilerConstants fieldName, int count = 1)
12+
{
13+
string fieldStr = fieldName.ToString();
14+
if (!tickData.ContainsKey(fieldStr))
15+
{
16+
tickData[fieldStr] = 0;
17+
}
18+
19+
tickData[fieldStr] += count;
20+
}
21+
22+
public int GetData(ProfilerConstants fieldName)
23+
{
24+
string fieldString = fieldName.ToString();
25+
return tickData.ContainsKey(fieldString) ? tickData[fieldString] : 0;
26+
}
27+
}
28+
}

com.unity.multiplayer.mlapi/Runtime/Profiling/PerformanceTickData.cs.meta

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
namespace MLAPI.Profiling
2+
{
3+
public enum ProfilerConstants
4+
{
5+
NumberOfConnections,
6+
ReceiveTickRate,
7+
8+
NumberOfNamedMessages,
9+
NumberOfUnnamedMessages,
10+
NumberBytesSent,
11+
NumberBytesReceived,
12+
NumberNetworkVarsReceived,
13+
NumberOfRPCsSent,
14+
NumberOfRPCsReceived,
15+
NumberOfRPCBatchesSent,
16+
NumberOfRPCBatchesReceived,
17+
NumberOfRPCQueueProcessed,
18+
NumberOfRPCsInQueueSize,
19+
NumberOfRPCsOutQueueSize,
20+
}
21+
}

com.unity.multiplayer.mlapi/Runtime/Profiling/ProfilerConstants.cs.meta

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)