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
4 changes: 3 additions & 1 deletion com.unity.netcode.gameobjects/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,11 @@ Additional documentation and release notes are available at [Multiplayer Documen

### Fixed

- Removed allocation to the heap in NetworkBehaviourUpdate. (#3568)
- 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`. (#3601)
- Fixed issue with allocation to the heap in NetworkBehaviourUpdate when there is nothing to be updated. (#3568)
- Fixed issue where NetworkConfig.ConnectionData could cause the ConnectionRequestMessage to exceed the transport's MTU size and would result in a buffer overflow error. (#3565)


### Changed


Expand Down
4 changes: 2 additions & 2 deletions com.unity.netcode.gameobjects/Components/NetworkAnimator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -961,7 +961,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 @@ -1320,7 +1320,7 @@ private unsafe void SendAnimStateServerRpc(AnimationMessage animationMessage, Se
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
Original file line number Diff line number Diff line change
Expand Up @@ -134,12 +134,12 @@ internal void InvokeOnClientConnectedCallback(ulong clientId)

if (!NetworkManager.IsServer)
{
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
4 changes: 2 additions & 2 deletions com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1252,10 +1252,10 @@ private void OnTransformParentChanged()

unsafe
{
var maxCount = NetworkManager.ConnectedClientsIds.Count;
var maxCount = NetworkManager.ConnectionManager.ConnectedClientIds.Count;
ulong* clientIds = stackalloc ulong[maxCount];
int idx = 0;
foreach (var clientId in NetworkManager.ConnectedClientsIds)
foreach (var clientId in NetworkManager.ConnectionManager.ConnectedClientIds)
{
if (Observers.Contains(clientId))
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ 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 +27,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 @@ -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 @@ -55,7 +55,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 @@ -107,9 +107,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);
Expand Down Expand Up @@ -284,8 +286,9 @@ public BaseRpcTarget Not(ulong excludedClientId, RpcTargetUse use)
target = m_CachedProxyRpcTargetGroup;
}
}

target.Clear();
foreach (var clientId in m_NetworkManager.ConnectedClientsIds)
foreach (var clientId in m_ConnectionManager.ConnectedClientIds)
{
if (clientId != excludedClientId)
{
Expand Down Expand Up @@ -468,7 +471,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 @@ -557,13 +560,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 @@ -829,7 +829,7 @@ internal NetworkSceneManager(NetworkManager networkManager)
private void SceneManager_ActiveSceneChanged(Scene current, Scene next)
{
// If no clients are connected, then don't worry about notifications
if (!(NetworkManager.ConnectedClientsIds.Count > (NetworkManager.IsHost ? 1 : 0)))
if (!(NetworkManager.ConnectionManager.ConnectedClientIds.Count > (NetworkManager.IsHost ? 1 : 0)))
{
return;
}
Expand All @@ -850,7 +850,7 @@ private void SceneManager_ActiveSceneChanged(Scene current, Scene next)
var sceneEvent = BeginSceneEvent();
sceneEvent.SceneEventType = SceneEventType.ActiveSceneChanged;
sceneEvent.ActiveSceneHash = BuildIndexToHash[next.buildIndex];
SendSceneEventData(sceneEvent.SceneEventId, NetworkManager.ConnectedClientsIds.Where(c => c != NetworkManager.ServerClientId).ToArray());
SendSceneEventData(sceneEvent.SceneEventId, NetworkManager.ConnectionManager.ConnectedClientIds.Where(c => c != NetworkManager.ServerClientId).ToArray());
EndSceneEvent(sceneEvent.SceneEventId);
}
}
Expand Down Expand Up @@ -1139,10 +1139,10 @@ private bool OnSceneEventProgressCompleted(SceneEventProgress sceneEventProgress
{
EventData = sceneEventData
};
var size = NetworkManager.ConnectionManager.SendMessage(ref message, k_DeliveryType, NetworkManager.ConnectedClientsIds);
var size = NetworkManager.ConnectionManager.SendMessage(ref message, k_DeliveryType, NetworkManager.ConnectionManager.ConnectedClientIds);

NetworkManager.NetworkMetrics.TrackSceneEventSent(
NetworkManager.ConnectedClientsIds,
NetworkManager.ConnectionManager.ConnectedClientIds,
(uint)sceneEventProgress.SceneEventType,
SceneNameFromHash(sceneEventProgress.SceneHash),
size);
Expand Down Expand Up @@ -1291,7 +1291,7 @@ private void OnSceneUnloaded(uint sceneEventId)
// Server sends the unload scene notification after unloading because it will despawn all scene relative in-scene NetworkObjects
// If we send this event to all clients before the server is finished unloading they will get warning about an object being
// despawned that no longer exists
SendSceneEventData(sceneEventId, NetworkManager.ConnectedClientsIds.Where(c => c != NetworkManager.ServerClientId).ToArray());
SendSceneEventData(sceneEventId, NetworkManager.ConnectionManager.ConnectedClientIds.Where(c => c != NetworkManager.ServerClientId).ToArray());

//Only if we are a host do we want register having loaded for the associated SceneEventProgress
if (SceneEventProgressTracking.ContainsKey(sceneEventData.SceneEventProgressId) && NetworkManager.IsHost)
Expand Down Expand Up @@ -2515,7 +2515,7 @@ internal void CheckForAndSendNetworkObjectSceneChanged()
// Some NetworkObjects still exist, send the message
var sceneEvent = BeginSceneEvent();
sceneEvent.SceneEventType = SceneEventType.ObjectSceneChanged;
SendSceneEventData(sceneEvent.SceneEventId, NetworkManager.ConnectedClientsIds.Where(c => c != NetworkManager.ServerClientId).ToArray());
SendSceneEventData(sceneEvent.SceneEventId, NetworkManager.ConnectionManager.ConnectedClientIds.Where(c => c != NetworkManager.ServerClientId).ToArray());
EndSceneEvent(sceneEvent.SceneEventId);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -162,7 +162,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 client
if (NetworkManager.ServerClientId == connectedClientId)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1169,7 +1169,7 @@ internal void OnDespawnObject(NetworkObject networkObject, bool destroyGameObjec

// We keep only the client for which the object is visible
// as the other clients have them already despawned
foreach (var clientId in NetworkManager.ConnectedClientsIds)
foreach (var clientId in NetworkManager.ConnectionManager.ConnectedClientIds)
{
if (networkObject.IsNetworkVisibleTo(clientId))
{
Expand Down