Skip to content

feat: Add profiling decorator pattern #878

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
merged 7 commits into from
Jun 4, 2021
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
18 changes: 13 additions & 5 deletions com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -343,11 +343,8 @@ private void Init(bool server)

SceneManager = new NetworkSceneManager(this);

if (MessageHandler == null)
{
// Only create this if it's not already set (like in test cases)
MessageHandler = new InternalMessageHandler(this);
}
// Only create this if it's not already set (like in test cases)
MessageHandler ??= CreateMessageHandler();

MessageSender = new InternalMessageSender(this);

Expand Down Expand Up @@ -1691,6 +1688,17 @@ internal void HandleApproval(ulong ownerClientId, bool createPlayerObject, uint?
}
}

private IInternalMessageHandler CreateMessageHandler()
{
IInternalMessageHandler messageHandler = new InternalMessageHandler(this);

#if DEVELOPMENT_BUILD || UNITY_EDITOR
messageHandler = new InternalMessageHandlerProfilingDecorator(messageHandler);
#endif

return messageHandler;
}

private void ProfilerBeginTick()
{
ProfilerNotifier.ProfilerBeginTick();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
using MLAPI.Logging;
using MLAPI.SceneManagement;
using MLAPI.Serialization.Pooled;
using MLAPI.Spawning;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.SceneManagement;
Expand All @@ -13,32 +12,11 @@
using MLAPI.Messaging.Buffering;
using MLAPI.Profiling;
using MLAPI.Serialization;
using Unity.Profiling;

namespace MLAPI.Messaging
{
internal class InternalMessageHandler : IInternalMessageHandler
{
#if DEVELOPMENT_BUILD || UNITY_EDITOR
private static ProfilerMarker s_HandleConnectionRequest = new ProfilerMarker($"{nameof(InternalMessageHandler)}.{nameof(HandleConnectionRequest)}");
private static ProfilerMarker s_HandleConnectionApproved = new ProfilerMarker($"{nameof(InternalMessageHandler)}.{nameof(HandleConnectionApproved)}");
private static ProfilerMarker s_HandleAddObject = new ProfilerMarker($"{nameof(InternalMessageHandler)}.{nameof(HandleAddObject)}");
private static ProfilerMarker s_HandleDestroyObject = new ProfilerMarker($"{nameof(InternalMessageHandler)}.{nameof(HandleDestroyObject)}");
private static ProfilerMarker s_HandleSwitchScene = new ProfilerMarker($"{nameof(InternalMessageHandler)}.{nameof(HandleSwitchScene)}");
private static ProfilerMarker s_HandleClientSwitchSceneCompleted = new ProfilerMarker($"{nameof(InternalMessageHandler)}.{nameof(HandleClientSwitchSceneCompleted)}");
private static ProfilerMarker s_HandleChangeOwner = new ProfilerMarker($"{nameof(InternalMessageHandler)}.{nameof(HandleChangeOwner)}");
private static ProfilerMarker s_HandleAddObjects = new ProfilerMarker($"{nameof(InternalMessageHandler)}.{nameof(HandleAddObjects)}");
private static ProfilerMarker s_HandleDestroyObjects = new ProfilerMarker($"{nameof(InternalMessageHandler)}.{nameof(HandleDestroyObjects)}");
private static ProfilerMarker s_HandleTimeSync = new ProfilerMarker($"{nameof(InternalMessageHandler)}.{nameof(HandleTimeSync)}");
private static ProfilerMarker s_HandleNetworkVariableDelta = new ProfilerMarker($"{nameof(InternalMessageHandler)}.{nameof(HandleNetworkVariableDelta)}");
private static ProfilerMarker s_HandleUnnamedMessage = new ProfilerMarker($"{nameof(InternalMessageHandler)}.{nameof(HandleUnnamedMessage)}");
private static ProfilerMarker s_HandleNamedMessage = new ProfilerMarker($"{nameof(InternalMessageHandler)}.{nameof(HandleNamedMessage)}");
private static ProfilerMarker s_HandleNetworkLog = new ProfilerMarker($"{nameof(InternalMessageHandler)}.{nameof(HandleNetworkLog)}");
private static ProfilerMarker s_RpcReceiveQueueItemServerRpc = new ProfilerMarker($"{nameof(InternalMessageHandler)}.{nameof(RpcReceiveQueueItem)}.{nameof(RpcQueueContainer.QueueItemType.ServerRpc)}");
private static ProfilerMarker s_RpcReceiveQueueItemClientRpc = new ProfilerMarker($"{nameof(InternalMessageHandler)}.{nameof(RpcReceiveQueueItem)}.{nameof(RpcQueueContainer.QueueItemType.ClientRpc)}");
private static ProfilerMarker s_HandleAllClientsSwitchSceneCompleted = new ProfilerMarker($"{nameof(InternalMessageHandler)}.{nameof(HandleAllClientsSwitchSceneCompleted)}");
#endif

public NetworkManager NetworkManager => m_NetworkManager;
private NetworkManager m_NetworkManager;

Expand All @@ -49,9 +27,6 @@ public InternalMessageHandler(NetworkManager networkManager)

public void HandleConnectionRequest(ulong clientId, Stream stream)
{
#if DEVELOPMENT_BUILD || UNITY_EDITOR
s_HandleConnectionRequest.Begin();
#endif
if (NetworkManager.PendingClients.TryGetValue(clientId, out PendingClient client))
{
// Set to pending approval to prevent future connection requests from being approved
Expand Down Expand Up @@ -84,16 +59,10 @@ public void HandleConnectionRequest(ulong clientId, Stream stream)
NetworkManager.HandleApproval(clientId, NetworkManager.NetworkConfig.PlayerPrefab != null, null, true, null, null);
}
}
#if DEVELOPMENT_BUILD || UNITY_EDITOR
s_HandleConnectionRequest.End();
#endif
}

public void HandleConnectionApproved(ulong clientId, Stream stream, float receiveTime)
{
#if DEVELOPMENT_BUILD || UNITY_EDITOR
s_HandleConnectionApproved.Begin();
#endif
using (var reader = PooledNetworkReader.Get(stream))
{
NetworkManager.LocalClientId = reader.ReadUInt64Packed();
Expand Down Expand Up @@ -164,16 +133,10 @@ void OnSceneLoadComplete()
DelayedSpawnAction(stream);
}
}
#if DEVELOPMENT_BUILD || UNITY_EDITOR
s_HandleConnectionApproved.End();
#endif
}

public void HandleAddObject(ulong clientId, Stream stream)
{
#if DEVELOPMENT_BUILD || UNITY_EDITOR
s_HandleAddObject.Begin();
#endif
using (var reader = PooledNetworkReader.Get(stream))
{
var isPlayerObject = reader.ReadBool();
Expand Down Expand Up @@ -217,31 +180,19 @@ public void HandleAddObject(ulong clientId, Stream stream)
}
}
}
#if DEVELOPMENT_BUILD || UNITY_EDITOR
s_HandleAddObject.End();
#endif
}

