From 87f12016ccbfb7e0f5dc269780a668b1f08cdcd1 Mon Sep 17 00:00:00 2001 From: MrGadget <9826063+MrGadget1024@users.noreply.github.com> Date: Sun, 9 Feb 2025 10:16:34 -0500 Subject: [PATCH 01/10] fix: Reduce Message Noise High Ping frequency and TimeSnapshotMessage are only needed when NT's are actively used in the game - Prevents TimeSnapshotMessage sending when no NT's - Uses 2s Ping frequency when no NT's - NetworkTime has a `static ulong activeNTs' - NTBase and NTHybrid increment / decrement via OnEnable / OnDisable - Tests updated to use DefaultPingInterval, now internal static instead of const Tested with PlayerTest, Basic, and Room examples - PlayerTest works as expected using all NT prefabs - Basic example has no NT's, works as expected with low noise - Room example only uses NT in Game scene, not in Online scene - Logging shows the higher msg traffic in Game scene only, not in Online scene (correct) - Logging shows the reduced msg traffic when in Online Scene, even when switching back to Online scene from Game scene --- .../NetworkTransform/NetworkTransformBase.cs | 3 +++ .../NetworkTransform/NetworkTransformHybrid.cs | 14 ++++++++++++-- Assets/Mirror/Core/NetworkClient.cs | 3 ++- Assets/Mirror/Core/NetworkConnectionToClient.cs | 2 ++ Assets/Mirror/Core/NetworkServer.cs | 3 ++- Assets/Mirror/Core/NetworkTime.cs | 10 +++++++--- .../NetworkConnectionToClientTests.cs | 4 ++-- .../Tests/Runtime/NetworkServerRuntimeTest.cs | 3 +-- 8 files changed, 31 insertions(+), 11 deletions(-) diff --git a/Assets/Mirror/Components/NetworkTransform/NetworkTransformBase.cs b/Assets/Mirror/Components/NetworkTransform/NetworkTransformBase.cs index 13df63ad282..ca49e83daf0 100644 --- a/Assets/Mirror/Components/NetworkTransform/NetworkTransformBase.cs +++ b/Assets/Mirror/Components/NetworkTransform/NetworkTransformBase.cs @@ -434,11 +434,13 @@ public virtual void Reset() ResetState(); // default to ClientToServer so this works immediately for users syncDirection = SyncDirection.ClientToServer; + NetworkTime.activeNTs = 0; } protected virtual void OnEnable() { ResetState(); + NetworkTime.activeNTs++; if (NetworkServer.active) NetworkIdentity.clientAuthorityCallback += OnClientAuthorityChanged; @@ -447,6 +449,7 @@ protected virtual void OnEnable() protected virtual void OnDisable() { ResetState(); + NetworkTime.activeNTs--; if (NetworkServer.active) NetworkIdentity.clientAuthorityCallback -= OnClientAuthorityChanged; diff --git a/Assets/Mirror/Components/NetworkTransform/NetworkTransformHybrid.cs b/Assets/Mirror/Components/NetworkTransform/NetworkTransformHybrid.cs index a2280957e52..36a29d6c3f2 100644 --- a/Assets/Mirror/Components/NetworkTransform/NetworkTransformHybrid.cs +++ b/Assets/Mirror/Components/NetworkTransform/NetworkTransformHybrid.cs @@ -530,6 +530,7 @@ public override void Reset() // default to ClientToServer so this works immediately for users syncDirection = SyncDirection.ClientToServer; + NetworkTime.activeNTs = 0; // disabled objects aren't updated anymore. // so let's clear the buffers. @@ -548,8 +549,17 @@ public override void Reset() // Debug.Log($"[{name}] Reset to baselineTick=0"); } - protected virtual void OnDisable() => Reset(); - protected virtual void OnEnable() => Reset(); + protected virtual void OnEnable() + { + Reset(); + NetworkTime.activeNTs++; + } + + protected virtual void OnDisable() + { + Reset(); + NetworkTime.activeNTs--; + } public override void OnSerialize(NetworkWriter writer, bool initialState) { diff --git a/Assets/Mirror/Core/NetworkClient.cs b/Assets/Mirror/Core/NetworkClient.cs index 2a68f725633..30861a5710d 100644 --- a/Assets/Mirror/Core/NetworkClient.cs +++ b/Assets/Mirror/Core/NetworkClient.cs @@ -1595,7 +1595,8 @@ static void Broadcast() if (NetworkServer.active) return; // send time snapshot every sendInterval. - Send(new TimeSnapshotMessage(), Channels.Unreliable); + if (NetworkTime.activeNTs > 0) + Send(new TimeSnapshotMessage(), Channels.Unreliable); // broadcast client state to server BroadcastToServer(); diff --git a/Assets/Mirror/Core/NetworkConnectionToClient.cs b/Assets/Mirror/Core/NetworkConnectionToClient.cs index d80749c13ed..8e04cf9671c 100644 --- a/Assets/Mirror/Core/NetworkConnectionToClient.cs +++ b/Assets/Mirror/Core/NetworkConnectionToClient.cs @@ -136,6 +136,8 @@ protected virtual void UpdatePing() // localTime (double) instead of Time.time for accuracy over days if (NetworkTime.localTime >= lastPingTime + NetworkTime.PingInterval) { + //Debug.Log("NetworkConnectionToClient SendPing"); + // TODO it would be safer for the server to store the last N // messages' timestamp and only send a message number. // This way client's can't just modify the timestamp. diff --git a/Assets/Mirror/Core/NetworkServer.cs b/Assets/Mirror/Core/NetworkServer.cs index f70ac6f7b15..dccbc63f305 100644 --- a/Assets/Mirror/Core/NetworkServer.cs +++ b/Assets/Mirror/Core/NetworkServer.cs @@ -2019,7 +2019,8 @@ static void Broadcast() // make sure Broadcast() is only called every sendInterval, // even if targetFrameRate isn't set in host mode (!) // (done via AccurateInterval) - connection.Send(new TimeSnapshotMessage(), Channels.Unreliable); + if (NetworkTime.activeNTs > 0) + connection.Send(new TimeSnapshotMessage(), Channels.Unreliable); // broadcast world state to this connection BroadcastToConnection(connection); diff --git a/Assets/Mirror/Core/NetworkTime.cs b/Assets/Mirror/Core/NetworkTime.cs index 6319970c45b..df24b26988b 100644 --- a/Assets/Mirror/Core/NetworkTime.cs +++ b/Assets/Mirror/Core/NetworkTime.cs @@ -19,8 +19,8 @@ public static class NetworkTime /// Ping message interval, used to calculate latency / RTT and predicted time. // 2s was enough to get a good average RTT. // for prediction, we want to react to latency changes more rapidly. - const float DefaultPingInterval = 0.1f; // for resets - public static float PingInterval = DefaultPingInterval; + internal static float DefaultPingInterval = 2.0f; // internal for tests + public static float PingInterval => activeNTs > 0 ? 0.1f : DefaultPingInterval; /// Average out the last few results from Ping // const because it's used immediately in _rtt constructor. @@ -28,6 +28,8 @@ public static class NetworkTime static double lastPingTime; + internal static ulong activeNTs = 0; + static ExponentialMovingAverage _rtt = new ExponentialMovingAverage(PingWindowSize); /// Returns double precision clock time _in this system_, unaffected by the network. @@ -129,7 +131,7 @@ public static double predictedTime [RuntimeInitializeOnLoadMethod] public static void ResetStatics() { - PingInterval = DefaultPingInterval; + activeNTs = 0; lastPingTime = 0; _rtt = new ExponentialMovingAverage(PingWindowSize); #if !UNITY_2020_3_OR_NEWER @@ -147,6 +149,8 @@ internal static void UpdateClient() // Separate method so we can call it from NetworkClient directly. internal static void SendPing() { + //Debug.Log("NetworkTime SendPing"); + // send raw predicted time without the offset applied yet. // we then apply the offset to it after. NetworkPingMessage pingMessage = new NetworkPingMessage diff --git a/Assets/Mirror/Tests/Editor/NetworkConnection/NetworkConnectionToClientTests.cs b/Assets/Mirror/Tests/Editor/NetworkConnection/NetworkConnectionToClientTests.cs index 75b349c92e3..c585991dbe5 100644 --- a/Assets/Mirror/Tests/Editor/NetworkConnection/NetworkConnectionToClientTests.cs +++ b/Assets/Mirror/Tests/Editor/NetworkConnection/NetworkConnectionToClientTests.cs @@ -35,7 +35,7 @@ public void Send_BatchesUntilUpdate() { // create connection and send NetworkConnectionToClient connection = new NetworkConnectionToClient(42); - NetworkTime.PingInterval = float.MaxValue; // disable ping for this test + NetworkTime.DefaultPingInterval = float.MaxValue; // disable ping for this test byte[] message = {0x01, 0x02}; connection.Send(new ArraySegment(message)); @@ -64,7 +64,7 @@ public void SendBatchingResetsPreviousWriter() // create connection NetworkConnectionToClient connection = new NetworkConnectionToClient(42); - NetworkTime.PingInterval = float.MaxValue; // disable ping for this test + NetworkTime.DefaultPingInterval = float.MaxValue; // disable ping for this test // send and update big message byte[] message = {0x01, 0x02}; diff --git a/Assets/Mirror/Tests/Runtime/NetworkServerRuntimeTest.cs b/Assets/Mirror/Tests/Runtime/NetworkServerRuntimeTest.cs index 3587003a640..80be538aea6 100644 --- a/Assets/Mirror/Tests/Runtime/NetworkServerRuntimeTest.cs +++ b/Assets/Mirror/Tests/Runtime/NetworkServerRuntimeTest.cs @@ -87,8 +87,7 @@ NetworkIdentity SpawnPrefab(GameObject prefab) [UnityTest] public IEnumerator DisconnectTimeoutTest() { - // Set low ping frequency so no NetworkPingMessage is generated - NetworkTime.PingInterval = 5f; + NetworkTime.DefaultPingInterval = float.MaxValue; // disable ping for this test // Set a short timeout for this test and enable disconnectInactiveConnections NetworkServer.disconnectInactiveConnections = true; From 8c0d89d1f59f925cba22b36e379206928fd6dcfe Mon Sep 17 00:00:00 2001 From: MrGadget <9826063+MrGadget1024@users.noreply.github.com> Date: Sun, 9 Feb 2025 10:21:42 -0500 Subject: [PATCH 02/10] Reset DefaultPingInterval --- Assets/Mirror/Core/NetworkTime.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Assets/Mirror/Core/NetworkTime.cs b/Assets/Mirror/Core/NetworkTime.cs index df24b26988b..7731fde96de 100644 --- a/Assets/Mirror/Core/NetworkTime.cs +++ b/Assets/Mirror/Core/NetworkTime.cs @@ -131,6 +131,7 @@ public static double predictedTime [RuntimeInitializeOnLoadMethod] public static void ResetStatics() { + DefaultPingInterval = 2.0f; activeNTs = 0; lastPingTime = 0; _rtt = new ExponentialMovingAverage(PingWindowSize); From 171b74c66b4fdc5df7b9b4374a464fd831aebb9c Mon Sep 17 00:00:00 2001 From: MrGadget <9826063+MrGadget1024@users.noreply.github.com> Date: Sun, 9 Feb 2025 12:43:10 -0500 Subject: [PATCH 03/10] PredictedRigidbody too --- .../PredictedRigidbody/PredictedRigidbody.cs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Assets/Mirror/Components/PredictedRigidbody/PredictedRigidbody.cs b/Assets/Mirror/Components/PredictedRigidbody/PredictedRigidbody.cs index 02abda30781..e8d0e287fc1 100644 --- a/Assets/Mirror/Components/PredictedRigidbody/PredictedRigidbody.cs +++ b/Assets/Mirror/Components/PredictedRigidbody/PredictedRigidbody.cs @@ -145,6 +145,16 @@ protected virtual void Awake() positionCorrectionThresholdSqr = positionCorrectionThreshold * positionCorrectionThreshold; } + protected virtual void OnEnable() + { + NetworkTime.activeNTs++; + } + + protected virtual void OnDisable() + { + NetworkTime.activeNTs--; + } + protected virtual void CopyRenderersAsGhost(GameObject destination, Material material) { // find the MeshRenderer component, which sometimes is on a child. From 03932e994441d4dc79996b0d1cb0e23b162dd354 Mon Sep 17 00:00:00 2001 From: MrGadget <9826063+MrGadget1024@users.noreply.github.com> Date: Wed, 12 Feb 2025 02:28:36 -0500 Subject: [PATCH 04/10] Better naming and comments --- .../NetworkTransform/NetworkTransformBase.cs | 6 +++--- .../NetworkTransformHybrid.cs | 6 +++--- .../PredictedRigidbody/PredictedRigidbody.cs | 4 ++-- Assets/Mirror/Core/NetworkClient.cs | 2 +- Assets/Mirror/Core/NetworkServer.cs | 2 +- Assets/Mirror/Core/NetworkTime.cs | 19 +++++++++++-------- .../NetworkConnectionToClientTests.cs | 4 ++-- .../Tests/Runtime/NetworkServerRuntimeTest.cs | 2 +- 8 files changed, 24 insertions(+), 21 deletions(-) diff --git a/Assets/Mirror/Components/NetworkTransform/NetworkTransformBase.cs b/Assets/Mirror/Components/NetworkTransform/NetworkTransformBase.cs index ca49e83daf0..52c1fc7d8d7 100644 --- a/Assets/Mirror/Components/NetworkTransform/NetworkTransformBase.cs +++ b/Assets/Mirror/Components/NetworkTransform/NetworkTransformBase.cs @@ -434,13 +434,13 @@ public virtual void Reset() ResetState(); // default to ClientToServer so this works immediately for users syncDirection = SyncDirection.ClientToServer; - NetworkTime.activeNTs = 0; + NetworkTime.highPingComponents = 0; } protected virtual void OnEnable() { ResetState(); - NetworkTime.activeNTs++; + NetworkTime.highPingComponents++; if (NetworkServer.active) NetworkIdentity.clientAuthorityCallback += OnClientAuthorityChanged; @@ -449,7 +449,7 @@ protected virtual void OnEnable() protected virtual void OnDisable() { ResetState(); - NetworkTime.activeNTs--; + NetworkTime.highPingComponents--; if (NetworkServer.active) NetworkIdentity.clientAuthorityCallback -= OnClientAuthorityChanged; diff --git a/Assets/Mirror/Components/NetworkTransform/NetworkTransformHybrid.cs b/Assets/Mirror/Components/NetworkTransform/NetworkTransformHybrid.cs index 36a29d6c3f2..b2fc69136c6 100644 --- a/Assets/Mirror/Components/NetworkTransform/NetworkTransformHybrid.cs +++ b/Assets/Mirror/Components/NetworkTransform/NetworkTransformHybrid.cs @@ -530,7 +530,7 @@ public override void Reset() // default to ClientToServer so this works immediately for users syncDirection = SyncDirection.ClientToServer; - NetworkTime.activeNTs = 0; + NetworkTime.highPingComponents = 0; // disabled objects aren't updated anymore. // so let's clear the buffers. @@ -552,13 +552,13 @@ public override void Reset() protected virtual void OnEnable() { Reset(); - NetworkTime.activeNTs++; + NetworkTime.highPingComponents++; } protected virtual void OnDisable() { Reset(); - NetworkTime.activeNTs--; + NetworkTime.highPingComponents--; } public override void OnSerialize(NetworkWriter writer, bool initialState) diff --git a/Assets/Mirror/Components/PredictedRigidbody/PredictedRigidbody.cs b/Assets/Mirror/Components/PredictedRigidbody/PredictedRigidbody.cs index e8d0e287fc1..ab3c0144e0b 100644 --- a/Assets/Mirror/Components/PredictedRigidbody/PredictedRigidbody.cs +++ b/Assets/Mirror/Components/PredictedRigidbody/PredictedRigidbody.cs @@ -147,12 +147,12 @@ protected virtual void Awake() protected virtual void OnEnable() { - NetworkTime.activeNTs++; + NetworkTime.highPingComponents++; } protected virtual void OnDisable() { - NetworkTime.activeNTs--; + NetworkTime.highPingComponents--; } protected virtual void CopyRenderersAsGhost(GameObject destination, Material material) diff --git a/Assets/Mirror/Core/NetworkClient.cs b/Assets/Mirror/Core/NetworkClient.cs index 30861a5710d..5b408b5feb7 100644 --- a/Assets/Mirror/Core/NetworkClient.cs +++ b/Assets/Mirror/Core/NetworkClient.cs @@ -1595,7 +1595,7 @@ static void Broadcast() if (NetworkServer.active) return; // send time snapshot every sendInterval. - if (NetworkTime.activeNTs > 0) + if (NetworkTime.highPingComponents > 0) Send(new TimeSnapshotMessage(), Channels.Unreliable); // broadcast client state to server diff --git a/Assets/Mirror/Core/NetworkServer.cs b/Assets/Mirror/Core/NetworkServer.cs index dccbc63f305..3e1fc829a92 100644 --- a/Assets/Mirror/Core/NetworkServer.cs +++ b/Assets/Mirror/Core/NetworkServer.cs @@ -2019,7 +2019,7 @@ static void Broadcast() // make sure Broadcast() is only called every sendInterval, // even if targetFrameRate isn't set in host mode (!) // (done via AccurateInterval) - if (NetworkTime.activeNTs > 0) + if (NetworkTime.highPingComponents > 0) connection.Send(new TimeSnapshotMessage(), Channels.Unreliable); // broadcast world state to this connection diff --git a/Assets/Mirror/Core/NetworkTime.cs b/Assets/Mirror/Core/NetworkTime.cs index 7731fde96de..4611c2648c8 100644 --- a/Assets/Mirror/Core/NetworkTime.cs +++ b/Assets/Mirror/Core/NetworkTime.cs @@ -16,11 +16,16 @@ namespace Mirror /// Synchronizes server time to clients. public static class NetworkTime { + // Incremented / decremented by components that need higher ping frequency. + // Also used to determine if we need to send TimeSnapshotMessage by + // NetworkServer and NetworkClient. + internal static ulong highPingComponents = 0; + /// Ping message interval, used to calculate latency / RTT and predicted time. - // 2s was enough to get a good average RTT. - // for prediction, we want to react to latency changes more rapidly. - internal static float DefaultPingInterval = 2.0f; // internal for tests - public static float PingInterval => activeNTs > 0 ? 0.1f : DefaultPingInterval; + // 2s is enough to get a good average RTT. + // For snapshot interpolation and prediction, we need to react to latency changes more rapidly. + internal static float defaultPingInterval = 2.0f; // internal for tests + public static float PingInterval => highPingComponents > 0 ? 0.1f : defaultPingInterval; /// Average out the last few results from Ping // const because it's used immediately in _rtt constructor. @@ -28,8 +33,6 @@ public static class NetworkTime static double lastPingTime; - internal static ulong activeNTs = 0; - static ExponentialMovingAverage _rtt = new ExponentialMovingAverage(PingWindowSize); /// Returns double precision clock time _in this system_, unaffected by the network. @@ -131,8 +134,8 @@ public static double predictedTime [RuntimeInitializeOnLoadMethod] public static void ResetStatics() { - DefaultPingInterval = 2.0f; - activeNTs = 0; + defaultPingInterval = 2.0f; + highPingComponents = 0; lastPingTime = 0; _rtt = new ExponentialMovingAverage(PingWindowSize); #if !UNITY_2020_3_OR_NEWER diff --git a/Assets/Mirror/Tests/Editor/NetworkConnection/NetworkConnectionToClientTests.cs b/Assets/Mirror/Tests/Editor/NetworkConnection/NetworkConnectionToClientTests.cs index c585991dbe5..1b6c59ed86f 100644 --- a/Assets/Mirror/Tests/Editor/NetworkConnection/NetworkConnectionToClientTests.cs +++ b/Assets/Mirror/Tests/Editor/NetworkConnection/NetworkConnectionToClientTests.cs @@ -35,7 +35,7 @@ public void Send_BatchesUntilUpdate() { // create connection and send NetworkConnectionToClient connection = new NetworkConnectionToClient(42); - NetworkTime.DefaultPingInterval = float.MaxValue; // disable ping for this test + NetworkTime.defaultPingInterval = float.MaxValue; // disable ping for this test byte[] message = {0x01, 0x02}; connection.Send(new ArraySegment(message)); @@ -64,7 +64,7 @@ public void SendBatchingResetsPreviousWriter() // create connection NetworkConnectionToClient connection = new NetworkConnectionToClient(42); - NetworkTime.DefaultPingInterval = float.MaxValue; // disable ping for this test + NetworkTime.defaultPingInterval = float.MaxValue; // disable ping for this test // send and update big message byte[] message = {0x01, 0x02}; diff --git a/Assets/Mirror/Tests/Runtime/NetworkServerRuntimeTest.cs b/Assets/Mirror/Tests/Runtime/NetworkServerRuntimeTest.cs index 80be538aea6..0fcca35a9e0 100644 --- a/Assets/Mirror/Tests/Runtime/NetworkServerRuntimeTest.cs +++ b/Assets/Mirror/Tests/Runtime/NetworkServerRuntimeTest.cs @@ -87,7 +87,7 @@ NetworkIdentity SpawnPrefab(GameObject prefab) [UnityTest] public IEnumerator DisconnectTimeoutTest() { - NetworkTime.DefaultPingInterval = float.MaxValue; // disable ping for this test + NetworkTime.defaultPingInterval = float.MaxValue; // disable ping for this test // Set a short timeout for this test and enable disconnectInactiveConnections NetworkServer.disconnectInactiveConnections = true; From 8a1ed700f061d01603cc708b219102afaa60a575 Mon Sep 17 00:00:00 2001 From: MrGadget <9826063+MrGadget1024@users.noreply.github.com> Date: Wed, 12 Feb 2025 02:34:39 -0500 Subject: [PATCH 05/10] Added const highPingInterval --- Assets/Mirror/Core/NetworkTime.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Assets/Mirror/Core/NetworkTime.cs b/Assets/Mirror/Core/NetworkTime.cs index 4611c2648c8..058677440c7 100644 --- a/Assets/Mirror/Core/NetworkTime.cs +++ b/Assets/Mirror/Core/NetworkTime.cs @@ -20,12 +20,13 @@ public static class NetworkTime // Also used to determine if we need to send TimeSnapshotMessage by // NetworkServer and NetworkClient. internal static ulong highPingComponents = 0; + const float highPingInterval = 0.1f; /// Ping message interval, used to calculate latency / RTT and predicted time. // 2s is enough to get a good average RTT. // For snapshot interpolation and prediction, we need to react to latency changes more rapidly. internal static float defaultPingInterval = 2.0f; // internal for tests - public static float PingInterval => highPingComponents > 0 ? 0.1f : defaultPingInterval; + public static float PingInterval => highPingComponents > 0 ? highPingInterval : defaultPingInterval; /// Average out the last few results from Ping // const because it's used immediately in _rtt constructor. From 5bd6ded444772267c44eed0afebb416eebb3368b Mon Sep 17 00:00:00 2001 From: MrGadget <9826063+MrGadget1024@users.noreply.github.com> Date: Wed, 12 Feb 2025 02:45:23 -0500 Subject: [PATCH 06/10] Use 0UL --- Assets/Mirror/Core/NetworkTime.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Assets/Mirror/Core/NetworkTime.cs b/Assets/Mirror/Core/NetworkTime.cs index 058677440c7..24af31590e3 100644 --- a/Assets/Mirror/Core/NetworkTime.cs +++ b/Assets/Mirror/Core/NetworkTime.cs @@ -19,7 +19,7 @@ public static class NetworkTime // Incremented / decremented by components that need higher ping frequency. // Also used to determine if we need to send TimeSnapshotMessage by // NetworkServer and NetworkClient. - internal static ulong highPingComponents = 0; + internal static ulong highPingComponents = 0UL; const float highPingInterval = 0.1f; /// Ping message interval, used to calculate latency / RTT and predicted time. From b6fef3a92687da0981dfb178350cdc6b3058b55b Mon Sep 17 00:00:00 2001 From: MrGadget <9826063+MrGadget1024@users.noreply.github.com> Date: Wed, 12 Feb 2025 02:45:41 -0500 Subject: [PATCH 07/10] Prevent wraparound --- .../Components/NetworkTransform/NetworkTransformBase.cs | 4 +++- .../Components/NetworkTransform/NetworkTransformHybrid.cs | 4 +++- .../Components/PredictedRigidbody/PredictedRigidbody.cs | 3 ++- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/Assets/Mirror/Components/NetworkTransform/NetworkTransformBase.cs b/Assets/Mirror/Components/NetworkTransform/NetworkTransformBase.cs index 52c1fc7d8d7..02bc400ba64 100644 --- a/Assets/Mirror/Components/NetworkTransform/NetworkTransformBase.cs +++ b/Assets/Mirror/Components/NetworkTransform/NetworkTransformBase.cs @@ -449,7 +449,9 @@ protected virtual void OnEnable() protected virtual void OnDisable() { ResetState(); - NetworkTime.highPingComponents--; + + if (NetworkTime.highPingComponents > 0UL) + NetworkTime.highPingComponents--; if (NetworkServer.active) NetworkIdentity.clientAuthorityCallback -= OnClientAuthorityChanged; diff --git a/Assets/Mirror/Components/NetworkTransform/NetworkTransformHybrid.cs b/Assets/Mirror/Components/NetworkTransform/NetworkTransformHybrid.cs index b2fc69136c6..a2f89b70e5d 100644 --- a/Assets/Mirror/Components/NetworkTransform/NetworkTransformHybrid.cs +++ b/Assets/Mirror/Components/NetworkTransform/NetworkTransformHybrid.cs @@ -558,7 +558,9 @@ protected virtual void OnEnable() protected virtual void OnDisable() { Reset(); - NetworkTime.highPingComponents--; + + if (NetworkTime.highPingComponents > 0UL) + NetworkTime.highPingComponents--; } public override void OnSerialize(NetworkWriter writer, bool initialState) diff --git a/Assets/Mirror/Components/PredictedRigidbody/PredictedRigidbody.cs b/Assets/Mirror/Components/PredictedRigidbody/PredictedRigidbody.cs index ab3c0144e0b..d3a61e6d975 100644 --- a/Assets/Mirror/Components/PredictedRigidbody/PredictedRigidbody.cs +++ b/Assets/Mirror/Components/PredictedRigidbody/PredictedRigidbody.cs @@ -152,7 +152,8 @@ protected virtual void OnEnable() protected virtual void OnDisable() { - NetworkTime.highPingComponents--; + if (NetworkTime.highPingComponents > 0UL) + NetworkTime.highPingComponents--; } protected virtual void CopyRenderersAsGhost(GameObject destination, Material material) From c8b71875403921bd78bafcf328280f9046cc5c05 Mon Sep 17 00:00:00 2001 From: MrGadget <9826063+MrGadget1024@users.noreply.github.com> Date: Wed, 12 Feb 2025 02:47:56 -0500 Subject: [PATCH 08/10] Use 0UL --- .../Components/NetworkTransform/NetworkTransformBase.cs | 2 +- .../Components/NetworkTransform/NetworkTransformHybrid.cs | 2 +- Assets/Mirror/Core/NetworkClient.cs | 2 +- Assets/Mirror/Core/NetworkServer.cs | 2 +- Assets/Mirror/Core/NetworkTime.cs | 4 ++-- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Assets/Mirror/Components/NetworkTransform/NetworkTransformBase.cs b/Assets/Mirror/Components/NetworkTransform/NetworkTransformBase.cs index 02bc400ba64..7716584f24f 100644 --- a/Assets/Mirror/Components/NetworkTransform/NetworkTransformBase.cs +++ b/Assets/Mirror/Components/NetworkTransform/NetworkTransformBase.cs @@ -434,7 +434,7 @@ public virtual void Reset() ResetState(); // default to ClientToServer so this works immediately for users syncDirection = SyncDirection.ClientToServer; - NetworkTime.highPingComponents = 0; + NetworkTime.highPingComponents = 0UL; } protected virtual void OnEnable() diff --git a/Assets/Mirror/Components/NetworkTransform/NetworkTransformHybrid.cs b/Assets/Mirror/Components/NetworkTransform/NetworkTransformHybrid.cs index a2f89b70e5d..642d64f2fa3 100644 --- a/Assets/Mirror/Components/NetworkTransform/NetworkTransformHybrid.cs +++ b/Assets/Mirror/Components/NetworkTransform/NetworkTransformHybrid.cs @@ -530,7 +530,7 @@ public override void Reset() // default to ClientToServer so this works immediately for users syncDirection = SyncDirection.ClientToServer; - NetworkTime.highPingComponents = 0; + NetworkTime.highPingComponents = 0UL; // disabled objects aren't updated anymore. // so let's clear the buffers. diff --git a/Assets/Mirror/Core/NetworkClient.cs b/Assets/Mirror/Core/NetworkClient.cs index 5b408b5feb7..d23527a1739 100644 --- a/Assets/Mirror/Core/NetworkClient.cs +++ b/Assets/Mirror/Core/NetworkClient.cs @@ -1595,7 +1595,7 @@ static void Broadcast() if (NetworkServer.active) return; // send time snapshot every sendInterval. - if (NetworkTime.highPingComponents > 0) + if (NetworkTime.highPingComponents > 0UL) Send(new TimeSnapshotMessage(), Channels.Unreliable); // broadcast client state to server diff --git a/Assets/Mirror/Core/NetworkServer.cs b/Assets/Mirror/Core/NetworkServer.cs index 3e1fc829a92..968784822e5 100644 --- a/Assets/Mirror/Core/NetworkServer.cs +++ b/Assets/Mirror/Core/NetworkServer.cs @@ -2019,7 +2019,7 @@ static void Broadcast() // make sure Broadcast() is only called every sendInterval, // even if targetFrameRate isn't set in host mode (!) // (done via AccurateInterval) - if (NetworkTime.highPingComponents > 0) + if (NetworkTime.highPingComponents > 0UL) connection.Send(new TimeSnapshotMessage(), Channels.Unreliable); // broadcast world state to this connection diff --git a/Assets/Mirror/Core/NetworkTime.cs b/Assets/Mirror/Core/NetworkTime.cs index 24af31590e3..02de2609095 100644 --- a/Assets/Mirror/Core/NetworkTime.cs +++ b/Assets/Mirror/Core/NetworkTime.cs @@ -26,7 +26,7 @@ public static class NetworkTime // 2s is enough to get a good average RTT. // For snapshot interpolation and prediction, we need to react to latency changes more rapidly. internal static float defaultPingInterval = 2.0f; // internal for tests - public static float PingInterval => highPingComponents > 0 ? highPingInterval : defaultPingInterval; + public static float PingInterval => highPingComponents > 0UL ? highPingInterval : defaultPingInterval; /// Average out the last few results from Ping // const because it's used immediately in _rtt constructor. @@ -136,7 +136,7 @@ public static double predictedTime public static void ResetStatics() { defaultPingInterval = 2.0f; - highPingComponents = 0; + highPingComponents = 0UL; lastPingTime = 0; _rtt = new ExponentialMovingAverage(PingWindowSize); #if !UNITY_2020_3_OR_NEWER From a87ddedf9b34159e7e9dd7cdc8860259d46c3868 Mon Sep 17 00:00:00 2001 From: MrGadget <9826063+MrGadget1024@users.noreply.github.com> Date: Thu, 3 Apr 2025 07:29:55 -0400 Subject: [PATCH 09/10] Resolve Conflicts --- .../NetworkTransformHybrid.cs | 31 ------------------- 1 file changed, 31 deletions(-) diff --git a/Assets/Mirror/Components/NetworkTransform/NetworkTransformHybrid.cs b/Assets/Mirror/Components/NetworkTransform/NetworkTransformHybrid.cs index f289dbd0bc5..740fac6ae4d 100644 --- a/Assets/Mirror/Components/NetworkTransform/NetworkTransformHybrid.cs +++ b/Assets/Mirror/Components/NetworkTransform/NetworkTransformHybrid.cs @@ -220,37 +220,6 @@ public override void OnSerialize(NetworkWriter writer, bool initialState) // Debug.Log($"NT OnSerialize: initial={initialState} method={syncMethod}"); - lastDeserializedBaselinePosition = Vector3.zero; - lastDeserializedBaselineRotation = Quaternion.identity; - lastDeserializedBaselineScale = Vector3.one; - - // Debug.Log($"[{name}] Reset to baselineTick=0"); - } - - protected virtual void OnEnable() - { - Reset(); - NetworkTime.highPingComponents++; - } - - protected virtual void OnDisable() - { - Reset(); - - if (NetworkTime.highPingComponents > 0UL) - NetworkTime.highPingComponents--; - } - - public override void OnSerialize(NetworkWriter writer, bool initialState) - { - // OnSerialize(initial) is called every time when a player starts observing us. - // note this is _not_ called just once on spawn. - - base.OnSerialize(writer, initialState); // NetworkBehaviourHybrid - - // sync target component's position on spawn. - // fixes https://github.com/vis2k/Mirror/pull/3051/ - // (Spawn message wouldn't sync NTChild positions either) // reliable full state if (initialState) { From d6002fdd770f1da37de7363fc90dd2620cc1bfca Mon Sep 17 00:00:00 2001 From: MrGadget <9826063+MrGadget1024@users.noreply.github.com> Date: Thu, 3 Apr 2025 07:31:58 -0400 Subject: [PATCH 10/10] Resolve Conflicts --- .../Components/NetworkTransform/NetworkTransformHybrid.cs | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Assets/Mirror/Components/NetworkTransform/NetworkTransformHybrid.cs b/Assets/Mirror/Components/NetworkTransform/NetworkTransformHybrid.cs index 740fac6ae4d..f66a67cbe29 100644 --- a/Assets/Mirror/Components/NetworkTransform/NetworkTransformHybrid.cs +++ b/Assets/Mirror/Components/NetworkTransform/NetworkTransformHybrid.cs @@ -204,10 +204,6 @@ public override void OnSerialize(NetworkWriter writer, bool initialState) // get current snapshot for broadcasting. TransformSnapshot snapshot = Construct(); - // default to ClientToServer so this works immediately for users - syncDirection = SyncDirection.ClientToServer; - NetworkTime.highPingComponents = 0UL; - // ClientToServer optimization: // for interpolated client owned identities, // always broadcast the latest known snapshot so other clients can