Skip to content

Commit 9bf917b

Browse files
chore: optimize destroy object message (#3801)
* chore: optimize bitflags in DestroyObjectMessage * Update CHANGELOG * Address PR feedback: convert field into local var Co-authored-by: Emma <[email protected]> * Fix: bitset type --------- Co-authored-by: Emma <[email protected]>
1 parent c3d198d commit 9bf917b

File tree

2 files changed

+23
-27
lines changed

2 files changed

+23
-27
lines changed

com.unity.netcode.gameobjects/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ Additional documentation and release notes are available at [Multiplayer Documen
1818

1919
### Changed
2020

21+
- Improve performance of `DestroyObjectMessage`. (#3801)
2122
- Improve performance of `CreateObjectMessage`. (#3800)
2223
- First pass of CoreCLR engine API changes. (#3799)
2324
- Changed when a server is disconnecting a client with a reason it now defers the complete transport disconnect sequence until the end of the frame after the server's transport has sent all pending outbound messages. (#3786)

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

Lines changed: 22 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -13,63 +13,53 @@ internal struct DestroyObjectMessage : INetworkMessage, INetworkSerializeByMemcp
1313

1414
public ulong NetworkObjectId;
1515

16-
private byte m_DestroyFlags;
17-
1816
internal int DeferredDespawnTick;
1917
// Temporary until we make this a list
2018
internal ulong TargetClientId;
2119

2220
internal bool IsDistributedAuthority;
2321

24-
internal bool IsTargetedDestroy
25-
{
26-
get => ByteUtility.GetBit(m_DestroyFlags, 0);
27-
28-
set => ByteUtility.SetBit(ref m_DestroyFlags, 0, value);
29-
}
30-
31-
private bool IsDeferredDespawn
32-
{
33-
get => ByteUtility.GetBit(m_DestroyFlags, 1);
22+
private const byte k_IsTargetedDestroy = 0x01;
23+
private const byte k_IsDeferredDespawn = 0x02;
24+
private const byte k_DestroyGameObject = 0x04;
3425

35-
set => ByteUtility.SetBit(ref m_DestroyFlags, 1, value);
36-
}
26+
internal bool IsTargetedDestroy;
3727

3828
/// <summary>
3929
/// Used to communicate whether to destroy the associated game object.
4030
/// Should be false if the object is InScenePlaced and true otherwise
4131
/// </summary>
42-
public bool DestroyGameObject
43-
{
44-
get => ByteUtility.GetBit(m_DestroyFlags, 2);
45-
46-
set => ByteUtility.SetBit(ref m_DestroyFlags, 2, value);
47-
}
32+
public bool DestroyGameObject;
4833

4934
public void Serialize(FastBufferWriter writer, int targetVersion)
5035
{
5136
// Set deferred despawn flag
52-
IsDeferredDespawn = DeferredDespawnTick > 0;
37+
var isDeferredDespawn = DeferredDespawnTick > 0;
38+
39+
byte bitset = 0x00;
40+
if (IsTargetedDestroy) { bitset |= k_IsTargetedDestroy; }
41+
if (isDeferredDespawn) { bitset |= k_IsDeferredDespawn; }
42+
if (DestroyGameObject) { bitset |= k_DestroyGameObject; }
5343

5444
BytePacker.WriteValueBitPacked(writer, NetworkObjectId);
5545

5646
if (IsDistributedAuthority)
5747
{
58-
writer.WriteByteSafe(m_DestroyFlags);
48+
writer.WriteByteSafe(bitset);
5949

6050
if (IsTargetedDestroy)
6151
{
6252
BytePacker.WriteValueBitPacked(writer, TargetClientId);
6353
}
6454

65-
if (targetVersion < k_OptimizeDestroyObjectMessage || IsDeferredDespawn)
55+
if (targetVersion < k_OptimizeDestroyObjectMessage || isDeferredDespawn)
6656
{
6757
BytePacker.WriteValueBitPacked(writer, DeferredDespawnTick);
6858
}
6959
}
7060
else if (targetVersion >= k_AllowDestroyGameInPlaced)
7161
{
72-
writer.WriteByteSafe(m_DestroyFlags);
62+
writer.WriteByteSafe(bitset);
7363
}
7464

7565
if (targetVersion < k_OptimizeDestroyObjectMessage)
@@ -89,20 +79,25 @@ public bool Deserialize(FastBufferReader reader, ref NetworkContext context, int
8979
ByteUnpacker.ReadValueBitPacked(reader, out NetworkObjectId);
9080
if (networkManager.DistributedAuthorityMode)
9181
{
92-
reader.ReadByteSafe(out m_DestroyFlags);
82+
reader.ReadByteSafe(out byte bitset);
83+
IsTargetedDestroy = (bitset & k_IsTargetedDestroy) != 0;
84+
var isDeferredDespawn = (bitset & k_IsDeferredDespawn) != 0;
85+
DestroyGameObject = (bitset & k_DestroyGameObject) != 0;
86+
9387
if (IsTargetedDestroy)
9488
{
9589
ByteUnpacker.ReadValueBitPacked(reader, out TargetClientId);
9690
}
9791

98-
if (receivedMessageVersion < k_OptimizeDestroyObjectMessage || IsDeferredDespawn)
92+
if (receivedMessageVersion < k_OptimizeDestroyObjectMessage || isDeferredDespawn)
9993
{
10094
ByteUnpacker.ReadValueBitPacked(reader, out DeferredDespawnTick);
10195
}
10296
}
10397
else if (receivedMessageVersion >= k_AllowDestroyGameInPlaced)
10498
{
105-
reader.ReadByteSafe(out m_DestroyFlags);
99+
reader.ReadByteSafe(out byte bitset);
100+
DestroyGameObject = (bitset & k_DestroyGameObject) != 0;
106101
}
107102

108103
if (receivedMessageVersion < k_OptimizeDestroyObjectMessage)

0 commit comments

Comments
 (0)