From 3df73ea9f16d0a985d1faf92cfa9cf8ad45478aa Mon Sep 17 00:00:00 2001 From: miwarnec Date: Thu, 31 Oct 2024 16:58:17 +0100 Subject: [PATCH] feat(Profiling): NetworkLoop sampling instead of "UpdateFunction.Invoke" --- Assets/Mirror/Core/NetworkClient.cs | 18 ++++++++++++++++++ Assets/Mirror/Core/NetworkLoop.cs | 11 +++++++++++ Assets/Mirror/Core/NetworkServer.cs | 27 +++++++++++++++++++++++++++ 3 files changed, 56 insertions(+) diff --git a/Assets/Mirror/Core/NetworkClient.cs b/Assets/Mirror/Core/NetworkClient.cs index aa8883222..cf316d5b5 100644 --- a/Assets/Mirror/Core/NetworkClient.cs +++ b/Assets/Mirror/Core/NetworkClient.cs @@ -3,6 +3,7 @@ using System.Linq; using Mirror.RemoteCalls; using UnityEngine; +using UnityEngine.Profiling; namespace Mirror { @@ -1500,8 +1501,11 @@ internal static void ChangeOwner(NetworkIdentity identity, ChangeOwnerMessage me internal static void NetworkEarlyUpdate() { // process all incoming messages first before updating the world + // profiling marker for shallow profiling to show more than "UpdateFunction.Invoke + Profiler.BeginSample("NetworkClient: Transport Processing"); if (Transport.active != null) Transport.active.ClientEarlyUpdate(); + Profiler.EndSample(); // time snapshot interpolation UpdateTimeInterpolation(); @@ -1532,7 +1536,10 @@ internal static void NetworkLateUpdate() bool sendIntervalElapsed = AccurateInterval.Elapsed(NetworkTime.localTime, sendInterval, ref lastSendTime); if (!Application.isPlaying || sendIntervalElapsed) { + // profiling marker for shallow profiling to show more than "UpdateFunction.Invoke + Profiler.BeginSample("NetworkClient: Broadcast"); Broadcast(); + Profiler.EndSample(); } UpdateConnectionQuality(); @@ -1589,8 +1596,11 @@ void UpdateConnectionQuality() } // process all outgoing messages after updating the world + // profiling marker for shallow profiling to show more than "UpdateFunction.Invoke + Profiler.BeginSample("NetworkClient: Transport Flush"); if (Transport.active != null) Transport.active.ClientLateUpdate(); + Profiler.EndSample(); } // broadcast /////////////////////////////////////////////////////////// @@ -1628,7 +1638,11 @@ static void BroadcastToServer() { // get serialization for this entity viewed by this connection // (if anything was serialized this time) + // profiling marker for shallow profiling to show more than "UpdateFunction.Invoke + Profiler.BeginSample("BroadcastToServer: SerializeClient"); identity.SerializeClient(writer); + Profiler.EndSample(); + if (writer.Position > 0) { // send state update message @@ -1637,7 +1651,11 @@ static void BroadcastToServer() netId = identity.netId, payload = writer.ToArraySegment() }; + + // profiling marker for shallow profiling to show more than "UpdateFunction.Invoke + Profiler.BeginSample("BroadcastToServer: Flush"); Send(message); + Profiler.EndSample(); } } } diff --git a/Assets/Mirror/Core/NetworkLoop.cs b/Assets/Mirror/Core/NetworkLoop.cs index a9cd49038..98c6bb744 100644 --- a/Assets/Mirror/Core/NetworkLoop.cs +++ b/Assets/Mirror/Core/NetworkLoop.cs @@ -28,6 +28,7 @@ using UnityEngine; using UnityEngine.LowLevel; using UnityEngine.PlayerLoop; +using UnityEngine.Profiling; namespace Mirror { @@ -187,12 +188,17 @@ static void NetworkEarlyUpdate() // however, we only want to call NetworkServer/Client in play mode. if (!Application.isPlaying) return; + // profiling marker for shallow profiling to show more than "UpdateFunction.Invoke" + Profiler.BeginSample("NetworkEarlyUpdate"); + NetworkTime.EarlyUpdate(); //Debug.Log($"NetworkEarlyUpdate {Time.time}"); NetworkServer.NetworkEarlyUpdate(); NetworkClient.NetworkEarlyUpdate(); // invoke event after mirror has done it's early updating. OnEarlyUpdate?.Invoke(); + + Profiler.EndSample(); } static void NetworkLateUpdate() @@ -201,11 +207,16 @@ static void NetworkLateUpdate() // however, we only want to call NetworkServer/Client in play mode. if (!Application.isPlaying) return; + // profiling marker for shallow profiling to show more than "UpdateFunction.Invoke" + Profiler.BeginSample("NetworkLateUpdate"); + //Debug.Log($"NetworkLateUpdate {Time.time}"); // invoke event before mirror does its final late updating. OnLateUpdate?.Invoke(); NetworkServer.NetworkLateUpdate(); NetworkClient.NetworkLateUpdate(); + + Profiler.EndSample(); } } } diff --git a/Assets/Mirror/Core/NetworkServer.cs b/Assets/Mirror/Core/NetworkServer.cs index 5d545e15f..0a065289f 100644 --- a/Assets/Mirror/Core/NetworkServer.cs +++ b/Assets/Mirror/Core/NetworkServer.cs @@ -3,6 +3,7 @@ using System.Linq; using Mirror.RemoteCalls; using UnityEngine; +using UnityEngine.Profiling; namespace Mirror { @@ -1928,7 +1929,11 @@ static void BroadcastToConnection(NetworkConnectionToClient connection) { // get serialization for this entity viewed by this connection // (if anything was serialized this time) + // profiling marker for shallow profiling to show more than "UpdateFunction.Invoke + Profiler.BeginSample("BroadcastToConnection: SerializeForConnection"); NetworkWriter serialization = SerializeForConnection(identity, connection); + Profiler.EndSample(); + if (serialization != null) { EntityStateMessage message = new EntityStateMessage @@ -1936,7 +1941,11 @@ static void BroadcastToConnection(NetworkConnectionToClient connection) netId = identity.netId, payload = serialization.ToArraySegment() }; + + // profiling marker for shallow profiling to show more than "UpdateFunction.Invoke + Profiler.BeginSample("BroadcastToConnection: Send"); connection.Send(message); + Profiler.EndSample(); } } // spawned list should have no null entries because we @@ -2017,7 +2026,10 @@ static void Broadcast() } // update connection to flush out batched messages + // profiling marker for shallow profiling to show more than "UpdateFunction.Invoke + Profiler.BeginSample("Broadcast: Flush"); connection.Update(); + Profiler.EndSample(); } } @@ -2034,12 +2046,19 @@ internal static void NetworkEarlyUpdate() } // process all incoming messages first before updating the world + // profiling marker for shallow profiling to show more than "UpdateFunction.Invoke + Profiler.BeginSample("NetworkServer: Transport Processing"); if (Transport.active != null) Transport.active.ServerEarlyUpdate(); + Profiler.EndSample(); + // step each connection's local time interpolation in early update. + // profiling marker for shallow profiling to show more than "UpdateFunction.Invoke + Profiler.BeginSample("NetworkServer: Connections Time Update"); foreach (NetworkConnectionToClient connection in connections.Values) connection.UpdateTimeInterpolation(); + Profiler.EndSample(); if (active) earlyUpdateDuration.End(); } @@ -2068,13 +2087,21 @@ internal static void NetworkLateUpdate() // Unity 2019 doesn't have Time.timeAsDouble yet bool sendIntervalElapsed = AccurateInterval.Elapsed(NetworkTime.localTime, sendInterval, ref lastSendTime); if (!Application.isPlaying || sendIntervalElapsed) + { + // profiling marker for shallow profiling to show more than "UpdateFunction.Invoke + Profiler.BeginSample("NetworkServer: Broadcast"); Broadcast(); + Profiler.EndSample(); + } } // process all outgoing messages after updating the world // (even if not active. still want to process disconnects etc.) + // profiling marker for shallow profiling to show more than "UpdateFunction.Invoke + Profiler.BeginSample("NetworkServer: Transport Flush"); if (Transport.active != null) Transport.active.ServerLateUpdate(); + Profiler.EndSample(); // measure actual tick rate every second. if (active)