Skip to content

Commit bf8929c

Browse files
ShadauxCat0xFA11
andauthored
feat: time mocking (#2472)
* feat: time mocking * time mocking in NetworkTransformTests * More mocks. * Disable LogAllMessages in DeferredMessagingTests * Standards * Allow UnityTransport to create its own IRealTimeProvider if no NetworkManager is provided to it. * XMLDoc updates * Changed IRealTimeProvider to internal --------- Co-authored-by: Fatih Mar <[email protected]>
1 parent f1527c7 commit bf8929c

28 files changed

+1231
-505
lines changed

com.unity.netcode.gameobjects/Components/NetworkTransform.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2626,7 +2626,7 @@ protected virtual void Update()
26262626
if (Interpolate)
26272627
{
26282628
var serverTime = NetworkManager.ServerTime;
2629-
var cachedDeltaTime = Time.deltaTime;
2629+
var cachedDeltaTime = NetworkManager.RealTimeProvider.DeltaTime;
26302630
var cachedServerTime = serverTime.Time;
26312631
// TODO: Investigate Further
26322632
// With owner authoritative mode, non-authority clients can lag behind
@@ -2705,4 +2705,3 @@ internal interface INetworkTransformLogStateEntry
27052705
void AddLogEntry(NetworkTransform.NetworkTransformState networkTransformState, ulong targetClient, bool preUpdate = false);
27062706
}
27072707
}
2708-

com.unity.netcode.gameobjects/Runtime/Core/ComponentFactory.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ public static void Deregister<T>()
5252
public static void SetDefaults()
5353
{
5454
SetDefault<IDeferredMessageManager>(networkManager => new DeferredMessageManager(networkManager));
55+
56+
SetDefault<IRealTimeProvider>(networkManager => new RealTimeProvider());
5557
}
5658

5759
private static void SetDefault<T>(CreateObjectDelegate creator)

