Skip to content

Commit e949e11

Browse files
committed
chore: start optimize work + renamed SceneObject
1 parent 33df318 commit e949e11

File tree

7 files changed

+143
-142
lines changed

7 files changed

+143
-142
lines changed

com.unity.netcode.gameobjects/Runtime/Connection/NetworkConnectionManager.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1119,15 +1119,15 @@ internal void ApprovedPlayerSpawn(ulong clientId, uint playerPrefabHash)
11191119

11201120
var message = new CreateObjectMessage
11211121
{
1122-
ObjectInfo = ConnectedClients[clientId].PlayerObject.GetMessageSceneObject(clientPair.Key),
1122+
ObjectSynchronizerInfo = ConnectedClients[clientId].PlayerObject.GetMessageForSynchronization(clientPair.Key),
11231123
IncludesSerializedObject = true,
11241124
};
11251125

1126-
message.ObjectInfo.Hash = playerPrefabHash;
1127-
message.ObjectInfo.IsSceneObject = false;
1128-
message.ObjectInfo.HasParent = false;
1129-
message.ObjectInfo.IsPlayerObject = true;
1130-
message.ObjectInfo.OwnerClientId = clientId;
1126+
message.ObjectSynchronizerInfo.Hash = playerPrefabHash;
1127+
message.ObjectSynchronizerInfo.IsSceneObject = false;
1128+
message.ObjectSynchronizerInfo.HasParent = false;
1129+
message.ObjectSynchronizerInfo.IsPlayerObject = true;
1130+
message.ObjectSynchronizerInfo.OwnerClientId = clientId;
11311131
var size = SendMessage(ref message, MessageDeliveryType<CreateObjectMessage>.DefaultDelivery, clientPair.Key);
11321132
NetworkManager.NetworkMetrics.TrackObjectSpawnSent(clientPair.Key, ConnectedClients[clientId].PlayerObject, size);
11331133
}

com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs

Lines changed: 74 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -2828,87 +2828,88 @@ public NetworkBehaviour GetNetworkBehaviourAtOrderIndex(ushort index)
28282828
return ChildNetworkBehaviours[index];
28292829
}
28302830

