Skip to content

Commit d966c53

Browse files
authored
Implement metrics for network variable deltas (#884)
1 parent 0ed7634 commit d966c53

19 files changed

+260
-192
lines changed

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

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
using MLAPI.Spawning;
1818
using MLAPI.Transports;
1919
using Unity.Profiling;
20+
using Debug = UnityEngine.Debug;
2021

2122
namespace MLAPI
2223
{
@@ -444,6 +445,7 @@ internal void InitializeVariables()
444445
}
445446

446447
instance.SetNetworkBehaviour(this);
448+
instance.Name = sortedFields[i].Name;
447449
NetworkVariableFields.Add(instance);
448450
}
449451
}
@@ -649,6 +651,7 @@ private void NetworkVariableUpdate(ulong clientId, int behaviourIndex)
649651
if (shouldWrite)
650652
{
651653
writtenAny = true;
654+
var deltaBuffer = 0L;
652655

653656
if (NetworkManager.NetworkConfig.EnsureNetworkVariableLengthSafety)
654657
{
@@ -659,6 +662,7 @@ private void NetworkVariableUpdate(ulong clientId, int behaviourIndex)
659662

660663
writer.WriteUInt16Packed((ushort)varBuffer.Length);
661664
buffer.CopyFrom(varBuffer);
665+
deltaBuffer = varBuffer.Length;
662666
}
663667
}
664668
else
@@ -671,6 +675,8 @@ private void NetworkVariableUpdate(ulong clientId, int behaviourIndex)
671675
m_NetworkVariableIndexesToResetSet.Add(k);
672676
m_NetworkVariableIndexesToReset.Add(k);
673677
}
678+
679+
NetworkManager.NetworkMetrics.TrackNetworkVariableDeltaSent(clientId, NetworkObjectId, name, NetworkVariableFields[k].Name, (ulong)deltaBuffer);
674680
}
675681
}
676682