com.unity.netcode.gameobjects/Runtime/Core/NetworkBehaviour.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ internal void __endSendServerRpc(ref FastBufferWriter bufferWriter, uint rpcMeth
8282
var context = new NetworkContext
8383
{
8484
SenderId = NetworkManager.ServerClientId,
85-
Timestamp = Time.realtimeSinceStartup,
85+
Timestamp = NetworkManager.RealTimeProvider.RealTimeSinceStartup,
8686
SystemOwner = NetworkManager,
8787
// header information isn't valid since it's not a real message.
8888
// RpcMessage doesn't access this stuff so it's just left empty.
@@ -219,7 +219,7 @@ internal void __endSendClientRpc(ref FastBufferWriter bufferWriter, uint rpcMeth
219219
var context = new NetworkContext
220220
{
221221
SenderId = NetworkManager.ServerClientId,
222-
Timestamp = Time.realtimeSinceStartup,
222+
Timestamp = NetworkManager.RealTimeProvider.RealTimeSinceStartup,
223223
SystemOwner = NetworkManager,
224224
// header information isn't valid since it's not a real message.
225225
// RpcMessage doesn't access this stuff so it's just left empty.

com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,8 @@ public GameObject GetNetworkPrefabOverride(GameObject gameObject)
298298

299299
internal IDeferredMessageManager DeferredMessageManager { get; private set; }
300300

301+
internal IRealTimeProvider RealTimeProvider { get; private set; }
302+
301303
/// <summary>
302304
/// Gets the CustomMessagingManager for this NetworkManager
303305
/// </summary>
@@ -753,6 +755,8 @@ internal void Initialize(bool server)
753755

754756
DeferredMessageManager = ComponentFactory.Create<IDeferredMessageManager>(this);
755757

758+
RealTimeProvider = ComponentFactory.Create<IRealTimeProvider>(this);
759+
756760
CustomMessagingManager = new CustomMessagingManager(this);
757761

758762
SceneManager = new NetworkSceneManager(this);
@@ -1459,7 +1463,7 @@ private void OnNetworkPreUpdate()
14591463
}
14601464

14611465
// Only update RTT here, server time is updated by time sync messages
1462-
var reset = NetworkTimeSystem.Advance(Time.unscaledDeltaTime);
1466+
var reset = NetworkTimeSystem.Advance(RealTimeProvider.UnscaledDeltaTime);
14631467
if (reset)
14641468
{
14651469
NetworkTickSystem.Reset(NetworkTimeSystem.LocalTime, NetworkTimeSystem.ServerTime);
@@ -1468,7 +1472,7 @@ private void OnNetworkPreUpdate()
14681472

14691473
if (IsServer == false)
14701474
{
1471-
NetworkTimeSystem.Sync(NetworkTimeSystem.LastSyncedServerTimeSec + Time.unscaledDeltaTime, NetworkConfig.NetworkTransport.GetCurrentRtt(ServerClientId) / 1000d);
1475+
NetworkTimeSystem.Sync(NetworkTimeSystem.LastSyncedServerTimeSec + RealTimeProvider.UnscaledDeltaTime, NetworkConfig.NetworkTransport.GetCurrentRtt(ServerClientId) / 1000d);
14721476
}
14731477
}
14741478

@@ -1554,7 +1558,7 @@ private void SendConnectionRequest()
15541558

15551559
private IEnumerator ApprovalTimeout(ulong clientId)
15561560
{
1557-
var timeStarted = IsServer ? LocalTime.TimeAsFloat : Time.realtimeSinceStartup;
1561+
var timeStarted = IsServer ? LocalTime.TimeAsFloat : RealTimeProvider.RealTimeSinceStartup;
15581562
var timedOut = false;
15591563
var connectionApproved = false;
15601564
var connectionNotApproved = false;
@@ -1564,7 +1568,7 @@ private IEnumerator ApprovalTimeout(ulong clientId)
15641568
{
15651569
yield return null;
15661570
// Check if we timed out
1567-
timedOut = timeoutMarker < (IsServer ? LocalTime.TimeAsFloat : Time.realtimeSinceStartup);
1571+
timedOut = timeoutMarker < (IsServer ? LocalTime.TimeAsFloat : RealTimeProvider.RealTimeSinceStartup);
15681572

15691573
if (IsServer)
15701574
{

com.unity.netcode.gameobjects/Runtime/Core/NetworkUpdateLoop.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ public static void UnregisterNetworkUpdate(this INetworkUpdateSystem updateSyste
167167
/// </summary>
168168
public static NetworkUpdateStage UpdateStage;
169169

170-
private static void RunNetworkUpdateStage(NetworkUpdateStage updateStage)
170+
internal static void RunNetworkUpdateStage(NetworkUpdateStage updateStage)
171171
{
172172
UpdateStage = updateStage;
173173

com.unity.netcode.gameobjects/Runtime/Messaging/DeferredMessageManager.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
using System.Collections.Generic;
22
using Unity.Collections;
3-
using Time = UnityEngine.Time;
43

54
namespace Unity.Netcode
65
{
@@ -49,7 +48,7 @@ public virtual unsafe void DeferMessage(IDeferredMessageManager.TriggerType trig
4948
{
5049
triggerInfo = new TriggerInfo
5150
{
52-
Expiry = Time.realtimeSinceStartup + m_NetworkManager.NetworkConfig.SpawnTimeout,
51+
Expiry = m_NetworkManager.RealTimeProvider.RealTimeSinceStartup + m_NetworkManager.NetworkConfig.SpawnTimeout,
5352
TriggerData = new NativeList<TriggerData>(Allocator.Persistent)
5453
};
5554
triggers[key] = triggerInfo;
@@ -77,7 +76,7 @@ public virtual unsafe void CleanupStaleTriggers()
7776
int index = 0;
7877
foreach (var kvp2 in kvp.Value)
7978
{
80-
if (kvp2.Value.Expiry < Time.realtimeSinceStartup)
79+
if (kvp2.Value.Expiry < m_NetworkManager.RealTimeProvider.RealTimeSinceStartup)
8180
{
8281
staleKeys[index++] = kvp2.Key;
8382
PurgeTrigger(kvp.Key, kvp2.Key, kvp2.Value);

com.unity.netcode.gameobjects/Runtime/SceneManagement/SceneEventProgress.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ internal class SceneEventProgress
8383
/// </summary>
8484
internal bool HasTimedOut()
8585
{
86-
return WhenSceneEventHasTimedOut <= Time.realtimeSinceStartup;
86+
return WhenSceneEventHasTimedOut <= m_NetworkManager.RealTimeProvider.RealTimeSinceStartup;
8787
}
8888

8989
/// <summary>
@@ -164,7 +164,7 @@ internal SceneEventProgress(NetworkManager networkManager, SceneEventProgressSta
164164
ClientsProcessingSceneEvent.Add(connectedClientId, false);
165165
}
166166

167-
WhenSceneEventHasTimedOut = Time.realtimeSinceStartup + networkManager.NetworkConfig.LoadSceneTimeOut;
167+
WhenSceneEventHasTimedOut = networkManager.RealTimeProvider.RealTimeSinceStartup + networkManager.NetworkConfig.LoadSceneTimeOut;
168168
m_TimeOutCoroutine = m_NetworkManager.StartCoroutine(TimeOutSceneEventProgress());
169169
}
170170
}

com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ internal NetworkSpawnManager(NetworkManager networkManager)
154154

155155
internal ulong GetNetworkObjectId()
156156
{
157-
if (ReleasedNetworkObjectIds.Count > 0 && NetworkManager.NetworkConfig.RecycleNetworkIds && (Time.unscaledTime - ReleasedNetworkObjectIds.Peek().ReleaseTime) >= NetworkManager.NetworkConfig.NetworkIdRecycleDelay)
157+
if (ReleasedNetworkObjectIds.Count > 0 && NetworkManager.NetworkConfig.RecycleNetworkIds && (NetworkManager.RealTimeProvider.UnscaledTime - ReleasedNetworkObjectIds.Peek().ReleaseTime) >= NetworkManager.NetworkConfig.NetworkIdRecycleDelay)
158158
{
159159
return ReleasedNetworkObjectIds.Dequeue().NetworkId;
160160
}
@@ -857,7 +857,7 @@ internal void OnDespawnObject(NetworkObject networkObject, bool destroyGameObjec
857857
ReleasedNetworkObjectIds.Enqueue(new ReleasedNetworkId()
858858
{
859859
NetworkId = networkObject.NetworkObjectId,
860-
ReleaseTime = Time.unscaledTime
860+
ReleaseTime = NetworkManager.RealTimeProvider.UnscaledTime
861861
});
862862
}
863863

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
namespace Unity.Netcode
2+
{
3+
internal interface IRealTimeProvider
4+
{
5+
float RealTimeSinceStartup { get; }
6+
float UnscaledTime { get; }
7+
float UnscaledDeltaTime { get; }
8+
float DeltaTime { get; }
9+
}
10+
}

com.unity.netcode.gameobjects/Runtime/Timing/IRealTimeProvider.cs.meta

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)