Skip to content

Commit 7660619

Browse files
committed
Added NetworkProfiling internally
1 parent 7a4d187 commit 7660619

File tree

5 files changed

+94
-27
lines changed

5 files changed

+94
-27
lines changed

MLAPI/Data/NetworkProfiler/NetworkProfiler.cs

Lines changed: 55 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,90 @@
1-
using System;
1+
using MLAPI.NetworkingManagerComponents.Core;
22
using UnityEngine;
33

44
namespace MLAPI.Data.NetworkProfiler
55
{
66
public static class NetworkProfiler
77
{
8-
const int tickCount = 1024;
9-
public static readonly FixedQueue<ProfilerTick> Ticks = new FixedQueue<ProfilerTick>(tickCount);
8+
public static FixedQueue<ProfilerTick> Ticks = null;
9+
private static int tickHistory = 1024;
10+
private static bool isRunning = false;
1011
private static ProfilerTick CurrentTick;
1112

13+
public static void Start(int historyLength)
14+
{
15+
if (isRunning)
16+
return;
17+
Ticks = new FixedQueue<ProfilerTick>(historyLength);
18+
tickHistory = historyLength;
19+
CurrentTick = null;
20+
isRunning = true;
21+
}
22+
23+
public static ProfilerTick[] Stop()
24+
{
25+
if (!isRunning)
26+
return new ProfilerTick[0];
27+
ProfilerTick[] ticks = new ProfilerTick[Ticks.Count];
28+
for (int i = 0; i < Ticks.Count; i++)
29+
ticks[i] = Ticks.ElementAt(i);
30+
31+
Ticks = null; //leave to GC
32+
CurrentTick = null; //leave to GC
33+
isRunning = false;
34+
return ticks;
35+
}
36+
1237
internal static void StartTick(TickType type)
1338
{
14-
if (Ticks.Count == tickCount)
39+
if (!isRunning)
40+
return;
41+
if (Ticks.Count == tickHistory)
1542
Ticks.Dequeue();
16-
43+
1744
ProfilerTick tick = new ProfilerTick()
1845
{
19-
StartTime = Time.unscaledTime,
20-
EndTime = -1,
21-
Type = type
46+
Type = type,
47+
Frame = Time.frameCount
2248
};
2349
Ticks.Enqueue(tick);
2450
CurrentTick = tick;
2551
}
2652

2753
internal static void EndTick()
2854
{
55+
if (!isRunning)
56+
return;
2957
if (CurrentTick == null)
3058
return;
31-
CurrentTick.EndTime = Time.unscaledTime;
3259
CurrentTick = null;
3360
}
61+
62+
internal static void StartEvent(TickType eventType, uint bytes, int channelId, ushort messageId)
63+
{
64+
if (!isRunning)
65+
return;
66+
if (CurrentTick == null)
67+
return;
68+
string channelName = MessageManager.reverseChannels.ContainsKey(channelId) ? MessageManager.reverseChannels[channelId] : "INVALID_CHANNEL";
69+
string messageName = MessageManager.reverseMessageTypes.ContainsKey(messageId) ? MessageManager.reverseMessageTypes[messageId] : "INVALID_MESSAGE_TYPE";
3470

35-
internal static void StartEvent(TickType eventType, uint bytes, string channelName, string messageType)
71+
CurrentTick.StartEvent(eventType, bytes, channelName, messageName);
72+
}
73+
74+
internal static void StartEvent(TickType eventType, uint bytes, string channelName, string messageName)
3675
{
76+
if (!isRunning)
77+
return;
3778
if (CurrentTick == null)
3879
return;
39-
CurrentTick.StartEvent(eventType, bytes, channelName, messageType);
80+
81+
CurrentTick.StartEvent(eventType, bytes, channelName, messageName);
4082
}
4183

4284
internal static void EndEvent()
4385
{
86+
if (!isRunning)
87+
return;
4488
if (CurrentTick == null)
4589
return;
4690
CurrentTick.EndEvent();

MLAPI/Data/NetworkProfiler/ProfilerTickData.cs

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
using System;
2-
using System.Collections.Generic;
3-
using UnityEngine;
1+
using System.Collections.Generic;
42

53
namespace MLAPI.Data.NetworkProfiler
64
{
@@ -18,9 +16,9 @@ internal void EndEvent()
1816
{
1917
for (int i = Events.Count - 1; i >= 0; i--)
2018
{
21-
if (Events[i].EndTime == -1)
19+
if (!Events[i].Closed)
2220
{
23-
Events[i].EndTime = Time.unscaledTime;
21+
Events[i].Closed = true;
2422
return;
2523
}
2624
}
@@ -33,16 +31,14 @@ internal void StartEvent(TickType type, uint bytes, string channelName, string m
3331
Bytes = bytes,
3432
ChannelName = string.IsNullOrEmpty(channelName) ? "NONE" : channelName,
3533
MessageType = string.IsNullOrEmpty(messageType) ? "NONE" : messageType,
36-
EndTime = -1,
37-
StartTime = Time.unscaledTime,
38-
EventType = type
34+
EventType = type,
35+
Closed = false
3936
};
4037
Events.Add(tickEvent);
4138
}
4239

4340
public TickType Type;
44-
public float StartTime;
45-
public float EndTime;
41+
public int Frame;
4642
}
4743

4844
public class TickEvent
@@ -51,7 +47,6 @@ public class TickEvent
5147
public uint Bytes;
5248
public string ChannelName;
5349
public string MessageType;
54-
public float StartTime = -1;
55-
public float EndTime = -1;
50+
public bool Closed;
5651
}
5752
}

MLAPI/MonoBehaviours/Core/NetworkingManager.cs

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
using MLAPI.NetworkingManagerComponents.Binary;
1212
using MLAPI.Data.Transports;
1313
using MLAPI.Data.Transports.UNET;
14+
using MLAPI.Data.NetworkProfiler;
1415

1516
namespace MLAPI.MonoBehaviours.Core
1617
{
@@ -680,16 +681,19 @@ private void Update()
680681
{
681682
if((NetworkTime - lastSendTickTime >= (1f / NetworkConfig.SendTickrate)) || NetworkConfig.SendTickrate <= 0)
682683
{
684+
NetworkProfiler.StartTick(TickType.Send);
683685
foreach (KeyValuePair<uint, NetworkedClient> pair in connectedClients)
684686
{
685687
byte error;
686688
NetworkConfig.NetworkTransport.SendQueue(pair.Key, out error);
687689
if (LogHelper.CurrentLogLevel <= LogLevel.Developer) LogHelper.LogInfo("Send Pending Queue: " + pair.Key);
688690
}
689691
lastSendTickTime = NetworkTime;
692+
NetworkProfiler.EndTick();
690693
}
691694
if((NetworkTime - lastReceiveTickTime >= (1f / NetworkConfig.ReceiveTickrate)) || NetworkConfig.ReceiveTickrate <= 0)
692695
{
696+
NetworkProfiler.StartTick(TickType.Receive);
693697
NetEventType eventType;
694698
int processedEvents = 0;
695699
do
@@ -704,6 +708,7 @@ private void Update()
704708
switch (eventType)
705709
{
706710
case NetEventType.Connect:
711+
NetworkProfiler.StartEvent(TickType.Receive, (uint)receivedSize, MessageManager.reverseChannels[channelId], "TRANSPORT_CONNECT");
707712
if (isServer)
708713
{
709714
if (LogHelper.CurrentLogLevel <= LogLevel.Developer) LogHelper.LogInfo("Client Connected");
@@ -736,13 +741,15 @@ private void Update()
736741
InternalMessageHandler.Send(clientId, "MLAPI_CONNECTION_REQUEST", "MLAPI_INTERNAL", writer, null, null, null, true);
737742
}
738743
}
744+
NetworkProfiler.EndEvent();
739745
break;
740746
case NetEventType.Data:
741747
if (LogHelper.CurrentLogLevel <= LogLevel.Developer) LogHelper.LogInfo("Incomming Data From " + clientId + " : " + receivedSize + " bytes");
742748

743-
HandleIncomingData(clientId, messageBuffer, channelId);
749+
HandleIncomingData(clientId, messageBuffer, channelId, (uint)receivedSize);
744750
break;
745751
case NetEventType.Disconnect:
752+
NetworkProfiler.StartEvent(TickType.Receive, 0, "NONE", "TRANSPORT_DISCONNECT");
746753
if (LogHelper.CurrentLogLevel <= LogLevel.Developer) LogHelper.LogInfo("Disconnect Event From " + clientId);
747754

748755
if (isServer)
@@ -752,31 +759,39 @@ private void Update()
752759

753760
if (OnClientDisconnectCallback != null)
754761
OnClientDisconnectCallback.Invoke(clientId);
762+
NetworkProfiler.EndEvent();
755763
break;
756764
}
757765
// Only do another iteration if: there are no more messages AND (there is no limit to max events or we have processed less than the maximum)
758766
} while (eventType != NetEventType.Nothing && (NetworkConfig.MaxReceiveEventsPerTickRate <= 0 || processedEvents < NetworkConfig.MaxReceiveEventsPerTickRate));
759767
lastReceiveTickTime = NetworkTime;
768+
NetworkProfiler.EndTick();
760769
}
761770

762771
if (isServer && ((NetworkTime - lastEventTickTime >= (1f / NetworkConfig.EventTickrate))))
763772
{
773+
NetworkProfiler.StartTick(TickType.Event);
764774
eventOvershootCounter += ((NetworkTime - lastEventTickTime) - (1f / NetworkConfig.EventTickrate));
765775
LagCompensationManager.AddFrames();
766776
NetworkedObject.InvokeSyncvarUpdate();
767777
lastEventTickTime = NetworkTime;
778+
NetworkProfiler.EndTick();
768779
}
769780
else if (isServer && eventOvershootCounter >= ((1f / NetworkConfig.EventTickrate)))
770781
{
782+
NetworkProfiler.StartTick(TickType.Event);
771783
//We run this one to compensate for previous update overshoots.
772784
eventOvershootCounter -= (1f / NetworkConfig.EventTickrate);
773785
LagCompensationManager.AddFrames();
786+
NetworkProfiler.EndTick();
774787
}
775788

776789
if (NetworkConfig.EnableTimeResync && NetworkTime - lastTimeSyncTime >= 30)
777790
{
791+
NetworkProfiler.StartTick(TickType.Event);
778792
SyncTime();
779793
lastTimeSyncTime = NetworkTime;
794+
NetworkProfiler.EndTick();
780795
}
781796

782797
networkTime += Time.unscaledDeltaTime;
@@ -799,7 +814,7 @@ private IEnumerator ApprovalTimeout(uint clientId)
799814
}
800815
}
801816