public void HandleDestroyObject(ulong clientId, Stream stream)
{
#if DEVELOPMENT_BUILD || UNITY_EDITOR
s_HandleDestroyObject.Begin();
#endif
using (var reader = PooledNetworkReader.Get(stream))
{
ulong networkId = reader.ReadUInt64Packed();
NetworkManager.SpawnManager.OnDestroyObject(networkId, true);
}
#if DEVELOPMENT_BUILD || UNITY_EDITOR
s_HandleDestroyObject.End();
#endif
}

public void HandleSwitchScene(ulong clientId, Stream stream)
{
#if DEVELOPMENT_BUILD || UNITY_EDITOR
s_HandleSwitchScene.Begin();
#endif
using (var reader = PooledNetworkReader.Get(stream))
{
uint sceneIndex = reader.ReadUInt32Packed();
Expand All @@ -253,30 +204,18 @@ public void HandleSwitchScene(ulong clientId, Stream stream)

m_NetworkManager.SceneManager.OnSceneSwitch(sceneIndex, switchSceneGuid, objectBuffer);
}
#if DEVELOPMENT_BUILD || UNITY_EDITOR
s_HandleSwitchScene.End();
#endif
}

public void HandleClientSwitchSceneCompleted(ulong clientId, Stream stream)
{
#if DEVELOPMENT_BUILD || UNITY_EDITOR
s_HandleClientSwitchSceneCompleted.Begin();
#endif
using (var reader = PooledNetworkReader.Get(stream))
{
m_NetworkManager.SceneManager.OnClientSwitchSceneCompleted(clientId, new Guid(reader.ReadByteArray()));
}
#if DEVELOPMENT_BUILD || UNITY_EDITOR
s_HandleClientSwitchSceneCompleted.End();
#endif
}

