feat(Profiling): NetworkLoop sampling instead of "UpdateFunction.Invoke"

This commit is contained in:
miwarnec 2024-10-31 16:58:17 +01:00
parent e7b3aa77df
commit 3df73ea9f1
3 changed files with 56 additions and 0 deletions

View File

@ -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();
}
}
}

View File

@ -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();
}
}
}

View File

@ -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)