802-
private void HandleIncomingData(uint clientId, byte[] data, int channelId)
817+
private void HandleIncomingData(uint clientId, byte[] data, int channelId, uint totalSize)
803818
{
804819
if (LogHelper.CurrentLogLevel <= LogLevel.Developer) LogHelper.LogInfo("Unwrapping Data Header");
805820
using (BitReader reader = BitReader.Get(data))
@@ -823,6 +838,9 @@ private void HandleIncomingData(uint clientId, byte[] data, int channelId)
823838
else if (isPassthrough && !isServer)
824839
passthroughOrigin = reader.ReadUInt();
825840

841+
byte headerSize = 0; //TODO
842+
NetworkProfiler.StartEvent(TickType.Receive, totalSize - headerSize, channelId, messageType);
843+
826844
if (LogHelper.CurrentLogLevel <= LogLevel.Developer) LogHelper.LogInfo("Data Header" +
827845
":messageHeader=" + messageType +
828846
":targeted=" + targeted +
@@ -1009,6 +1027,7 @@ private void HandleIncomingData(uint clientId, byte[] data, int channelId)
10091027
#endregion
10101028
}
10111029
}
1030+
NetworkProfiler.EndEvent();
10121031
}
10131032
}
10141033

@@ -1187,7 +1206,6 @@ internal void HandleApproval(uint clientId, bool approved, Vector3 position, Qua
11871206
pair.Value.WriteFormattedSyncedVarData(writer);
11881207
}
11891208
}
1190-
11911209
InternalMessageHandler.Send(clientId, "MLAPI_CONNECTION_APPROVED", "MLAPI_INTERNAL", writer, null, null, null, true);
11921210