@@ -759,9 +765,8 @@ internal static void HandleNetworkVariableDeltas(List<INetworkVariable> networkV
759765

760766
networkVariableList[i].ReadDelta(stream, networkManager.IsServer);
761767
PerformanceDataManager.Increment(ProfilerConstants.NetworkVarDeltas);
762-
763-
764768
ProfilerStatManager.NetworkVarsRcvd.Record();
769+
networkManager.NetworkMetrics.TrackNetworkVariableDeltaReceived(clientId, logInstance.NetworkObjectId, logInstance.name, networkVariableList[i].Name, (ulong)stream.Length);
765770

766771
if (networkManager.NetworkConfig.EnsureNetworkVariableLengthSafety)
767772
{
@@ -847,7 +852,6 @@ internal static void HandleNetworkVariableUpdate(List<INetworkVariable> networkV
847852

848853
networkVariableList[i].ReadField(stream);
849854
PerformanceDataManager.Increment(ProfilerConstants.NetworkVarUpdates);
850-
851855
ProfilerStatManager.NetworkVarsRcvd.Record();
852856

853857
if (networkManager.NetworkConfig.EnsureNetworkVariableLengthSafety)

com.unity.multiplayer.mlapi/Runtime/Metrics/INetworkMetrics.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,10 @@ public interface INetworkMetrics
1818

1919
void TrackUnnamedMessageReceived(ulong senderClientId, ulong bytesCount);
2020

21+
void TrackNetworkVariableDeltaSent(ulong receiverClientId, ulong networkObjectId, string gameObjectName,string variableName, ulong bytesCount);
22+
23+
void TrackNetworkVariableDeltaReceived(ulong senderClientId, ulong networkObjectId, string gameObjectName,string variableName, ulong bytesCount);
24+
2125
void DispatchFrame();
2226
}
2327
}

com.unity.multiplayer.mlapi/Runtime/Metrics/NetworkMetrics.cs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ public class NetworkMetrics : INetworkMetrics
1717
readonly EventMetric<UnnamedMessageEvent> m_UnnamedMessageSentEvent = new EventMetric<UnnamedMessageEvent>(MetricNames.UnnamedMessageSent);
1818
readonly EventMetric<UnnamedMessageEvent> m_UnnamedMessageReceivedEvent = new EventMetric<UnnamedMessageEvent>(MetricNames.UnnamedMessageReceived);
1919

20+
readonly EventMetric<NetworkVariableEvent> m_NetworkVariableDeltaSentEvent = new EventMetric<NetworkVariableEvent>(MetricNames.NetworkVariableDeltaSent);
21+
readonly EventMetric<NetworkVariableEvent> m_NetworkVariableDeltaReceivedEvent = new EventMetric<NetworkVariableEvent>(MetricNames.NetworkVariableDeltaReceived);
22+
2023
private Dictionary<ulong, NetworkObjectIdentifier> m_NetworkGameObjects = new Dictionary<ulong, NetworkObjectIdentifier>();
2124

2225
public NetworkMetrics(NetworkManager networkManager)
@@ -25,6 +28,7 @@ public NetworkMetrics(NetworkManager networkManager)
2528
Dispatcher = new MetricDispatcherBuilder()
2629
.WithMetricEvents(m_NamedMessageSentEvent, m_NamedMessageReceivedEvent)
2730
.WithMetricEvents(m_UnnamedMessageSentEvent, m_UnnamedMessageReceivedEvent)
31+
.WithMetricEvents(m_NetworkVariableDeltaSentEvent, m_NetworkVariableDeltaReceivedEvent)
2832
.Build();
2933

3034
Dispatcher.RegisterObserver(MLAPIObserver.Observer);
@@ -75,11 +79,28 @@ public void TrackUnnamedMessageReceived(ulong senderClientId, ulong bytesCount)
7579
{
7680
m_UnnamedMessageReceivedEvent.Mark(new UnnamedMessageEvent(new ConnectionInfo(senderClientId), bytesCount));
7781
}
82+
83+
public void TrackNetworkVariableDeltaSent(ulong receiverClientId, ulong networkObjectId, string gameObjectName, string variableName, ulong bytesCount)
84+
{
85+
variableName = PrettyPrintVariableName(variableName);
86+
m_NetworkVariableDeltaSentEvent.Mark(new NetworkVariableEvent(new ConnectionInfo(receiverClientId), new NetworkObjectIdentifier(gameObjectName, networkObjectId), variableName, bytesCount));
87+
}
88+
89+
public void TrackNetworkVariableDeltaReceived(ulong senderClientId, ulong networkObjectId, string gameObjectName, string variableName, ulong bytesCount)
90+
{
91+
variableName = PrettyPrintVariableName(variableName);
92+
m_NetworkVariableDeltaReceivedEvent.Mark(new NetworkVariableEvent(new ConnectionInfo(senderClientId), new NetworkObjectIdentifier(gameObjectName, networkObjectId), variableName, bytesCount));
93+
}
7894

7995
public void DispatchFrame()
8096
{
8197
Dispatcher.Dispatch();
8298
}
99+
100+
private static string PrettyPrintVariableName(string variableName)
101+
{
102+
return variableName.Replace("<", string.Empty).Replace(">k__BackingField", string.Empty);
103+
}
83104
}
84105

85106
public class MLAPIObserver

com.unity.multiplayer.mlapi/Runtime/Metrics/NullNetworkMetrics.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,14 @@ public void TrackUnnamedMessageReceived(ulong senderClientId, ulong bytesCount)
3232
{
3333
}
3434

35+
public void TrackNetworkVariableDeltaSent(ulong receiverClientId, ulong networkObjectId, string gameObjectName, string variableName, ulong bytesCount)
36+
{
37+
}
38+
39+
public void TrackNetworkVariableDeltaReceived(ulong senderClientId, ulong networkObjectId, string gameObjectName, string variableName, ulong bytesCount)
40+
{
41+
}
42+
3543
public void DispatchFrame()
3644
{
3745
}

com.unity.multiplayer.mlapi/Runtime/NetworkVariable/Collections/NetworkDictionary.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,8 @@ public NetworkDictionary(IDictionary<TKey, TValue> value)
7474
m_Dictionary = value;
7575
}
7676

77+
public string Name { get; set; }
78+
7779
/// <inheritdoc />
7880
public void ResetDirty()
7981
{

com.unity.multiplayer.mlapi/Runtime/NetworkVariable/Collections/NetworkList.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,8 @@ public NetworkList(IList<T> value)
7272
m_List = value;
7373
}
7474

