Skip to content

Commit 690cabb

Browse files
committed
Cached NetworkManager instead of lazy instantiation
1 parent e02e462 commit 690cabb

File tree

4 files changed

+33
-20
lines changed

4 files changed

+33
-20
lines changed

com.unity.netcode.gameobjects/Runtime/Components/NetworkAnimator.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,7 @@ internal void DeregisterUpdate()
194194
internal NetworkAnimatorStateChangeHandler(NetworkAnimator networkAnimator)
195195
{
196196
m_NetworkAnimator = networkAnimator;
197+
// TODO can we use m_LocalNetworkManager here or other cached var?
197198
m_IsServer = networkAnimator.NetworkManager.IsServer;
198199
NetworkUpdateLoop.RegisterNetworkUpdate(this, NetworkUpdateStage.PreUpdate);
199200
}
@@ -1505,7 +1506,7 @@ internal void UpdateAnimationState(AnimationState animationState)
15051506
}
15061507
}
15071508
// For reference, it is valid to have no transition information
1508-
//else if (NetworkManager.LogLevel == LogLevel.Developer)
1509+
//else if (m_LocalNetworkManager.LogLevel == LogLevel.Developer)
15091510
//{
15101511
// NetworkLog.LogError($"[DestinationState To Transition Info] Layer ({animationState.Layer}) does not exist!");
15111512
//}