11931211
if (OnClientConnectedCallback != null)
@@ -1227,7 +1245,6 @@ internal void HandleApproval(uint clientId, bool approved, Vector3 position, Qua
12271245
{
12281246
writer.WriteUInt(clientId);
12291247
}
1230-
12311248
InternalMessageHandler.Send(clientPair.Key, "MLAPI_ADD_OBJECT", "MLAPI_INTERNAL", writer, null);
12321249
}
12331250
}

MLAPI/NetworkingManagerComponents/Core/InternalMessageHandler.Send.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System.Collections.Generic;
22
using MLAPI.Data;
3+
using MLAPI.Data.NetworkProfiler;
34
using MLAPI.NetworkingManagerComponents.Binary;
45
using MLAPI.NetworkingManagerComponents.Cryptography;
56

@@ -110,11 +111,13 @@ internal static bool Send(uint clientId, string messageType, string channelName,
110111

111112
writer.Finalize(ref FinalMessageBuffer);
112113

114+
NetworkProfiler.StartEvent(TickType.Send, (uint)messageWriter.GetFinalizeSize(), channelName, messageType);
113115
byte error;
114116
if (skipQueue)
115117
netManager.NetworkConfig.NetworkTransport.QueueMessageForSending(targetClientId, ref FinalMessageBuffer, (int)writer.GetFinalizeSize(), MessageManager.channels[channelName], true, out error);
116118
else
117119
netManager.NetworkConfig.NetworkTransport.QueueMessageForSending(targetClientId, ref FinalMessageBuffer, (int)writer.GetFinalizeSize(), MessageManager.channels[channelName], false, out error);
120+
NetworkProfiler.EndEvent();
118121

119122
return true;
120123
}
@@ -166,8 +169,10 @@ internal static void Send(uint[] clientIds, string messageType, string channelNa
166169

167170
writer.Finalize(ref FinalMessageBuffer);
168171

172+
NetworkProfiler.StartEvent(TickType.Send, (uint)messageWriter.GetFinalizeSize(), channelName, messageType);
169173
byte error;
170174
netManager.NetworkConfig.NetworkTransport.QueueMessageForSending(targetClientId, ref FinalMessageBuffer, (int)writer.GetFinalizeSize(), channel, false, out error);
175+
NetworkProfiler.EndEvent();
171176
}
172177
}
173178
}
@@ -218,8 +223,10 @@ internal static void Send(List<uint> clientIds, string messageType, string chann
218223

219224
writer.Finalize(ref FinalMessageBuffer);
220225

226+
NetworkProfiler.StartEvent(TickType.Send, (uint)messageWriter.GetFinalizeSize(), channelName, messageType);
221227
byte error;
222228
netManager.NetworkConfig.NetworkTransport.QueueMessageForSending(targetClientId, ref FinalMessageBuffer, (int)writer.GetFinalizeSize(), channel, false, out error);
229+
NetworkProfiler.EndEvent();
223230
}
224231
}
225232
}
@@ -278,8 +285,10 @@ internal static ref List<uint> Send(string messageType, string channelName, BitW
278285

279286
writer.Finalize(ref FinalMessageBuffer);
280287

288+
NetworkProfiler.StartEvent(TickType.Send, (uint)messageWriter.GetFinalizeSize(), channelName, messageType);
281289
byte error;
282290
netManager.NetworkConfig.NetworkTransport.QueueMessageForSending(targetClientId, ref FinalMessageBuffer, (int)writer.GetFinalizeSize(), channel, false, out error);
291+
NetworkProfiler.EndEvent();
283292
}
284293
return ref failedObservers;
285294
}
@@ -339,8 +348,10 @@ internal static ref List<uint> Send(string messageType, string channelName, BitW
339348

340349
writer.Finalize(ref FinalMessageBuffer);
341350

351+
NetworkProfiler.StartEvent(TickType.Send, (uint)messageWriter.GetFinalizeSize(), channelName, messageType);
342352
byte error;
343353
netManager.NetworkConfig.NetworkTransport.QueueMessageForSending(targetClientId, ref FinalMessageBuffer, (int)writer.GetFinalizeSize(), channel, false, out error);
354+
NetworkProfiler.EndEvent();
344355
}
345356
return ref failedObservers;
346357
}

UnityStupidity.dll

0 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)