Skip to content

fix: Removed unnecessary GC Allocation #3527

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 3 commits into
base: develop-2.0.0
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -996,7 +996,7 @@ internal void CheckForAnimatorChanges()
{
// Just notify all remote clients and not the local server
m_ClientSendList.Clear();
foreach (var clientId in NetworkManager.ConnectedClientsIds)
foreach (var clientId in NetworkManager.ConnectionManager.ConnectedClientIds)
{
if (clientId == NetworkManager.LocalClientId || !NetworkObject.Observers.Contains(clientId))
{
Expand Down Expand Up @@ -1315,7 +1315,7 @@ private unsafe void SendParametersUpdateServerRpc(ParametersUpdateMessage parame
if (NetworkManager.ConnectedClientsIds.Count > (IsHost ? 2 : 1))
{
m_ClientSendList.Clear();
foreach (var clientId in NetworkManager.ConnectedClientsIds)
foreach (var clientId in NetworkManager.ConnectionManager.ConnectedClientIds)
{
if (clientId == serverRpcParams.Receive.SenderClientId || clientId == NetworkManager.ServerClientId || !NetworkObject.Observers.Contains(clientId))
{
Expand Down Expand Up @@ -1378,7 +1378,7 @@ private void SendAnimStateServerRpc(AnimationMessage animationMessage, ServerRpc
if (NetworkManager.ConnectedClientsIds.Count > (IsHost ? 2 : 1))
{
m_ClientSendList.Clear();
foreach (var clientId in NetworkManager.ConnectedClientsIds)
foreach (var clientId in NetworkManager.ConnectionManager.ConnectedClientIds)
{
if (clientId == serverRpcParams.Receive.SenderClientId || clientId == NetworkManager.ServerClientId || !NetworkObject.Observers.Contains(clientId))
{
Expand Down Expand Up @@ -1452,7 +1452,7 @@ internal void SendAnimTriggerServerRpc(AnimationTriggerMessage animationTriggerM
InternalSetTrigger(animationTriggerMessage.Hash, animationTriggerMessage.IsTriggerSet);

m_ClientSendList.Clear();
foreach (var clientId in NetworkManager.ConnectedClientsIds)
foreach (var clientId in NetworkManager.ConnectionManager.ConnectedClientIds)
{
if (clientId == NetworkManager.ServerClientId || !NetworkObject.Observers.Contains(clientId))
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -149,12 +149,12 @@ internal void InvokeOnClientConnectedCallback(ulong clientId)
}

// Invoking connection event on non-authority local client. Need to calculate PeerIds.
var peerClientIds = new NativeArray<ulong>(Math.Max(NetworkManager.ConnectedClientsIds.Count - 1, 0), Allocator.Temp);
var peerClientIds = new NativeArray<ulong>(Math.Max(ConnectedClientIds.Count - 1, 0), Allocator.Temp);
// `using var peerClientIds` or `using(peerClientIds)` renders it immutable...
using var sentinel = peerClientIds;

var idx = 0;
foreach (var peerId in NetworkManager.ConnectedClientsIds)
foreach (var peerId in ConnectedClientIds)
{
if (peerId == NetworkManager.LocalClientId)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,11 @@ internal void NetworkBehaviourUpdate(bool forceSend = false)
#endif
try
{
m_DirtyNetworkObjects.UnionWith(m_PendingDirtyNetworkObjects);
m_PendingDirtyNetworkObjects.Clear();
if (m_PendingDirtyNetworkObjects.Count > 0)
{
m_DirtyNetworkObjects.UnionWith(m_PendingDirtyNetworkObjects);
m_PendingDirtyNetworkObjects.Clear();
}

// NetworkObject references can become null, when hidden or despawned. Once NUll, there is no point
// trying to process them, even if they were previously marked as dirty.
Expand Down
6 changes: 3 additions & 3 deletions com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1616,7 +1616,7 @@ public void NetworkHide(ulong clientId)
// Send destroy call
size = NetworkManager.ConnectionManager.SendMessage(ref message, NetworkDelivery.ReliableSequenced, clientId);
// Broadcast the destroy to all clients so they can update their observers list
foreach (var client in NetworkManager.ConnectedClientsIds)
foreach (var client in NetworkManager.ConnectionManager.ConnectedClientIds)
{
if (client == clientId || client == NetworkManager.LocalClientId)
{
Expand Down Expand Up @@ -2363,7 +2363,7 @@ private void OnTransformParentChanged()
}
else
{
foreach (var clientId in NetworkManager.ConnectedClientsIds)
foreach (var clientId in NetworkManager.ConnectionManager.ConnectedClientIds)
{
if (clientId == NetworkManager.ServerClientId)
{
Expand All @@ -2382,7 +2382,7 @@ private void OnTransformParentChanged()
var maxCount = NetworkManager.ConnectedClientsIds.Count;
ulong* clientIds = stackalloc ulong[maxCount];
int idx = 0;
foreach (var clientId in NetworkManager.ConnectedClientsIds)
foreach (var clientId in NetworkManager.ConnectionManager.ConnectedClientIds)
{
if (clientId == NetworkManager.ServerClientId)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -250,8 +250,9 @@ public void Handle(ref NetworkContext context)
}
else
{
foreach (var clientId in clientList)
for (int i = 0; i < clientList.Count; i++)
{
var clientId = clientList[i];
if (clientId == networkManager.LocalClientId)
{
continue;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -247,9 +247,9 @@ internal static void CreateObject(ref NetworkManager networkManager, ulong sende
var clientList = hasObserverIdList && !networkObject.IsPlayerObject ? observerIds : networkManager.ConnectedClientsIds;

// Update the observers for this instance
foreach (var clientId in clientList)
for (int i = 0; i < clientList.Count; i++)
{
networkObject.Observers.Add(clientId);
networkObject.Observers.Add(clientList[i]);
}

// Mock CMB Service and forward to all clients
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -191,7 +191,7 @@ private void HandleDAHostForwardMessage(ulong senderId, ref NetworkManager netwo
DeferredDespawnTick = DeferredDespawnTick,
};
var ownerClientId = networkObject == null ? senderId : networkObject.OwnerClientId;
var clientIds = networkObject == null ? networkManager.ConnectedClientsIds.ToList() : networkObject.Observers.ToList();
var clientIds = networkObject == null ? networkManager.ConnectionManager.ConnectedClientIds : networkObject.Observers.ToList();

foreach (var clientId in clientIds)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -228,7 +228,7 @@ public void Handle(ref NetworkContext context)
if (isServerAndDeltaForwarding)
{
m_ForwardUpdates = new Dictionary<ulong, List<int>>();
foreach (var clientId in networkManager.ConnectedClientsIds)
foreach (var clientId in networkManager.ConnectionManager.ConnectedClientIds)
{
if (clientId == context.SenderId || clientId == networkManager.LocalClientId || !networkObject.Observers.Contains(clientId))
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ public abstract class BaseRpcTarget : IDisposable
/// The <see cref="NetworkManager"/> instance which can be used to handle sending and receiving the specific target(s)
/// </summary>
protected NetworkManager m_NetworkManager;

internal NetworkConnectionManager ConnectionManager;
private bool m_Locked;

internal void Lock()
Expand All @@ -26,6 +28,7 @@ internal void Unlock()
internal BaseRpcTarget(NetworkManager manager)
{
m_NetworkManager = manager;
ConnectionManager = m_NetworkManager.ConnectionManager;
}

/// <summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ internal override void Send(NetworkBehaviour behaviour, ref RpcMessage message,
}
else
{
foreach (var clientId in m_NetworkManager.ConnectedClientsIds)
foreach (var clientId in ConnectionManager.ConnectedClientIds)
{
if (clientId == behaviour.OwnerClientId || !networkObject.Observers.Contains(clientId))
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ internal override void Send(NetworkBehaviour behaviour, ref RpcMessage message,
}
else
{
foreach (var clientId in m_NetworkManager.ConnectedClientsIds)
foreach (var clientId in ConnectionManager.ConnectedClientIds)
{
if (clientId == behaviour.NetworkManager.LocalClientId)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ internal override void Send(NetworkBehaviour behaviour, ref RpcMessage message,
}
else
{
foreach (var clientId in m_NetworkManager.ConnectedClientsIds)
foreach (var clientId in ConnectionManager.ConnectedClientIds)
{
if (clientId == behaviour.OwnerClientId)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ internal override void Send(NetworkBehaviour behaviour, ref RpcMessage message,
}
else
{
foreach (var clientId in m_NetworkManager.ConnectedClientsIds)
foreach (var clientId in ConnectionManager.ConnectedClientIds)
{
if (clientId == NetworkManager.ServerClientId)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -119,10 +119,11 @@ public enum RpcTargetUse
public class RpcTarget
{
private NetworkManager m_NetworkManager;
private NetworkConnectionManager m_ConnectionManager;
internal RpcTarget(NetworkManager manager)
{
m_NetworkManager = manager;

m_ConnectionManager = manager.ConnectionManager;
Everyone = new EveryoneRpcTarget(manager);
Owner = new OwnerRpcTarget(manager);
NotOwner = new NotOwnerRpcTarget(manager);
Expand Down Expand Up @@ -312,7 +313,7 @@ public BaseRpcTarget Not(ulong excludedClientId, RpcTargetUse use)
}
}
target.Clear();
foreach (var clientId in m_NetworkManager.ConnectedClientsIds)
foreach (var clientId in m_NetworkManager.ConnectionManager.ConnectedClientIds)
{
if (clientId != excludedClientId)
{
Expand Down Expand Up @@ -495,7 +496,7 @@ public BaseRpcTarget Not(NativeArray<ulong> excludedClientIds, RpcTargetUse use)
asASet.Add(clientId);
}

foreach (var clientId in m_NetworkManager.ConnectedClientsIds)
foreach (var clientId in m_NetworkManager.ConnectionManager.ConnectedClientIds)
{
if (!asASet.Contains(clientId))
{
Expand Down Expand Up @@ -590,7 +591,7 @@ public BaseRpcTarget Not<T>(T excludedClientIds, RpcTargetUse use) where T : IEn
asASet.Add(clientId);
}

foreach (var clientId in m_NetworkManager.ConnectedClientsIds)
foreach (var clientId in m_ConnectionManager.ConnectedClientIds)
{
if (!asASet.Contains(clientId))
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2593,7 +2593,7 @@ internal void HandleSceneEvent(ulong clientId, FastBufferReader reader)
EventData = sceneEventData,
};
// Forward synchronization to client then exit early because DAHost is not the current session owner
foreach (var client in NetworkManager.ConnectedClientsIds)
foreach (var client in NetworkManager.ConnectionManager.ConnectedClientIds)
{
if (client == NetworkManager.LocalClientId)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -166,7 +166,7 @@ internal SceneEventProgress(NetworkManager networkManager, SceneEventProgressSta
{
m_NetworkManager.OnClientDisconnectCallback += OnClientDisconnectCallback;
// Track the clients that were connected when we started this event
foreach (var connectedClientId in networkManager.ConnectedClientsIds)
foreach (var connectedClientId in networkManager.ConnectionManager.ConnectedClientIds)
{
// Ignore the host or session owner
if ((!networkManager.DistributedAuthorityMode && NetworkManager.ServerClientId == connectedClientId) || (networkManager.DistributedAuthorityMode && networkManager.CurrentSessionOwner == connectedClientId))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1099,7 +1099,7 @@ internal void SpawnNetworkObjectLocally(NetworkObject networkObject, ulong netwo
}
else
{
foreach (var clientId in NetworkManager.ConnectedClientsIds)
foreach (var clientId in NetworkManager.ConnectionManager.ConnectedClientIds)
{
// If SpawnWithObservers is enabled, then authority does take networkObject.CheckObjectVisibility into consideration
if (networkObject.CheckObjectVisibility != null && !networkObject.CheckObjectVisibility.Invoke(clientId))
Expand Down Expand Up @@ -1703,7 +1703,9 @@ internal void OnDespawnObject(NetworkObject networkObject, bool destroyGameObjec
// Otherwise send to the clients for which the object is visible
else
{
foreach (var clientId in NetworkManager.ConnectedClientsIds)
// We keep only the client for which the object is visible
// as the other clients have them already despawned
foreach (var clientId in NetworkManager.ConnectionManager.ConnectedClientIds)
{
if ((distributedAuthority && clientId == networkObject.OwnerClientId) || clientId == NetworkManager.LocalClientId)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1146,9 +1146,9 @@ private void ExtractNetworkMetrics()
{
if (m_NetworkManager.IsServer)
{
var ngoConnectionIds = m_NetworkManager.ConnectedClients.Keys;
foreach (var ngoConnectionId in ngoConnectionIds)
for (int i=0; i<m_NetworkManager.ConnectedClientsIds.Count; ++i)
{
var ngoConnectionId = m_NetworkManager.ConnectedClientsIds[i];
if (ngoConnectionId == 0 && m_NetworkManager.IsHost)
{
continue;
Expand Down