com.unity.netcode.gameobjects/Runtime/Components/NetworkRigidBodyBase.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -971,6 +971,7 @@ protected override void OnOwnershipChanged(ulong previous, ulong current)
971971
/// </remarks>
972972
internal void UpdateOwnershipAuthority()
973973
{
974+
// TODO do we have a cached NetworkManager here? Should we create one?
974975
if (NetworkManager.DistributedAuthorityMode)
975976
{
976977
// When in distributed authority mode, always use HasAuthority
@@ -980,6 +981,7 @@ internal void UpdateOwnershipAuthority()
980981
{
981982
if (NetworkTransform.IsServerAuthoritative())
982983
{
984+
// TODO do we have a cached NetworkManager here? Should we create one
983985
m_IsAuthority = NetworkManager.IsServer;
984986
}
985987
else
@@ -997,6 +999,7 @@ internal void UpdateOwnershipAuthority()
997999
/// <inheritdoc />
9981000
public override void OnNetworkSpawn()
9991001
{
1002+
// TODO do we have a cached NetworkManager here? Should we create one
10001003
m_TickFrequency = 1.0f / NetworkManager.NetworkConfig.TickRate;
10011004
m_TickRate = NetworkManager.NetworkConfig.TickRate;
10021005
UpdateOwnershipAuthority();

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

Lines changed: 23 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1619,7 +1619,7 @@ internal bool SynchronizeScale
16191619
public bool CanCommitToTransform { get; protected set; }
16201620

16211621
/// <summary>
1622-
/// Internally used by <see cref="NetworkTransform"/> to keep track of the <see cref="NetworkManager"/> instance assigned to this
1622+
/// Internally used by <see cref="NetworkTransform"/> to keep track of the <see cref="NetworkManager"/> instance assigned to
16231623
/// this <see cref="NetworkBehaviour"/> derived class instance.
16241624
/// </summary>
16251625
protected NetworkManager m_CachedNetworkManager;
@@ -1850,6 +1850,7 @@ private bool ShouldSynchronizeHalfFloat(ulong targetClientId)
18501850
if (!IsServerAuthoritative() && NetworkObject.OwnerClientId == targetClientId)
18511851
{
18521852
// In distributed authority mode we want to synchronize the half float if we are the owner.
1853+
// TODO do we have a cached NetworkManager here? Should we create one?
18531854
return (!NetworkManager.DistributedAuthorityMode && NetworkObject.IsOwnedByServer) || (NetworkManager.DistributedAuthorityMode);
18541855
}
18551856
return true;
@@ -2092,12 +2093,14 @@ internal bool ApplyTransformToNetworkState(ref NetworkTransformState networkStat
20922093
return CheckForStateChange(ref networkState);
20932094
}
20942095

2096+
//private int m_CachedTickRateValue;
20952097
/// <summary>
20962098
/// Applies the transform to the <see cref="NetworkTransformState"/> specified.
20972099
/// </summary>
20982100
[MethodImpl(MethodImplOptions.AggressiveInlining)]
20992101
private bool CheckForStateChange(ref NetworkTransformState networkState, bool isSynchronization = false, ulong targetClientId = 0, bool forceState = false)
21002102
{
2103+
var cachedTickRateValue = (int)m_CachedNetworkManager.NetworkConfig.TickRate;
21012104
var flagStates = networkState.FlagStates;
21022105

21032106
// As long as we are not doing our first synchronization and we are sending unreliable deltas, each
@@ -2112,9 +2115,8 @@ private bool CheckForStateChange(ref NetworkTransformState networkState, bool is
21122115
// We compare against the NetworkTickSystem version since ServerTime is set when updating ticks
21132116
if (UseUnreliableDeltas && !isSynchronization && m_DeltaSynch && m_NextTickSync <= CurrentTick)
21142117
{
2115-
// TODO-CACHE: m_CachedNetworkManager.NetworkConfig.TickRate value
21162118
// Increment to the next frame synch tick position for this instance
2117-
m_NextTickSync += (int)m_CachedNetworkManager.NetworkConfig.TickRate;
2119+
m_NextTickSync += cachedTickRateValue;
21182120
// If we are teleporting, we do not need to send a frame synch for this tick slot
21192121
// as a "frame synch" really is effectively just a teleport.
21202122
isAxisSync = !flagStates.IsTeleportingNextFrame;
@@ -3297,7 +3299,7 @@ private void OnNetworkStateChanged(NetworkTransformState oldState, NetworkTransf
32973299
}
32983300

32993301
// Get the time when this new state was sent
3300-
newState.SentTime = new NetworkTime(m_CachedNetworkManager.NetworkTickSystem.TickRate, newState.NetworkTick).Time;
3302+
newState.SentTime = new NetworkTime(m_CachedNetworkTickRate, newState.NetworkTick).Time;
33013303

33023304
if (LogStateUpdate)
33033305
{
@@ -3526,7 +3528,7 @@ protected internal override void InternalOnNetworkPostSpawn()
35263528
// Then we want to:
35273529
// - Force the "IsSynchronizing" flag so the NetworkTransform has its state updated properly and runs through the initialization again.
35283530
// - Make sure the SynchronizingState is updated to the instantiated prefab's default flags/settings.
3529-
if (NetworkManager.IsServer && !NetworkManager.DistributedAuthorityMode && !IsOwner && !OnIsServerAuthoritative() && !SynchronizeState.IsSynchronizing)
3531+
if (m_CachedNetworkManager.IsServer && !m_CachedNetworkManager.DistributedAuthorityMode && !IsOwner && !OnIsServerAuthoritative() && !SynchronizeState.IsSynchronizing)
35303532
{
35313533
// Handle the first/root NetworkTransform slightly differently to have a sequenced synchronization of like authority nested NetworkTransform components
35323534
if (m_IsFirstNetworkTransform)
@@ -3569,6 +3571,7 @@ protected internal override void InternalOnNetworkPostSpawn()
35693571
internal static InterpolationTypes DefaultInterpolationType;
35703572

35713573
internal Transform CachedTransform;
3574+
private uint m_CachedNetworkTickRate;
35723575

35733576
/// <summary>
35743577
/// Create interpolators when first instantiated to avoid memory allocations if the
@@ -3599,6 +3602,7 @@ protected virtual void Awake()
35993602
internal override void InternalOnNetworkPreSpawn(ref NetworkManager networkManager)
36003603
{
36013604
m_CachedNetworkManager = networkManager;
3605+
m_CachedNetworkTickRate = m_CachedNetworkManager.NetworkTickSystem.TickRate;
36023606
CachedTransform = transform;
36033607
base.InternalOnNetworkPreSpawn(ref networkManager);
36043608
}
@@ -3607,7 +3611,6 @@ internal override void InternalOnNetworkPreSpawn(ref NetworkManager networkManag
36073611
public override void OnNetworkSpawn()
36083612
{
36093613
m_ParentedChildren.Clear();
3610-
m_CachedNetworkManager = NetworkManager;
36113614

36123615
Initialize();
36133616

@@ -3736,9 +3739,9 @@ private void InternalInitialization(bool isOwnershipChange = false)
37363739
var currentPosition = GetSpaceRelativePosition();
37373740
var currentRotation = GetSpaceRelativeRotation();
37383741

3739-
if (NetworkManager.DistributedAuthorityMode)
3742+
if (m_CachedNetworkManager.DistributedAuthorityMode)
37403743
{
3741-
RegisterNetworkManagerForTickUpdate(NetworkManager);
3744+
RegisterNetworkManagerForTickUpdate(m_CachedNetworkManager);
37423745
}
37433746

37443747
#if COM_UNITY_MODULES_PHYSICS || COM_UNITY_MODULES_PHYSICS2D
@@ -4577,7 +4580,7 @@ internal void TransformStateUpdate()
45774580
{
45784581
// TODO: Investigate where this state should be applied or just discarded.
45794582
// For now, discard the state if we assumed ownership.
4580-
// Debug.Log($"[Client-{NetworkManager.LocalClientId}] Ignoring inbound update from Client-{0} and parentUpdated:{isParentingDirective}!");
4583+
// Debug.Log($"[Client-{m_CachedNetworkManager.LocalClientId}] Ignoring inbound update from Client-{0} and parentUpdated:{isParentingDirective}!");
45814584
return;
45824585
}
45834586
// Store the previous/old state
@@ -4690,6 +4693,7 @@ internal static float GetTickLatency(NetworkManager networkManager)
46904693
/// Only valid on clients.
46914694
/// </remarks>
46924695
/// <returns>Returns the tick latency and local offset in seconds and as a float value.</returns>
4696+
/// Can this be called before spawn?
46934697
public static float GetTickLatency()
46944698
{
46954699
return GetTickLatency(NetworkManager.Singleton);
@@ -4802,14 +4806,14 @@ private static void RegisterNetworkManagerForTickUpdate(NetworkManager networkMa
48024806
/// <param name="networkTransform"></param>
48034807
private static void RegisterForTickUpdate(NetworkTransform networkTransform)
48044808
{
4805-
4806-
if (!networkTransform.NetworkManager.DistributedAuthorityMode && !s_NetworkTickRegistration.ContainsKey(networkTransform.NetworkManager))
4809+
var networkManager = networkTransform.NetworkManager;
4810+
if (!networkManager.DistributedAuthorityMode && !s_NetworkTickRegistration.ContainsKey(networkManager))
48074811
{
4808-
s_NetworkTickRegistration.Add(networkTransform.NetworkManager, new NetworkTransformTickRegistration(networkTransform.NetworkManager));
4812+
s_NetworkTickRegistration.Add(networkManager, new NetworkTransformTickRegistration(networkManager));
48094813
}
48104814

48114815
networkTransform.RegisterForTickSynchronization();
4812-
s_NetworkTickRegistration[networkTransform.NetworkManager].NetworkTransforms.Add(networkTransform);
4816+
s_NetworkTickRegistration[networkManager].NetworkTransforms.Add(networkTransform);
48134817
}
48144818

48154819
/// <summary>
@@ -4819,16 +4823,17 @@ private static void RegisterForTickUpdate(NetworkTransform networkTransform)
48194823
/// <param name="networkTransform"></param>
48204824
private static void DeregisterForTickUpdate(NetworkTransform networkTransform)
48214825
{
4822-
if (networkTransform.NetworkManager == null)
4826+
var networkManager = networkTransform.NetworkManager;
4827+
if (!networkManager)
48234828
{
48244829
return;
48254830
}
4826-
if (s_NetworkTickRegistration.ContainsKey(networkTransform.NetworkManager))
4831+
if (s_NetworkTickRegistration.ContainsKey(networkManager))
48274832
{
4828-
s_NetworkTickRegistration[networkTransform.NetworkManager].NetworkTransforms.Remove(networkTransform);
4829-
if (!networkTransform.NetworkManager.DistributedAuthorityMode && s_NetworkTickRegistration[networkTransform.NetworkManager].NetworkTransforms.Count == 0)
4833+
s_NetworkTickRegistration[networkManager].NetworkTransforms.Remove(networkTransform);
4834+
if (!networkManager.DistributedAuthorityMode && s_NetworkTickRegistration[networkManager].NetworkTransforms.Count == 0)
48304835
{
4831-
var registrationEntry = s_NetworkTickRegistration[networkTransform.NetworkManager];
4836+
var registrationEntry = s_NetworkTickRegistration[networkManager];
48324837
registrationEntry.Remove();
48334838
}
48344839
}

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ internal FastBufferWriter __beginSendServerRpc(uint rpcMethodId, ServerRpcParams
8888
internal void __endSendServerRpc(ref FastBufferWriter bufferWriter, uint rpcMethodId, ServerRpcParams serverRpcParams, RpcDelivery rpcDelivery)
8989
#pragma warning restore IDE1006 // restore naming rule violation check
9090
{
91+
// Getting this ahead of time actually improves performance
9192
var networkManager = m_NetworkManager;
9293
var serverRpcMessage = new ServerRpcMessage
9394
{
@@ -167,6 +168,7 @@ internal FastBufferWriter __beginSendClientRpc(uint rpcMethodId, ClientRpcParams
167168
internal void __endSendClientRpc(ref FastBufferWriter bufferWriter, uint rpcMethodId, ClientRpcParams clientRpcParams, RpcDelivery rpcDelivery)
168169
#pragma warning restore IDE1006 // restore naming rule violation check
169170
{
171+
// Getting this ahead of time actually improves performance
170172
var networkManager = m_NetworkManager;
171173
var clientRpcMessage = new ClientRpcMessage
172174
{
@@ -215,7 +217,7 @@ internal void __endSendClientRpc(ref FastBufferWriter bufferWriter, uint rpcMeth
215217
NetworkLog.LogError(GenerateObserverErrorMessage(clientRpcParams, targetClientId));
216218
}
217219
}
218-
rpcWriteSize = m_NetworkManager.ConnectionManager.SendMessage(ref clientRpcMessage, networkDelivery, in clientRpcParams.Send.TargetClientIds);
220+
rpcWriteSize = networkManager.ConnectionManager.SendMessage(ref clientRpcMessage, networkDelivery, in clientRpcParams.Send.TargetClientIds);
219221
}
220222
else if (clientRpcParams.Send.TargetClientIdsNativeArray != null)
221223
{
@@ -349,6 +351,7 @@ internal FastBufferWriter __beginSendRpc(uint rpcMethodId, RpcParams rpcParams,
349351
internal void __endSendRpc(ref FastBufferWriter bufferWriter, uint rpcMethodId, RpcParams rpcParams, RpcAttribute.RpcAttributeParams attributeParams, SendTo defaultTarget, RpcDelivery rpcDelivery)
350352
#pragma warning restore IDE1006 // restore naming rule violation check
351353
{
354+
// Sould we create a local networkManager var to improve performance instead of using 2 times m_NetworkManager?
352355
var rpcMessage = new RpcMessage
353356
{
354357
Metadata = new RpcMetadata
@@ -650,6 +653,7 @@ protected NetworkBehaviour GetNetworkBehaviour(ushort behaviourId)
650653
/// </summary>
651654
internal void UpdateNetworkProperties()
652655
{
656+
// Getting these ahead of time actually improves performance
653657
var networkObject = m_NetworkObject;
654658
var networkManager = m_NetworkManager;
655659

0 commit comments

Comments
 (0)