public void HandleChangeOwner(ulong clientId, Stream stream)
{
#if DEVELOPMENT_BUILD || UNITY_EDITOR
s_HandleChangeOwner.Begin();
#endif
using (var reader = PooledNetworkReader.Get(stream))
{
ulong networkId = reader.ReadUInt64Packed();
Expand All @@ -296,16 +235,10 @@ public void HandleChangeOwner(ulong clientId, Stream stream)

NetworkManager.SpawnManager.SpawnedObjects[networkId].OwnerClientId = ownerClientId;
}
#if DEVELOPMENT_BUILD || UNITY_EDITOR
s_HandleChangeOwner.End();
#endif
}

public void HandleAddObjects(ulong clientId, Stream stream)
{
#if DEVELOPMENT_BUILD || UNITY_EDITOR
s_HandleAddObjects.Begin();
#endif
using (var reader = PooledNetworkReader.Get(stream))
{
ushort objectCount = reader.ReadUInt16Packed();
Expand All @@ -315,16 +248,10 @@ public void HandleAddObjects(ulong clientId, Stream stream)
HandleAddObject(clientId, stream);
}
}
#if DEVELOPMENT_BUILD || UNITY_EDITOR
s_HandleAddObjects.End();
#endif
}

public void HandleDestroyObjects(ulong clientId, Stream stream)
{
#if DEVELOPMENT_BUILD || UNITY_EDITOR
s_HandleDestroyObjects.Begin();
#endif
using (var reader = PooledNetworkReader.Get(stream))
{
ushort objectCount = reader.ReadUInt16Packed();
Expand All @@ -334,31 +261,19 @@ public void HandleDestroyObjects(ulong clientId, Stream stream)
HandleDestroyObject(clientId, stream);
}
}
#if DEVELOPMENT_BUILD || UNITY_EDITOR
s_HandleDestroyObjects.End();
#endif
}

public void HandleTimeSync(ulong clientId, Stream stream, float receiveTime)
{
#if DEVELOPMENT_BUILD || UNITY_EDITOR
s_HandleTimeSync.Begin();
#endif
using (var reader = PooledNetworkReader.Get(stream))
{
float netTime = reader.ReadSinglePacked();
NetworkManager.UpdateNetworkTime(clientId, netTime, receiveTime);
}
#if DEVELOPMENT_BUILD || UNITY_EDITOR
s_HandleTimeSync.End();
#endif
}

public void HandleNetworkVariableDelta(ulong clientId, Stream stream, Action<ulong, PreBufferPreset> bufferCallback, PreBufferPreset bufferPreset)
{
#if DEVELOPMENT_BUILD || UNITY_EDITOR
s_HandleNetworkVariableDelta.Begin();
#endif
if (!NetworkManager.NetworkConfig.EnableNetworkVariable)
{
if (NetworkLog.CurrentLogLevel <= LogLevel.Normal)
Expand Down Expand Up @@ -407,9 +322,6 @@ public void HandleNetworkVariableDelta(ulong clientId, Stream stream, Action<ulo
bufferCallback(networkObjectId, bufferPreset);
}
}
#if DEVELOPMENT_BUILD || UNITY_EDITOR
s_HandleNetworkVariableDelta.End();
#endif
}

