Skip to content

Implement metrics for network variable deltas #884

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 7 additions & 3 deletions com.unity.multiplayer.mlapi/Runtime/Core/NetworkBehaviour.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
using MLAPI.Spawning;
using MLAPI.Transports;
using Unity.Profiling;
using Debug = UnityEngine.Debug;

namespace MLAPI
{
Expand Down Expand Up @@ -444,6 +445,7 @@ internal void InitializeVariables()
}

instance.SetNetworkBehaviour(this);
instance.Name = sortedFields[i].Name;
NetworkVariableFields.Add(instance);
}
}
Expand Down Expand Up @@ -649,6 +651,7 @@ private void NetworkVariableUpdate(ulong clientId, int behaviourIndex)
if (shouldWrite)
{
writtenAny = true;
var deltaBuffer = 0L;

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

writer.WriteUInt16Packed((ushort)varBuffer.Length);
buffer.CopyFrom(varBuffer);
deltaBuffer = varBuffer.Length;
}
}
else
Expand All @@ -671,6 +675,8 @@ private void NetworkVariableUpdate(ulong clientId, int behaviourIndex)
m_NetworkVariableIndexesToResetSet.Add(k);
m_NetworkVariableIndexesToReset.Add(k);
}

NetworkManager.NetworkMetrics.TrackNetworkVariableDeltaSent(clientId, NetworkObjectId, name, NetworkVariableFields[k].Name, (ulong)deltaBuffer);
}
}

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

networkVariableList[i].ReadDelta(stream, networkManager.IsServer);
PerformanceDataManager.Increment(ProfilerConstants.NetworkVarDeltas);


ProfilerStatManager.NetworkVarsRcvd.Record();
networkManager.NetworkMetrics.TrackNetworkVariableDeltaReceived(clientId, logInstance.NetworkObjectId, logInstance.name, networkVariableList[i].Name, (ulong)stream.Length);

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

networkVariableList[i].ReadField(stream);
PerformanceDataManager.Increment(ProfilerConstants.NetworkVarUpdates);

ProfilerStatManager.NetworkVarsRcvd.Record();

if (networkManager.NetworkConfig.EnsureNetworkVariableLengthSafety)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,10 @@ public interface INetworkMetrics

void TrackUnnamedMessageReceived(ulong senderClientId, ulong bytesCount);

void TrackNetworkVariableDeltaSent(ulong receiverClientId, ulong networkObjectId, string gameObjectName,string variableName, ulong bytesCount);

void TrackNetworkVariableDeltaReceived(ulong senderClientId, ulong networkObjectId, string gameObjectName,string variableName, ulong bytesCount);

void DispatchFrame();
}
}
21 changes: 21 additions & 0 deletions com.unity.multiplayer.mlapi/Runtime/Metrics/NetworkMetrics.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,9 @@ public class NetworkMetrics : INetworkMetrics
readonly EventMetric<UnnamedMessageEvent> m_UnnamedMessageSentEvent = new EventMetric<UnnamedMessageEvent>(MetricNames.UnnamedMessageSent);
readonly EventMetric<UnnamedMessageEvent> m_UnnamedMessageReceivedEvent = new EventMetric<UnnamedMessageEvent>(MetricNames.UnnamedMessageReceived);

readonly EventMetric<NetworkVariableEvent> m_NetworkVariableDeltaSentEvent = new EventMetric<NetworkVariableEvent>(MetricNames.NetworkVariableDeltaSent);
readonly EventMetric<NetworkVariableEvent> m_NetworkVariableDeltaReceivedEvent = new EventMetric<NetworkVariableEvent>(MetricNames.NetworkVariableDeltaReceived);

private Dictionary<ulong, NetworkObjectIdentifier> m_NetworkGameObjects = new Dictionary<ulong, NetworkObjectIdentifier>();

public NetworkMetrics(NetworkManager networkManager)
Expand All @@ -25,6 +28,7 @@ public NetworkMetrics(NetworkManager networkManager)
Dispatcher = new MetricDispatcherBuilder()
.WithMetricEvents(m_NamedMessageSentEvent, m_NamedMessageReceivedEvent)
.WithMetricEvents(m_UnnamedMessageSentEvent, m_UnnamedMessageReceivedEvent)
.WithMetricEvents(m_NetworkVariableDeltaSentEvent, m_NetworkVariableDeltaReceivedEvent)
.Build();

Dispatcher.RegisterObserver(MLAPIObserver.Observer);
Expand Down Expand Up @@ -75,11 +79,28 @@ public void TrackUnnamedMessageReceived(ulong senderClientId, ulong bytesCount)
{
m_UnnamedMessageReceivedEvent.Mark(new UnnamedMessageEvent(new ConnectionInfo(senderClientId), bytesCount));
}

