Skip to content

Commit 7b239f2

Browse files
authored
feat: Optimize DestroyObject message (#3304)
* feat: Optimize destroy object message * CHANGELOG.md * Add summary to DestroyGameObject parameter
1 parent 711aa02 commit 7b239f2

File tree

2 files changed

+50
-20
lines changed

2 files changed

+50
-20
lines changed

com.unity.netcode.gameobjects/CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ Additional documentation and release notes are available at [Multiplayer Documen
2424

2525
### Changed
2626

27+
- Changed the `DestroyObject` message to reduce the serialized message size and remove the unnecessary message field. (#3304)
2728
- Changed the `NetworkTimeSystem.Sync` method to use half RTT to calculate the desired local time offset as opposed to the full RTT. (#3212)
2829

2930
## [2.2.0] - 2024-12-12

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

+49-20
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,17 @@ 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

1213
public ulong NetworkObjectId;
14+
15+
/// <summary>
16+
/// Used to communicate whether to destroy the associated game object.
17+
/// Should be false if the object is InScenePlaced and true otherwise
18+
/// </summary>
1319
public bool DestroyGameObject;
1420
private byte m_DestroyFlags;
1521

@@ -19,19 +25,21 @@ internal struct DestroyObjectMessage : INetworkMessage, INetworkSerializeByMemcp
1925

2026
internal bool IsDistributedAuthority;
2127

22-
internal const byte ClientTargetedDestroy = 0x01;
28+
private const byte k_ClientTargetedDestroy = 0x01;
29+
private const byte k_DeferredDespawn = 0x02;
2330

2431
internal bool IsTargetedDestroy
2532
{
26-
get
27-
{
28-
return GetFlag(ClientTargetedDestroy);
29-
}
33+
get => GetFlag(k_ClientTargetedDestroy);
3034

31-
set
32-
{
33-
SetFlag(value, ClientTargetedDestroy);
34-
}
35+
set => SetFlag(value, k_ClientTargetedDestroy);
36+
}
37+
38+
private bool IsDeferredDespawn
39+
{
40+
get => GetFlag(k_DeferredDespawn);
41+
42+
set => SetFlag(value, k_DeferredDespawn);
3543
}
3644

3745
private bool GetFlag(int flag)
@@ -47,7 +55,11 @@ private void SetFlag(bool set, byte flag)
4755

4856
public void Serialize(FastBufferWriter writer, int targetVersion)
4957
{
58+
// Set deferred despawn flag
59+
IsDeferredDespawn = DeferredDespawnTick > 0;
60+
5061
BytePacker.WriteValueBitPacked(writer, NetworkObjectId);
62+
5163
if (IsDistributedAuthority)
5264
{
5365
writer.WriteByteSafe(m_DestroyFlags);
@@ -56,9 +68,17 @@ public void Serialize(FastBufferWriter writer, int targetVersion)
5668
{
5769
BytePacker.WriteValueBitPacked(writer, TargetClientId);
5870
}
59-
BytePacker.WriteValueBitPacked(writer, DeferredDespawnTick);
71+
72+
if (targetVersion < k_OptimizeDestroyObjectMessage || IsDeferredDespawn)
73+
{
74+
BytePacker.WriteValueBitPacked(writer, DeferredDespawnTick);
75+
}
76+
}
77+
78+
if (targetVersion < k_OptimizeDestroyObjectMessage)
79+
{
80+
writer.WriteValueSafe(DestroyGameObject);
6081
}
61-
writer.WriteValueSafe(DestroyGameObject);
6282
}
6383

6484
public bool Deserialize(FastBufferReader reader, ref NetworkContext context, int receivedMessageVersion)
@@ -77,18 +97,27 @@ public bool Deserialize(FastBufferReader reader, ref NetworkContext context, int
7797
{
7898
ByteUnpacker.ReadValueBitPacked(reader, out TargetClientId);
7999
}
80-
ByteUnpacker.ReadValueBitPacked(reader, out DeferredDespawnTick);
100+
101+
if (receivedMessageVersion < k_OptimizeDestroyObjectMessage || IsDeferredDespawn)
102+
{
103+
ByteUnpacker.ReadValueBitPacked(reader, out DeferredDespawnTick);
104+
}
81105
}
82106

83-
reader.ReadValueSafe(out DestroyGameObject);
107+
if (receivedMessageVersion < k_OptimizeDestroyObjectMessage)
108+
{
109+
reader.ReadValueSafe(out DestroyGameObject);
110+
}
84111

85-
if (!networkManager.SpawnManager.SpawnedObjects.ContainsKey(NetworkObjectId))
112+
if (networkManager.SpawnManager.SpawnedObjects.ContainsKey(NetworkObjectId))
86113
{
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-
}
114+
return true;
115+
}
116+
117+
// Client-Server mode we always defer where in distributed authority mode we only defer if it is not a targeted destroy
118+
if (!networkManager.DistributedAuthorityMode || (networkManager.DistributedAuthorityMode && !IsTargetedDestroy))
119+
{
120+
networkManager.DeferredMessageManager.DeferMessage(IDeferredNetworkMessageManager.TriggerType.OnSpawn, NetworkObjectId, reader, ref context, k_Name);
92121
}
93122
return true;
94123
}

0 commit comments

Comments
 (0)