/// <summary>
Expand All @@ -428,70 +340,31 @@ public void RpcReceiveQueueItem(ulong clientId, Stream stream, float receiveTime
ProfilerStatManager.RpcsRcvd.Record();
PerformanceDataManager.Increment(ProfilerConstants.RpcReceived);

#if DEVELOPMENT_BUILD || UNITY_EDITOR
switch (queueItemType)
{
case RpcQueueContainer.QueueItemType.ServerRpc:
s_RpcReceiveQueueItemServerRpc.Begin();
break;
case RpcQueueContainer.QueueItemType.ClientRpc:
s_RpcReceiveQueueItemClientRpc.Begin();
break;
}
#endif

var rpcQueueContainer = NetworkManager.RpcQueueContainer;
rpcQueueContainer.AddQueueItemToInboundFrame(queueItemType, receiveTime, clientId, (NetworkBuffer)stream);

#if DEVELOPMENT_BUILD || UNITY_EDITOR
switch (queueItemType)
{
case RpcQueueContainer.QueueItemType.ServerRpc:
s_RpcReceiveQueueItemServerRpc.End();
break;
case RpcQueueContainer.QueueItemType.ClientRpc:
s_RpcReceiveQueueItemClientRpc.End();
break;
}
#endif
}

public void HandleUnnamedMessage(ulong clientId, Stream stream)
{
PerformanceDataManager.Increment(ProfilerConstants.UnnamedMessageReceived);
ProfilerStatManager.UnnamedMessage.Record();
#if DEVELOPMENT_BUILD || UNITY_EDITOR
s_HandleUnnamedMessage.Begin();
#endif
NetworkManager.CustomMessagingManager.InvokeUnnamedMessage(clientId, stream);
#if DEVELOPMENT_BUILD || UNITY_EDITOR
s_HandleUnnamedMessage.End();
#endif
}

public void HandleNamedMessage(ulong clientId, Stream stream)
{
PerformanceDataManager.Increment(ProfilerConstants.NamedMessageReceived);
ProfilerStatManager.NamedMessage.Record();
#if DEVELOPMENT_BUILD || UNITY_EDITOR
s_HandleNamedMessage.Begin();
#endif
using (var reader = PooledNetworkReader.Get(stream))
{
ulong hash = reader.ReadUInt64Packed();

NetworkManager.CustomMessagingManager.InvokeNamedMessage(hash, clientId, stream);
}
#if DEVELOPMENT_BUILD || UNITY_EDITOR
s_HandleNamedMessage.End();
#endif
}

public void HandleNetworkLog(ulong clientId, Stream stream)
{
#if DEVELOPMENT_BUILD || UNITY_EDITOR
s_HandleNetworkLog.Begin();
#endif
using (var reader = PooledNetworkReader.Get(stream))
{
var logType = (NetworkLog.LogType)reader.ReadByte();
Expand All @@ -510,9 +383,6 @@ public void HandleNetworkLog(ulong clientId, Stream stream)
break;
}
}
#if DEVELOPMENT_BUILD || UNITY_EDITOR
s_HandleNetworkLog.End();
#endif
}

internal static void HandleSnapshot(ulong clientId, Stream messageStream)
Expand All @@ -522,18 +392,12 @@ internal static void HandleSnapshot(ulong clientId, Stream messageStream)

public void HandleAllClientsSwitchSceneCompleted(ulong clientId, Stream stream)
{
#if DEVELOPMENT_BUILD || UNITY_EDITOR
s_HandleAllClientsSwitchSceneCompleted.Begin();
#endif
using (var reader = PooledNetworkReader.Get(stream))
{
var clientIds = reader.ReadULongArray();
var timedOutClientIds = reader.ReadULongArray();
NetworkManager.SceneManager.AllClientsReady(clientIds, timedOutClientIds);
}
#if DEVELOPMENT_BUILD || UNITY_EDITOR
s_HandleAllClientsSwitchSceneCompleted.End();
#endif
}
}
}
Loading