2831-
internal struct SceneObject
2831+
internal struct NetworkObjectSynchronizer
28322832
{
28332833
private ushort m_BitField;
28342834
public uint Hash;
28352835
public ulong NetworkObjectId;
28362836
public ulong OwnerClientId;
28372837
public ushort OwnershipFlags;
28382838

2839-
public bool IsPlayerObject
2840-
{
2841-
get => ByteUtility.GetBit(m_BitField, 0);
2842-
set => ByteUtility.SetBit(ref m_BitField, 0, value);
2843-
}
2844-
public bool HasParent
2845-
{
2846-
get => ByteUtility.GetBit(m_BitField, 1);
2847-
set => ByteUtility.SetBit(ref m_BitField, 1, value);
2848-
}
2849-
public bool IsSceneObject
2850-
{
2851-
get => ByteUtility.GetBit(m_BitField, 2);
2852-
set => ByteUtility.SetBit(ref m_BitField, 2, value);
2853-
}
2854-
public bool HasTransform
2855-
{
2856-
get => ByteUtility.GetBit(m_BitField, 3);
2857-
set => ByteUtility.SetBit(ref m_BitField, 3, value);
2858-
}
2839+
private const ushort k_IsPlayerObject = 0x001;
2840+
private const ushort k_HasParent = 0x002;
2841+
private const ushort k_IsSceneObject = 0x004;
2842+
private const ushort k_HasTransform = 0x008;
2843+
private const ushort k_IsLatestParentSet = 0x010;
2844+
private const ushort k_WorldPositionStays = 0x020;
2845+
private const ushort k_DestroyWithScene = 0x040;
2846+
private const ushort k_DontDestroyWithOwner = 0x080;
2847+
private const ushort k_HasOwnershipFlags = 0x100;
2848+
private const ushort k_SyncObservers = 0x200;
2849+
private const ushort k_SpawnWithObservers = 0x400;
2850+
private const ushort k_HasInstantiationData = 0x800;
28592851

2860-
public bool IsLatestParentSet
2861-
{
2862-
get => ByteUtility.GetBit(m_BitField, 4);
2863-
set => ByteUtility.SetBit(ref m_BitField, 4, value);
2864-
}
2852+
public bool IsPlayerObject;
2853+
public bool HasParent;
2854+
public bool IsSceneObject;
2855+
public bool HasTransform;
28652856

2866-
public bool WorldPositionStays
2867-
{
2868-
get => ByteUtility.GetBit(m_BitField, 5);
2869-
set => ByteUtility.SetBit(ref m_BitField, 5, value);
2870-
}
2857+
public bool IsLatestParentSet;
2858+
2859+
public bool WorldPositionStays;
28712860

28722861
/// <summary>
28732862
/// Even though the server sends notifications for NetworkObjects that get
28742863
/// destroyed when a scene is unloaded, we want to synchronize this so
28752864
/// the client side can use it as part of a filter for automatically migrating
28762865
/// to the current active scene when its scene is unloaded. (only for dynamically spawned)
28772866
/// </summary>
2878-
public bool DestroyWithScene
2879-
{
2880-
get => ByteUtility.GetBit(m_BitField, 6);
2881-
set => ByteUtility.SetBit(ref m_BitField, 6, value);
2882-
}
2867+
public bool DestroyWithScene;
28832868

2884-
public bool DontDestroyWithOwner
2885-
{
2886-
get => ByteUtility.GetBit(m_BitField, 7);
2887-
set => ByteUtility.SetBit(ref m_BitField, 7, value);
2888-
}
2869+
public bool DontDestroyWithOwner;
28892870

2890-
public bool HasOwnershipFlags
2891-
{
2892-
get => ByteUtility.GetBit(m_BitField, 8);
2893-
set => ByteUtility.SetBit(ref m_BitField, 8, value);
2894-
}
2871+
public bool HasOwnershipFlags;
28952872

2896-
public bool SyncObservers
2897-
{
2898-
get => ByteUtility.GetBit(m_BitField, 9);
2899-
set => ByteUtility.SetBit(ref m_BitField, 9, value);
2900-
}
2873+
public bool SyncObservers;
2874+
2875+
public bool SpawnWithObservers;
2876+
2877+
public bool HasInstantiationData;
29012878

2902-
public bool SpawnWithObservers
2879+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
2880+
internal ushort GetBitsetRepresentation()
29032881
{
2904-
get => ByteUtility.GetBit(m_BitField, 10);
2905-
set => ByteUtility.SetBit(ref m_BitField, 10, value);
2882+
ushort bitset = 0;
2883+
if(IsPlayerObject) { bitset |= k_IsPlayerObject; };
2884+
if(HasParent) { bitset |= k_HasParent; };
2885+
if(IsSceneObject) { bitset |= k_IsSceneObject; };
2886+
if(HasTransform) { bitset |= k_HasTransform; };
2887+
if(IsLatestParentSet) { bitset |= k_IsLatestParentSet; };
2888+
if(WorldPositionStays) { bitset |= k_WorldPositionStays; };
2889+
if(DestroyWithScene) { bitset |= k_DestroyWithScene; };
2890+
if(DontDestroyWithOwner) { bitset |= k_DontDestroyWithOwner; };
2891+
if(HasOwnershipFlags) { bitset |= k_HasOwnershipFlags; };
2892+
if(SyncObservers) { bitset |= k_SyncObservers; };
2893+
if(SpawnWithObservers) { bitset |= k_SpawnWithObservers; };
2894+
if(HasInstantiationData) { bitset |= k_HasInstantiationData; };
2895+
return bitset;
29062896
}
29072897

2908-
public bool HasInstantiationData
2898+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
2899+
internal void SetStateFromBitset(ushort bitset)
29092900
{
2910-
get => ByteUtility.GetBit(m_BitField, 11);
2911-
set => ByteUtility.SetBit(ref m_BitField, 11, value);
2901+
IsPlayerObject = (bitset & k_IsPlayerObject) != 0;
2902+
HasParent = (bitset & k_HasParent) != 0;
2903+
IsSceneObject = (bitset & k_IsSceneObject) != 0;
2904+
HasTransform = (bitset & k_HasTransform) != 0;
2905+
IsLatestParentSet = (bitset & k_IsLatestParentSet) != 0;
2906+
WorldPositionStays = (bitset & k_WorldPositionStays) != 0;
2907+
DestroyWithScene = (bitset & k_DestroyWithScene) != 0;
2908+
DontDestroyWithOwner = (bitset & k_DontDestroyWithOwner) != 0;
2909+
HasOwnershipFlags = (bitset & k_HasOwnershipFlags) != 0;
2910+
SyncObservers = (bitset & k_SyncObservers) != 0;
2911+
SpawnWithObservers = (bitset & k_SpawnWithObservers) != 0;
2912+
HasInstantiationData = (bitset & k_HasInstantiationData) != 0;
29122913
}
29132914

29142915
// When handling the initial synchronization of NetworkObjects,
@@ -3155,9 +3156,9 @@ internal void SynchronizeNetworkBehaviours<T>(ref BufferSerializer<T> serializer
31553156
}
31563157
}
31573158

