diff --git a/com.unity.netcode.gameobjects/CHANGELOG.md b/com.unity.netcode.gameobjects/CHANGELOG.md index 90fab8c6c7..c4b0af9a6f 100644 --- a/com.unity.netcode.gameobjects/CHANGELOG.md +++ b/com.unity.netcode.gameobjects/CHANGELOG.md @@ -12,6 +12,7 @@ Additional documentation and release notes are available at [Multiplayer Documen ### Changed +- Improve performance of `NetworkBehavior`. (#3915) - Improve performance of `NetworkRigidbodyBase`. (#3906) - Improve performance of `NetworkAnimator`. (#3905) diff --git a/com.unity.netcode.gameobjects/Runtime/Core/NetworkBehaviour.cs b/com.unity.netcode.gameobjects/Runtime/Core/NetworkBehaviour.cs index 3d3c919986..049f28070b 100644 --- a/com.unity.netcode.gameobjects/Runtime/Core/NetworkBehaviour.cs +++ b/com.unity.netcode.gameobjects/Runtime/Core/NetworkBehaviour.cs @@ -90,7 +90,6 @@ internal FastBufferWriter __beginSendServerRpc(uint rpcMethodId, ServerRpcParams internal void __endSendServerRpc(ref FastBufferWriter bufferWriter, uint rpcMethodId, ServerRpcParams serverRpcParams, RpcDelivery rpcDelivery) #pragma warning restore IDE1006 // restore naming rule violation check { - var networkManager = m_NetworkManager; var serverRpcMessage = new ServerRpcMessage { Metadata = new RpcMetadata @@ -110,7 +109,7 @@ internal void __endSendServerRpc(ref FastBufferWriter bufferWriter, uint rpcMeth networkDelivery = MessageDeliveryType.DefaultDelivery; break; case RpcDelivery.Unreliable: - if (bufferWriter.Length > networkManager.MessageManager.NonFragmentedMessageMaxSize) + if (bufferWriter.Length > m_NetworkManager.MessageManager.NonFragmentedMessageMaxSize) { throw new OverflowException("RPC parameters are too large for unreliable delivery."); } @@ -127,8 +126,8 @@ internal void __endSendServerRpc(ref FastBufferWriter bufferWriter, uint rpcMeth var context = new NetworkContext { SenderId = NetworkManager.ServerClientId, - Timestamp = networkManager.RealTimeProvider.RealTimeSinceStartup, - SystemOwner = networkManager, + Timestamp = m_NetworkManager.RealTimeProvider.RealTimeSinceStartup, + SystemOwner = m_NetworkManager, // header information isn't valid since it's not a real message. // RpcMessage doesn't access this stuff so it's just left empty. Header = new NetworkMessageHeader(), @@ -141,7 +140,7 @@ internal void __endSendServerRpc(ref FastBufferWriter bufferWriter, uint rpcMeth } else { - rpcWriteSize = networkManager.ConnectionManager.SendMessage(ref serverRpcMessage, networkDelivery, NetworkManager.ServerClientId); + rpcWriteSize = m_NetworkManager.ConnectionManager.SendMessage(ref serverRpcMessage, networkDelivery, NetworkManager.ServerClientId); } bufferWriter.Dispose(); @@ -169,7 +168,6 @@ internal FastBufferWriter __beginSendClientRpc(uint rpcMethodId, ClientRpcParams internal void __endSendClientRpc(ref FastBufferWriter bufferWriter, uint rpcMethodId, ClientRpcParams clientRpcParams, RpcDelivery rpcDelivery) #pragma warning restore IDE1006 // restore naming rule violation check { - var networkManager = m_NetworkManager; var clientRpcMessage = new ClientRpcMessage { Metadata = new RpcMetadata @@ -189,7 +187,7 @@ internal void __endSendClientRpc(ref FastBufferWriter bufferWriter, uint rpcMeth networkDelivery = MessageDeliveryType.DefaultDelivery; break; case RpcDelivery.Unreliable: - if (bufferWriter.Length > networkManager.MessageManager.NonFragmentedMessageMaxSize) + if (bufferWriter.Length > m_NetworkManager.MessageManager.NonFragmentedMessageMaxSize) { throw new OverflowException("RPC parameters are too large for unreliable delivery."); } @@ -212,7 +210,7 @@ internal void __endSendClientRpc(ref FastBufferWriter bufferWriter, uint rpcMeth continue; } // Check to make sure we are sending to only observers, if not log an error. - if (networkManager.LogLevel >= LogLevel.Error && !m_NetworkObject.Observers.Contains(targetClientId)) + if (m_NetworkManager.LogLevel >= LogLevel.Error && !m_NetworkObject.Observers.Contains(targetClientId)) { NetworkLog.LogError(GenerateObserverErrorMessage(clientRpcParams, targetClientId)); } @@ -229,12 +227,12 @@ internal void __endSendClientRpc(ref FastBufferWriter bufferWriter, uint rpcMeth continue; } // Check to make sure we are sending to only observers, if not log an error. - if (networkManager.LogLevel >= LogLevel.Error && !m_NetworkObject.Observers.Contains(targetClientId)) + if (m_NetworkManager.LogLevel >= LogLevel.Error && !m_NetworkObject.Observers.Contains(targetClientId)) { NetworkLog.LogError(GenerateObserverErrorMessage(clientRpcParams, targetClientId)); } } - rpcWriteSize = networkManager.ConnectionManager.SendMessage(ref clientRpcMessage, networkDelivery, clientRpcParams.Send.TargetClientIdsNativeArray.Value); + rpcWriteSize = m_NetworkManager.ConnectionManager.SendMessage(ref clientRpcMessage, networkDelivery, clientRpcParams.Send.TargetClientIdsNativeArray.Value); } else { @@ -242,12 +240,12 @@ internal void __endSendClientRpc(ref FastBufferWriter bufferWriter, uint rpcMeth while (observerEnumerator.MoveNext()) { // Skip over the host - if (IsHost && observerEnumerator.Current == networkManager.LocalClientId) + if (IsHost && observerEnumerator.Current == m_NetworkManager.LocalClientId) { shouldInvokeLocally = true; continue; } - rpcWriteSize = networkManager.ConnectionManager.SendMessage(ref clientRpcMessage, networkDelivery, observerEnumerator.Current); + rpcWriteSize = m_NetworkManager.ConnectionManager.SendMessage(ref clientRpcMessage, networkDelivery, observerEnumerator.Current); } } @@ -258,8 +256,8 @@ internal void __endSendClientRpc(ref FastBufferWriter bufferWriter, uint rpcMeth var context = new NetworkContext { SenderId = NetworkManager.ServerClientId, - Timestamp = networkManager.RealTimeProvider.RealTimeSinceStartup, - SystemOwner = networkManager, + Timestamp = m_NetworkManager.RealTimeProvider.RealTimeSinceStartup, + SystemOwner = m_NetworkManager, // header information isn't valid since it's not a real message. // RpcMessage doesn't access this stuff so it's just left empty. Header = new NetworkMessageHeader(), @@ -282,7 +280,7 @@ internal void __endSendClientRpc(ref FastBufferWriter bufferWriter, uint rpcMeth { foreach (var targetClientId in clientRpcParams.Send.TargetClientIds) { - networkManager.NetworkMetrics.TrackRpcSent( + m_NetworkManager.NetworkMetrics.TrackRpcSent( targetClientId, m_NetworkObject, rpcMethodName, @@ -294,7 +292,7 @@ internal void __endSendClientRpc(ref FastBufferWriter bufferWriter, uint rpcMeth { foreach (var targetClientId in clientRpcParams.Send.TargetClientIdsNativeArray) { - networkManager.NetworkMetrics.TrackRpcSent( + m_NetworkManager.NetworkMetrics.TrackRpcSent( targetClientId, m_NetworkObject, rpcMethodName, @@ -307,7 +305,7 @@ internal void __endSendClientRpc(ref FastBufferWriter bufferWriter, uint rpcMeth var observerEnumerator = m_NetworkObject.Observers.GetEnumerator(); while (observerEnumerator.MoveNext()) { - networkManager.NetworkMetrics.TrackRpcSent( + m_NetworkManager.NetworkMetrics.TrackRpcSent( observerEnumerator.Current, m_NetworkObject, rpcMethodName, @@ -325,7 +323,7 @@ internal void __endSendClientRpc(ref FastBufferWriter bufferWriter, uint rpcMeth internal FastBufferWriter __beginSendRpc(uint rpcMethodId, RpcParams rpcParams, RpcAttribute.RpcAttributeParams attributeParams, SendTo defaultTarget, RpcDelivery rpcDelivery) #pragma warning restore IDE1006 // restore naming rule violation check { - if (m_NetworkObject == null && !IsSpawned) + if (!IsSpawned) { throw new RpcException("The NetworkBehaviour must be spawned before calling this method."); } @@ -652,27 +650,24 @@ protected NetworkBehaviour GetNetworkBehaviour(ushort behaviourId) /// internal void UpdateNetworkProperties() { - var networkObject = m_NetworkObject; - var networkManager = m_NetworkManager; - // Set identification related properties - NetworkObjectId = networkObject.NetworkObjectId; - IsLocalPlayer = networkObject.IsLocalPlayer; + NetworkObjectId = m_NetworkObject.NetworkObjectId; + IsLocalPlayer = m_NetworkObject.IsLocalPlayer; // Set ownership related properties - IsOwnedByServer = networkObject.IsOwnedByServer; - IsOwner = networkObject.IsOwner; - OwnerClientId = networkObject.OwnerClientId; + IsOwnedByServer = m_NetworkObject.IsOwnedByServer; + IsOwner = m_NetworkObject.IsOwner; + OwnerClientId = m_NetworkObject.OwnerClientId; // Set NetworkManager dependent properties - if (networkManager != null) - { - IsHost = networkManager.IsListening && networkManager.IsHost; - IsClient = networkManager.IsListening && networkManager.IsClient; - IsServer = networkManager.IsListening && networkManager.IsServer; - IsSessionOwner = networkManager.IsListening && networkManager.LocalClient.IsSessionOwner; - HasAuthority = networkObject.HasAuthority; - ServerIsHost = networkManager.IsListening && networkManager.ServerIsHost; + if (m_NetworkManager != null) + { + IsHost = m_NetworkManager.IsListening && m_NetworkManager.IsHost; + IsClient = m_NetworkManager.IsListening && m_NetworkManager.IsClient; + IsServer = m_NetworkManager.IsListening && m_NetworkManager.IsServer; + IsSessionOwner = m_NetworkManager.IsListening && m_NetworkManager.LocalClient.IsSessionOwner; + HasAuthority = m_NetworkObject.HasAuthority; + ServerIsHost = m_NetworkManager.IsListening && m_NetworkManager.ServerIsHost; } }