Skip to content

Commit 149f1c9

Browse files
committed
feat: Optimize destroy object message
1 parent 711aa02 commit 149f1c9

File tree

1 file changed

+44
-20
lines changed

1 file changed

+44
-20
lines changed

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

Lines changed: 44 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ namespace Unity.Netcode
55
{
66
internal struct DestroyObjectMessage : INetworkMessage, INetworkSerializeByMemcpy
77
{
8-
public int Version => 0;
8+
private const int k_OptimizeDestroyObjectMessage = 1;
9+
public int Version => k_OptimizeDestroyObjectMessage;
910

1011
private const string k_Name = "DestroyObjectMessage";
1112

@@ -19,19 +20,21 @@ internal struct DestroyObjectMessage : INetworkMessage, INetworkSerializeByMemcp
1920

2021
internal bool IsDistributedAuthority;
2122

22-
internal const byte ClientTargetedDestroy = 0x01;
23+
private const byte k_ClientTargetedDestroy = 0x01;
24+
private const byte k_DeferredDespawn = 0x02;
2325

2426
internal bool IsTargetedDestroy
2527
{
26-
get
27-
{
28-
return GetFlag(ClientTargetedDestroy);
29-
}
28+
get => GetFlag(k_ClientTargetedDestroy);
3029

31-
set
32-
{
33-
SetFlag(value, ClientTargetedDestroy);
34-
}
30+
set => SetFlag(value, k_ClientTargetedDestroy);
31+
}
32+
33+
internal bool IsDeferredDespawn
34+
{
35+
get => GetFlag(k_DeferredDespawn);
36+
37+
set => SetFlag(value, k_DeferredDespawn);
3538
}
3639

3740
private bool GetFlag(int flag)
@@ -47,7 +50,11 @@ private void SetFlag(bool set, byte flag)
4750

4851
public void Serialize(FastBufferWriter writer, int targetVersion)
4952
{
53+
// Set deferred despawn flag
54+
IsDeferredDespawn = DeferredDespawnTick > 0;
55+
5056
BytePacker.WriteValueBitPacked(writer, NetworkObjectId);
57+
5158
if (IsDistributedAuthority)
5259
{
5360
writer.WriteByteSafe(m_DestroyFlags);
@@ -56,9 +63,17 @@ public void Serialize(FastBufferWriter writer, int targetVersion)
5663
{
5764
BytePacker.WriteValueBitPacked(writer, TargetClientId);
5865
}
59-
BytePacker.WriteValueBitPacked(writer, DeferredDespawnTick);
66+
67+
if (targetVersion < k_OptimizeDestroyObjectMessage || IsDeferredDespawn)
68+
{
69+
BytePacker.WriteValueBitPacked(writer, DeferredDespawnTick);
70+
}
71+
}
72+
73+
if (targetVersion < k_OptimizeDestroyObjectMessage)
74+
{
75+
writer.WriteValueSafe(DestroyGameObject);
6076
}
61-
writer.WriteValueSafe(DestroyGameObject);
6277
}
6378

6479
public bool Deserialize(FastBufferReader reader, ref NetworkContext context, int receivedMessageVersion)
@@ -77,18 +92,27 @@ public bool Deserialize(FastBufferReader reader, ref NetworkContext context, int
7792
{
7893
ByteUnpacker.ReadValueBitPacked(reader, out TargetClientId);
7994
}
80-
ByteUnpacker.ReadValueBitPacked(reader, out DeferredDespawnTick);
95+
96+
if (receivedMessageVersion < k_OptimizeDestroyObjectMessage || IsDeferredDespawn)
97+
{
98+
ByteUnpacker.ReadValueBitPacked(reader, out DeferredDespawnTick);
99+
}
81100
}
82101

83-
reader.ReadValueSafe(out DestroyGameObject);
102+
if (receivedMessageVersion < k_OptimizeDestroyObjectMessage)
103+
{
104+
reader.ReadValueSafe(out DestroyGameObject);
105+
}
84106

85-
if (!networkManager.SpawnManager.SpawnedObjects.ContainsKey(NetworkObjectId))
107+
if (networkManager.SpawnManager.SpawnedObjects.ContainsKey(NetworkObjectId))
86108
{
87-
// Client-Server mode we always defer where in distributed authority mode we only defer if it is not a targeted destroy
88-
if (!networkManager.DistributedAuthorityMode || (networkManager.DistributedAuthorityMode && !IsTargetedDestroy))
89-
{
90-
networkManager.DeferredMessageManager.DeferMessage(IDeferredNetworkMessageManager.TriggerType.OnSpawn, NetworkObjectId, reader, ref context, k_Name);
91-
}
109+
return true;
110+
}
111+
112+
// Client-Server mode we always defer where in distributed authority mode we only defer if it is not a targeted destroy
113+
if (!networkManager.DistributedAuthorityMode || (networkManager.DistributedAuthorityMode && !IsTargetedDestroy))
114+
{
115+
networkManager.DeferredMessageManager.DeferMessage(IDeferredNetworkMessageManager.TriggerType.OnSpawn, NetworkObjectId, reader, ref context, k_Name);
92116
}
93117
return true;
94118
}

0 commit comments

Comments
 (0)