Skip to content
Merged
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
1 change: 1 addition & 0 deletions com.unity.netcode.gameobjects/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ Additional documentation and release notes are available at [Multiplayer Documen
- Fixed an issue where `UnityTransport` would not accept single words as valid hostnames (notably "localhost"). (#3591)
- Fixed issue where viewing a `NetworkBehaviour` with one or more `NetworkVariable` fields could throw an exception if running a distributed authority network topology with a local (DAHost) host and viewed on the host when the host is not the authority of the associated `NetworkObject`. (#3578)
- Fixed issue when using a distributed authority network topology and viewing a `NetworkBehaviour` with one or more `NetworkVariable` fields in the inspector view would not show editable fields. (#3578)
- Fixed issue with unnecessary internal GC Allocations when using the `IReadOnlyList` `NetworkManager.ConnectedClientsIds` within a `foreach` statement by either replacing with a `for` loop or directly referencing the `NetworkConnectionManager.ConnectedClientIds`. (#3527)

### Changed

Expand Down
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
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_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_ConnectionManager.ConnectedClientIds)
{
if (!asASet.Contains(clientId))
{
Expand Down Expand Up @@ -584,13 +585,13 @@ public BaseRpcTarget Not<T>(T excludedClientIds, RpcTargetUse use) where T : IEn
}
target.Clear();

using var asASet = new NativeHashSet<ulong>(m_NetworkManager.ConnectedClientsIds.Count, Allocator.Temp);
using var asASet = new NativeHashSet<ulong>(m_ConnectionManager.ConnectedClientIds.Count, Allocator.Temp);
foreach (var clientId in excludedClientIds)
{
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 @@ -1695,7 +1695,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 @@ -1089,9 +1089,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