3158-
internal SceneObject GetMessageSceneObject(ulong targetClientId = NetworkManager.ServerClientId, bool syncObservers = false)
3159+
internal NetworkObjectSynchronizer GetMessageForSynchronization(ulong targetClientId = NetworkManager.ServerClientId, bool syncObservers = false)
31593160
{
3160-
var obj = new SceneObject
3161+
var obj = new NetworkObjectSynchronizer
31613162
{
31623163
HasParent = transform.parent != null,
31633164
WorldPositionStays = m_CachedWorldPositionStays,
@@ -3211,7 +3212,7 @@ internal SceneObject GetMessageSceneObject(ulong targetClientId = NetworkManager
32113212
syncScaleLocalSpaceRelative = obj.HasParent;
32123213
}
32133214

3214-
obj.Transform = new SceneObject.TransformData
3215+
obj.Transform = new NetworkObjectSynchronizer.TransformData
32153216
{
32163217
// If we are parented and we have the m_CachedWorldPositionStays disabled, then use local space
32173218
// values as opposed world space values.
@@ -3230,35 +3231,35 @@ internal SceneObject GetMessageSceneObject(ulong targetClientId = NetworkManager
32303231
}
32313232

32323233
/// <summary>
3233-
/// Used to deserialize a serialized scene object which occurs
3234+
/// Used to deserialize a serialized <see cref="NetworkObjectSynchronizer"/> which occurs
32343235
/// when the client is approved or during a scene transition
32353236
/// </summary>
3236-
/// <param name="sceneObject">Deserialized scene object data</param>
3237+
/// <param name="networkObjectSynchronizer">Deserialized scene object data</param>
32373238
/// <param name="reader">FastBufferReader for the NetworkVariable data</param>
32383239
/// <param name="networkManager">NetworkManager instance</param>
32393240
/// <param name="invokedByMessage">will be true if invoked by CreateObjectMessage</param>
32403241
/// <returns>The deserialized NetworkObject or null if deserialization failed</returns>
3241-
internal static NetworkObject AddSceneObject(in SceneObject sceneObject, FastBufferReader reader, NetworkManager networkManager, bool invokedByMessage = false)
3242+
internal static NetworkObject AddClientNetworkObject(in NetworkObjectSynchronizer networkObjectSynchronizer, FastBufferReader reader, NetworkManager networkManager, bool invokedByMessage = false)
32423243
{
3243-
var endOfSynchronizationData = reader.Position + sceneObject.SynchronizationDataSize;
3244+
var endOfSynchronizationData = reader.Position + networkObjectSynchronizer.SynchronizationDataSize;
32443245

32453246
byte[] instantiationData = null;
3246-
if (sceneObject.HasInstantiationData)
3247+
if (networkObjectSynchronizer.HasInstantiationData)
32473248
{
32483249
reader.ReadValueSafe(out instantiationData);
32493250
}
32503251

32513252

32523253
// Attempt to create a local NetworkObject
3253-
var networkObject = networkManager.SpawnManager.CreateLocalNetworkObject(sceneObject, instantiationData);
3254+
var networkObject = networkManager.SpawnManager.CreateLocalNetworkObject(networkObjectSynchronizer, instantiationData);
32543255

32553256

32563257
if (networkObject == null)
32573258
{
32583259
// Log the error that the NetworkObject failed to construct
32593260
if (networkManager.LogLevel <= LogLevel.Normal)
32603261
{
3261-
NetworkLog.LogError($"Failed to spawn {nameof(NetworkObject)} for Hash {sceneObject.Hash}.");
3262+
NetworkLog.LogError($"Failed to spawn {nameof(NetworkObject)} for Hash {networkObjectSynchronizer.Hash}.");
32623263
}
32633264

32643265
try
@@ -3279,7 +3280,7 @@ internal static NetworkObject AddSceneObject(in SceneObject sceneObject, FastBuf
32793280

32803281
// This will get set again when the NetworkObject is spawned locally, but we set it here ahead of spawning
32813282
// in order to be able to determine which NetworkVariables the client will be allowed to read.
3282-
networkObject.OwnerClientId = sceneObject.OwnerClientId;
3283+
networkObject.OwnerClientId = networkObjectSynchronizer.OwnerClientId;
32833284

32843285
// Special Case: Invoke NetworkBehaviour.OnPreSpawn methods here before SynchronizeNetworkBehaviours
32853286
networkObject.InvokeBehaviourNetworkPreSpawn();
@@ -3307,7 +3308,7 @@ internal static NetworkObject AddSceneObject(in SceneObject sceneObject, FastBuf
33073308
// being told we do not have a parent, then we want to clear the latest parent so it is not automatically
33083309
// "re-parented" to the original parent. This can happen if not unloading the scene and the parenting of
33093310
// the in-scene placed Networkobject changes several times over different sessions.
3310-
if (sceneObject.IsSceneObject && !sceneObject.HasParent && networkObject.m_LatestParent.HasValue)
3311+
if (networkObjectSynchronizer.IsSceneObject && !networkObjectSynchronizer.HasParent && networkObject.m_LatestParent.HasValue)
33113312
{
33123313
networkObject.m_LatestParent = null;
33133314
}
@@ -3320,19 +3321,19 @@ internal static NetworkObject AddSceneObject(in SceneObject sceneObject, FastBuf
33203321

33213322
// Invoke the non-authority local spawn method
33223323
// (It also invokes post spawn and handles processing derferred messages)
3323-
networkManager.SpawnManager.NonAuthorityLocalSpawn(networkObject, sceneObject, sceneObject.DestroyWithScene);
3324+
networkManager.SpawnManager.NonAuthorityLocalSpawn(networkObject, networkObjectSynchronizer, networkObjectSynchronizer.DestroyWithScene);
33243325

3325-
if (sceneObject.SyncObservers)
3326+
if (networkObjectSynchronizer.SyncObservers)
33263327
{
3327-
foreach (var observer in sceneObject.Observers)
3328+
foreach (var observer in networkObjectSynchronizer.Observers)
33283329
{
33293330
networkObject.Observers.Add(observer);
33303331
}
33313332
}
33323333

33333334
if (networkManager.DistributedAuthorityMode)
33343335
{
3335-
networkObject.SpawnWithObservers = sceneObject.SpawnWithObservers;
3336+
networkObject.SpawnWithObservers = networkObjectSynchronizer.SpawnWithObservers;
33363337
}
33373338

33383339
// If this was not invoked by a message handler, we are in distributed authority mode, and we are spawning with observers or

com.unity.netcode.gameobjects/Runtime/Messaging/Messages/ConnectionApprovedMessage.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ public void Serialize(FastBufferWriter writer, int targetVersion)
160160
{
161161
sobj.Observers.Add(OwnerClientId);
162162
// In distributed authority mode, we send the currently known observers of each NetworkObject to the client being synchronized.
163-
var sceneObject = sobj.GetMessageSceneObject(OwnerClientId, IsDistributedAuthority);
163+
var sceneObject = sobj.GetMessageForSynchronization(OwnerClientId, IsDistributedAuthority);
164164
sceneObject.Serialize(writer);
165165
++sceneObjectCount;
166166
}
@@ -342,9 +342,9 @@ public void Handle(ref NetworkContext context)
342342
// to create a list to hold the data. This is a breach of convention for performance reasons.
343343
for (ushort i = 0; i < sceneObjectCount; i++)
344344
{
345-
var sceneObject = new NetworkObject.SceneObject();
345+
var sceneObject = new NetworkObject.NetworkObjectSynchronizer();
346346
sceneObject.Deserialize(m_ReceivedSceneObjectData);
347-
NetworkObject.AddSceneObject(sceneObject, m_ReceivedSceneObjectData, networkManager);
347+
NetworkObject.AddClientNetworkObject(sceneObject, m_ReceivedSceneObjectData, networkManager);
348348
}
349349

350350
if (networkManager.AutoSpawnPlayerPrefabClientSide)

0 commit comments

Comments
 (0)