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