Compare commits

...

3 Commits

Author SHA1 Message Date
mischa
777b2a9822
Merge 3df73ea9f1 into 451c297a43 2024-11-12 22:21:40 +02:00
miwarnec
451c297a43 NTHybrid: fix name and Unity 2019 support
Some checks failed
Main / Run Unity Tests (push) Has been cancelled
Main / Delete Old Workflow Runs (push) Has been cancelled
Main / Semantic Release (push) Has been cancelled
2024-11-11 16:58:42 +01:00
miwarnec
3df73ea9f1 feat(Profiling): NetworkLoop sampling instead of "UpdateFunction.Invoke" 2024-11-05 15:58:59 +01:00
5 changed files with 59 additions and 3 deletions

View File

@ -367,7 +367,7 @@ protected virtual void OnClientToServerDeltaSync(byte baselineTick, Vector3 posi
bufferSizeLimit, bufferSizeLimit,
new TransformSnapshot( new TransformSnapshot(
timestamp, // arrival remote timestamp. NOT remote time. timestamp, // arrival remote timestamp. NOT remote time.
Time.timeAsDouble, NetworkTime.localTime, // Unity 2019 doesn't have Time.timeAsDouble yet
position, position,
rotation, rotation,
scale scale
@ -711,7 +711,7 @@ protected virtual void OnServerToClientDeltaSync(byte baselineTick, Vector3 posi
bufferSizeLimit, bufferSizeLimit,
new TransformSnapshot( new TransformSnapshot(
timestamp, // arrival remote timestamp. NOT remote time. timestamp, // arrival remote timestamp. NOT remote time.
Time.timeAsDouble, NetworkTime.localTime, // Unity 2019 doesn't have Time.timeAsDouble yet
position, position,
rotation, rotation,
scale scale

View File

@ -3,6 +3,7 @@
using System.Linq; using System.Linq;
using Mirror.RemoteCalls; using Mirror.RemoteCalls;
using UnityEngine; using UnityEngine;
using UnityEngine.Profiling;
namespace Mirror namespace Mirror
{ {
@ -1500,8 +1501,11 @@ internal static void ChangeOwner(NetworkIdentity identity, ChangeOwnerMessage me
internal static void NetworkEarlyUpdate() internal static void NetworkEarlyUpdate()
{ {
// process all incoming messages first before updating the world // 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) if (Transport.active != null)
Transport.active.ClientEarlyUpdate(); Transport.active.ClientEarlyUpdate();
Profiler.EndSample();
// time snapshot interpolation // time snapshot interpolation
UpdateTimeInterpolation(); UpdateTimeInterpolation();
@ -1532,7 +1536,10 @@ internal static void NetworkLateUpdate()
bool sendIntervalElapsed = AccurateInterval.Elapsed(NetworkTime.localTime, sendInterval, ref lastSendTime); bool sendIntervalElapsed = AccurateInterval.Elapsed(NetworkTime.localTime, sendInterval, ref lastSendTime);
if (!Application.isPlaying || sendIntervalElapsed) if (!Application.isPlaying || sendIntervalElapsed)
{ {
// profiling marker for shallow profiling to show more than "UpdateFunction.Invoke
Profiler.BeginSample("NetworkClient: Broadcast");
Broadcast(); Broadcast();
Profiler.EndSample();
} }
UpdateConnectionQuality(); UpdateConnectionQuality();
@ -1589,8 +1596,11 @@ void UpdateConnectionQuality()
} }
// process all outgoing messages after updating the world // 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) if (Transport.active != null)
Transport.active.ClientLateUpdate(); Transport.active.ClientLateUpdate();
Profiler.EndSample();
} }
// broadcast /////////////////////////////////////////////////////////// // broadcast ///////////////////////////////////////////////////////////
@ -1628,7 +1638,11 @@ static void BroadcastToServer()
{ {
// get serialization for this entity viewed by this connection // get serialization for this entity viewed by this connection
// (if anything was serialized this time) // (if anything was serialized this time)
// profiling marker for shallow profiling to show more than "UpdateFunction.Invoke
Profiler.BeginSample("BroadcastToServer: SerializeClient");
identity.SerializeClient(writer); identity.SerializeClient(writer);
Profiler.EndSample();
if (writer.Position > 0) if (writer.Position > 0)
{ {
// send state update message // send state update message
@ -1637,7 +1651,11 @@ static void BroadcastToServer()
netId = identity.netId, netId = identity.netId,
payload = writer.ToArraySegment() payload = writer.ToArraySegment()
}; };
// profiling marker for shallow profiling to show more than "UpdateFunction.Invoke
Profiler.BeginSample("BroadcastToServer: Flush");
Send(message); Send(message);
Profiler.EndSample();
} }
} }
} }

View File

@ -28,6 +28,7 @@
using UnityEngine; using UnityEngine;
using UnityEngine.LowLevel; using UnityEngine.LowLevel;
using UnityEngine.PlayerLoop; using UnityEngine.PlayerLoop;
using UnityEngine.Profiling;
namespace Mirror namespace Mirror
{ {
@ -187,12 +188,17 @@ static void NetworkEarlyUpdate()
// however, we only want to call NetworkServer/Client in play mode. // however, we only want to call NetworkServer/Client in play mode.
if (!Application.isPlaying) return; if (!Application.isPlaying) return;
// profiling marker for shallow profiling to show more than "UpdateFunction.Invoke"
Profiler.BeginSample("NetworkEarlyUpdate");
NetworkTime.EarlyUpdate(); NetworkTime.EarlyUpdate();
//Debug.Log($"NetworkEarlyUpdate {Time.time}"); //Debug.Log($"NetworkEarlyUpdate {Time.time}");
NetworkServer.NetworkEarlyUpdate(); NetworkServer.NetworkEarlyUpdate();
NetworkClient.NetworkEarlyUpdate(); NetworkClient.NetworkEarlyUpdate();
// invoke event after mirror has done it's early updating. // invoke event after mirror has done it's early updating.
OnEarlyUpdate?.Invoke(); OnEarlyUpdate?.Invoke();
Profiler.EndSample();
} }
static void NetworkLateUpdate() static void NetworkLateUpdate()
@ -201,11 +207,16 @@ static void NetworkLateUpdate()
// however, we only want to call NetworkServer/Client in play mode. // however, we only want to call NetworkServer/Client in play mode.
if (!Application.isPlaying) return; if (!Application.isPlaying) return;
// profiling marker for shallow profiling to show more than "UpdateFunction.Invoke"
Profiler.BeginSample("NetworkLateUpdate");
//Debug.Log($"NetworkLateUpdate {Time.time}"); //Debug.Log($"NetworkLateUpdate {Time.time}");
// invoke event before mirror does its final late updating. // invoke event before mirror does its final late updating.
OnLateUpdate?.Invoke(); OnLateUpdate?.Invoke();
NetworkServer.NetworkLateUpdate(); NetworkServer.NetworkLateUpdate();
NetworkClient.NetworkLateUpdate(); NetworkClient.NetworkLateUpdate();
Profiler.EndSample();
} }
} }
} }