public void TrackNetworkVariableDeltaSent(ulong receiverClientId, ulong networkObjectId, string gameObjectName, string variableName, ulong bytesCount)
{
variableName = PrettyPrintVariableName(variableName);
m_NetworkVariableDeltaSentEvent.Mark(new NetworkVariableEvent(new ConnectionInfo(receiverClientId), new NetworkObjectIdentifier(gameObjectName, networkObjectId), variableName, bytesCount));
}

public void TrackNetworkVariableDeltaReceived(ulong senderClientId, ulong networkObjectId, string gameObjectName, string variableName, ulong bytesCount)
{
variableName = PrettyPrintVariableName(variableName);
m_NetworkVariableDeltaReceivedEvent.Mark(new NetworkVariableEvent(new ConnectionInfo(senderClientId), new NetworkObjectIdentifier(gameObjectName, networkObjectId), variableName, bytesCount));
}

public void DispatchFrame()
{
Dispatcher.Dispatch();
}

private static string PrettyPrintVariableName(string variableName)
{
return variableName.Replace("<", string.Empty).Replace(">k__BackingField", string.Empty);
}
}

public class MLAPIObserver
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,14 @@ public void TrackUnnamedMessageReceived(ulong senderClientId, ulong bytesCount)
{
}

public void TrackNetworkVariableDeltaSent(ulong receiverClientId, ulong networkObjectId, string gameObjectName, string variableName, ulong bytesCount)
{
}

public void TrackNetworkVariableDeltaReceived(ulong senderClientId, ulong networkObjectId, string gameObjectName, string variableName, ulong bytesCount)
{
}

public void DispatchFrame()
{
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,8 @@ public NetworkDictionary(IDictionary<TKey, TValue> value)
m_Dictionary = value;
}

public string Name { get; set; }

/// <inheritdoc />
public void ResetDirty()
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,8 @@ public NetworkList(IList<T> value)
m_List = value;
}

public string Name { get; set; }

/// <inheritdoc />
public void ResetDirty()
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,8 @@ public NetworkSet(ISet<T> value)
m_Set = value;
}

public string Name { get; set; }

/// <inheritdoc />
public void ResetDirty()
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,5 +74,6 @@ public interface INetworkVariable
/// <param name="behaviour">The behaviour the container behaves to</param>
void SetNetworkBehaviour(NetworkBehaviour behaviour);

string Name { get; set; }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,8 @@ public T Value

private bool m_IsDirty = false;

public string Name { get; set; }

/// <summary>
/// Sets whether or not the variable needs to be delta synced
/// </summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ public void TearDown()
}

[UnityTest]
public IEnumerator NetworkMetrics_WhenNamedMessageSent_TracksNamedMessageSentMetric()
public IEnumerator TrackNamedMessageSentMetric()
{
var messageName = Guid.NewGuid().ToString();

Expand All @@ -53,7 +53,7 @@ public IEnumerator NetworkMetrics_WhenNamedMessageSent_TracksNamedMessageSentMet
}

[UnityTest]
public IEnumerator NetworkMetrics_WhenNamedMessageSentToMultipleClients_TracksNamedMessageSentMetric()
public IEnumerator TrackNamedMessageSentMetricToMultipleClients()
{
var messageName = Guid.NewGuid().ToString();

Expand All @@ -75,7 +75,7 @@ public IEnumerator NetworkMetrics_WhenNamedMessageSentToMultipleClients_TracksNa
}

[UnityTest]
public IEnumerator NetworkMetrics_WhenUnnamedMessageSent_TracksNamedMessageSentMetric()
public IEnumerator TrackUnnamedMessageSentMetric()
{
var clientId = 100UL;
m_NetworkMetrics.Dispatcher.RegisterObserver(new TestObserver(collection =>
Expand All @@ -93,7 +93,7 @@ public IEnumerator NetworkMetrics_WhenUnnamedMessageSent_TracksNamedMessageSentM
}

[UnityTest]
public IEnumerator NetworkMetrics_WhenUnnamedMessageSentToMultipleClients_TracksNamedMessageSentMetric()
public IEnumerator TrackUnnamedMessageSentMetricToMultipleClients()
{
m_NetworkMetrics.Dispatcher.RegisterObserver(new TestObserver(collection =>
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ public IEnumerator TearDown()
}

[UnityTest]
public IEnumerator NetworkMetrics_WhenNamedMessageReceived_TracksNamedMessageReceivedMetric()
public IEnumerator TrackNamedMessageReceivedMetric()
{
var messageName = Guid.NewGuid().ToString();
LogAssert.Expect(LogType.Log, $"Received from {m_Server.LocalClientId}");
Expand Down Expand Up @@ -88,7 +88,7 @@ public IEnumerator NetworkMetrics_WhenNamedMessageReceived_TracksNamedMessageRec
}

[UnityTest]
public IEnumerator NetworkMetrics_WhenUnnamedMessageReceived_TracksUnnamedMessageReceivedMetric()
public IEnumerator TrackUnnamedMessageReceivedMetric()
{
var found = false;
m_ClientMetrics.Dispatcher.RegisterObserver(new TestObserver(collection =>
Expand Down
Loading