Skip to content

Commit c1d6503

Browse files
committed
Improves handler lookup performance
Improves prefab handler lookup performance by introducing a dedicated dictionary for handlers with instantiation data. This allows for faster injection of instantiation data into NetworkObjects.
1 parent 6899764 commit c1d6503

1 file changed

Lines changed: 12 additions & 10 deletions

File tree

com.unity.netcode.gameobjects/Runtime/Spawning/NetworkPrefabHandler.cs

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,12 @@ public class NetworkPrefabHandler
6060
/// </summary>
6161
private readonly Dictionary<uint, INetworkPrefabInstanceHandler> m_PrefabAssetToPrefabHandler = new Dictionary<uint, INetworkPrefabInstanceHandler>();
6262

63+
/// <summary>
64+
/// Links a network prefab asset to a class with the INetworkPrefabInstanceHandlerWithData interface,
65+
/// used to keep a smaller lookup table than <see cref="m_PrefabAssetToPrefabHandler"/> for faster instantiation data injection into NetworkObject
66+
/// </summary>
67+
private readonly Dictionary<uint, INetworkPrefabInstanceHandlerWithData> m_PrefabAssetToPrefabHandlerWithData = new Dictionary<uint, INetworkPrefabInstanceHandlerWithData>();
68+
6369
/// <summary>
6470
/// Links the custom prefab instance's GlobalNetworkObjectId to the original prefab asset's GlobalNetworkObjectId. (Needed for HandleNetworkPrefabDestroy)
6571
/// [PrefabInstance][PrefabAsset]
@@ -101,6 +107,10 @@ public bool AddHandler(uint globalObjectIdHash, INetworkPrefabInstanceHandler in
101107
if (!m_PrefabAssetToPrefabHandler.ContainsKey(globalObjectIdHash))
102108
{
103109
m_PrefabAssetToPrefabHandler.Add(globalObjectIdHash, instanceHandler);
110+
if (instanceHandler is INetworkPrefabInstanceHandlerWithData instanceHandlerWithData)
111+
{
112+
m_PrefabAssetToPrefabHandlerWithData.Add(globalObjectIdHash, instanceHandlerWithData);
113+
}
104114
return true;
105115
}
106116

@@ -202,6 +212,7 @@ public bool RemoveHandler(uint globalObjectIdHash)
202212
m_PrefabInstanceToPrefabAsset.Remove(networkPrefabHashKey);
203213
}
204214

215+
m_PrefabAssetToPrefabHandlerWithData.Remove(globalObjectIdHash);
205216
return m_PrefabAssetToPrefabHandler.Remove(globalObjectIdHash);
206217
}
207218

@@ -234,16 +245,7 @@ public bool RemoveHandler(uint globalObjectIdHash)
234245
/// <returns></returns>
235246
internal bool TryGetHandlerWithData(uint objectHash, out INetworkPrefabInstanceHandlerWithData handler)
236247
{
237-
if (m_PrefabAssetToPrefabHandler.TryGetValue(objectHash, out var prefabInstanceHandler))
238-
{
239-
if (prefabInstanceHandler is INetworkPrefabInstanceHandlerWithData payloadSynchronizer)
240-
{
241-
handler = payloadSynchronizer;
242-
return true;
243-
}
244-
}
245-
handler = null;
246-
return false;
248+
return m_PrefabAssetToPrefabHandlerWithData.TryGetValue(objectHash, out handler);
247249
}
248250

249251
/// <summary>

0 commit comments

Comments
 (0)