View File

@ -3,6 +3,7 @@
using System.Linq; using System.Linq;
using Mirror.RemoteCalls; using Mirror.RemoteCalls;
using UnityEngine; using UnityEngine;
using UnityEngine.Profiling;
namespace Mirror namespace Mirror
{ {
@ -1928,7 +1929,11 @@ static void BroadcastToConnection(NetworkConnectionToClient connection)
{ {
// get serialization for this entity viewed by this connection // get serialization for this entity viewed by this connection
// (if anything was serialized this time) // (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); NetworkWriter serialization = SerializeForConnection(identity, connection);
Profiler.EndSample();
if (serialization != null) if (serialization != null)
{ {
EntityStateMessage message = new EntityStateMessage EntityStateMessage message = new EntityStateMessage
@ -1936,7 +1941,11 @@ static void BroadcastToConnection(NetworkConnectionToClient connection)
netId = identity.netId, netId = identity.netId,
payload = serialization.ToArraySegment() payload = serialization.ToArraySegment()
}; };
// profiling marker for shallow profiling to show more than "UpdateFunction.Invoke
Profiler.BeginSample("BroadcastToConnection: Send");
connection.Send(message); connection.Send(message);
Profiler.EndSample();
} }
} }
// spawned list should have no null entries because we // spawned list should have no null entries because we
@ -2017,7 +2026,10 @@ static void Broadcast()
} }
// update connection to flush out batched messages // update connection to flush out batched messages
// profiling marker for shallow profiling to show more than "UpdateFunction.Invoke
Profiler.BeginSample("Broadcast: Flush");
connection.Update(); connection.Update();
Profiler.EndSample();
} }
} }
@ -2034,12 +2046,19 @@ internal static void NetworkEarlyUpdate()
} }
// process all incoming messages first before updating the world // 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) if (Transport.active != null)
Transport.active.ServerEarlyUpdate(); Transport.active.ServerEarlyUpdate();
Profiler.EndSample();
// step each connection's local time interpolation in early update. // 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) foreach (NetworkConnectionToClient connection in connections.Values)
connection.UpdateTimeInterpolation(); connection.UpdateTimeInterpolation();
Profiler.EndSample();
if (active) earlyUpdateDuration.End(); if (active) earlyUpdateDuration.End();
} }
@ -2068,13 +2087,21 @@ internal static void NetworkLateUpdate()
// Unity 2019 doesn't have Time.timeAsDouble yet // Unity 2019 doesn't have Time.timeAsDouble yet
bool sendIntervalElapsed = AccurateInterval.Elapsed(NetworkTime.localTime, sendInterval, ref lastSendTime); bool sendIntervalElapsed = AccurateInterval.Elapsed(NetworkTime.localTime, sendInterval, ref lastSendTime);
if (!Application.isPlaying || sendIntervalElapsed) if (!Application.isPlaying || sendIntervalElapsed)
{
// profiling marker for shallow profiling to show more than "UpdateFunction.Invoke
Profiler.BeginSample("NetworkServer: Broadcast");
Broadcast(); Broadcast();
Profiler.EndSample();
}
} }
// process all outgoing messages after updating the world // process all outgoing messages after updating the world
// (even if not active. still want to process disconnects etc.) // (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) if (Transport.active != null)
Transport.active.ServerLateUpdate(); Transport.active.ServerLateUpdate();
Profiler.EndSample();
// measure actual tick rate every second. // measure actual tick rate every second.
if (active) if (active)