75+
public string Name { get; set; }
76+
7577
/// <inheritdoc />
7678
public void ResetDirty()
7779
{

com.unity.multiplayer.mlapi/Runtime/NetworkVariable/Collections/NetworkSet.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,8 @@ public NetworkSet(ISet<T> value)
7373
m_Set = value;
7474
}
7575

76+
public string Name { get; set; }
77+
7678
/// <inheritdoc />
7779
public void ResetDirty()
7880
{

com.unity.multiplayer.mlapi/Runtime/NetworkVariable/INetworkVariable.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,5 +74,6 @@ public interface INetworkVariable
7474
/// <param name="behaviour">The behaviour the container behaves to</param>
7575
void SetNetworkBehaviour(NetworkBehaviour behaviour);
7676

77+
string Name { get; set; }
7778
}
7879
}

com.unity.multiplayer.mlapi/Runtime/NetworkVariable/NetworkVariable.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,8 @@ public T Value
9090

9191
private bool m_IsDirty = false;
9292

93+
public string Name { get; set; }
94+
9395
/// <summary>
9496
/// Sets whether or not the variable needs to be delta synced
9597
/// </summary>

com.unity.multiplayer.mlapi/Tests/Runtime/Metrics/NetworkMetricsDispatchTests.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public void TearDown()
3232
}
3333

3434
[UnityTest]
35-
public IEnumerator NetworkMetrics_WhenNamedMessageSent_TracksNamedMessageSentMetric()
35+
public IEnumerator TrackNamedMessageSentMetric()
3636
{
3737
var messageName = Guid.NewGuid().ToString();
3838

@@ -53,7 +53,7 @@ public IEnumerator NetworkMetrics_WhenNamedMessageSent_TracksNamedMessageSentMet
5353
}
5454

5555
[UnityTest]
56-
public IEnumerator NetworkMetrics_WhenNamedMessageSentToMultipleClients_TracksNamedMessageSentMetric()
56+
public IEnumerator TrackNamedMessageSentMetricToMultipleClients()
5757
{
5858
var messageName = Guid.NewGuid().ToString();
5959

@@ -75,7 +75,7 @@ public IEnumerator NetworkMetrics_WhenNamedMessageSentToMultipleClients_TracksNa
7575
}
7676

7777
[UnityTest]
78-
public IEnumerator NetworkMetrics_WhenUnnamedMessageSent_TracksNamedMessageSentMetric()
78+
public IEnumerator TrackUnnamedMessageSentMetric()
7979
{
8080
var clientId = 100UL;
8181
m_NetworkMetrics.Dispatcher.RegisterObserver(new TestObserver(collection =>
@@ -93,7 +93,7 @@ public IEnumerator NetworkMetrics_WhenUnnamedMessageSent_TracksNamedMessageSentM
9393
}
9494

9595
[UnityTest]
96-
public IEnumerator NetworkMetrics_WhenUnnamedMessageSentToMultipleClients_TracksNamedMessageSentMetric()
96+
public IEnumerator TrackUnnamedMessageSentMetricToMultipleClients()
9797
{
9898
m_NetworkMetrics.Dispatcher.RegisterObserver(new TestObserver(collection =>
9999
{

com.unity.multiplayer.mlapi/Tests/Runtime/Metrics/NetworkMetricsReceptionTests.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ public IEnumerator TearDown()
5151
}
5252

5353
[UnityTest]
54-
public IEnumerator NetworkMetrics_WhenNamedMessageReceived_TracksNamedMessageReceivedMetric()
54+
public IEnumerator TrackNamedMessageReceivedMetric()
5555
{
5656
var messageName = Guid.NewGuid().ToString();
5757
LogAssert.Expect(LogType.Log, $"Received from {m_Server.LocalClientId}");
@@ -88,7 +88,7 @@ public IEnumerator NetworkMetrics_WhenNamedMessageReceived_TracksNamedMessageRec
8888
}
8989

9090
[UnityTest]
91-
public IEnumerator NetworkMetrics_WhenUnnamedMessageReceived_TracksUnnamedMessageReceivedMetric()
91+
public IEnumerator TrackUnnamedMessageReceivedMetric()
9292
{
9393
var found = false;
9494
m_ClientMetrics.Dispatcher.RegisterObserver(new TestObserver(collection =>

0 commit comments

Comments
 (0)