Skip to content

Commit 159d1ab

Browse files
committed
Start optimizing destroy object message
1 parent 18af9d6 commit 159d1ab

File tree

1 file changed

+33
-21
lines changed

1 file changed

+33
-21
lines changed

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

Lines changed: 33 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,12 @@ internal struct DestroyObjectMessage : INetworkMessage, INetworkSerializeByMemcp
77
{
88
private const int k_OptimizeDestroyObjectMessage = 1;
99
private const int k_AllowDestroyGameInPlaced = 2;
10+
1011
public int Version => k_AllowDestroyGameInPlaced;
1112

1213
private const string k_Name = "DestroyObjectMessage";
1314

1415
public ulong NetworkObjectId;
15-
1616
private byte m_DestroyFlags;
1717

1818
internal int DeferredDespawnTick;
@@ -21,55 +21,64 @@ internal struct DestroyObjectMessage : INetworkMessage, INetworkSerializeByMemcp
2121

2222
internal bool IsDistributedAuthority;
2323

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);
24+
private const byte k_IsTargetedDestroy = 0x01;
25+
private const byte k_IsDeferredDespawn = 0x02;
26+
private const byte k_DestroyGameObject = 0x04;
3427

35-
set => ByteUtility.SetBit(ref m_DestroyFlags, 1, value);
36-
}
28+
internal bool IsTargetedDestroy; // Get bit [(bitField & (1 << bitPosition)) != 0;] with bitPosition= 0
29+
// set (byte)((bitField & ~(1 << bitPosition)) | (ToByte(value) << bitPosition))
30+
private bool m_IsDeferredDespawn; // 1
3731

3832
/// <summary>
3933
/// Used to communicate whether to destroy the associated game object.
4034
/// Should be false if the object is InScenePlaced and true otherwise
4135
/// </summary>
42-
public bool DestroyGameObject
36+
public bool DestroyGameObject; // 2
37+
38+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
39+
internal uint GetBitsetRepresentation()
4340
{
44-
get => ByteUtility.GetBit(m_DestroyFlags, 2);
41+
uint bitset = 0;
42+
if (IsTargetedDestroy) { bitset |= k_IsTargetedDestroy; }
43+
if (m_IsDeferredDespawn) { bitset |= k_IsDeferredDespawn; }
44+
if (DestroyGameObject) { bitset |= k_DestroyGameObject; }
45+
return bitset;
46+
}
4547

46-
set => ByteUtility.SetBit(ref m_DestroyFlags, 2, value);
48+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
49+
internal void SetStateFromBitset(uint bitset)
50+
{
51+
IsTargetedDestroy = (bitset & k_IsTargetedDestroy) != 0;
52+
m_IsDeferredDespawn = (bitset & k_IsDeferredDespawn) != 0;
53+
DestroyGameObject = (bitset & k_DestroyGameObject) != 0;
4754
}
4855

4956
public void Serialize(FastBufferWriter writer, int targetVersion)
5057
{
5158
// Set deferred despawn flag
52-
IsDeferredDespawn = DeferredDespawnTick > 0;
59+
m_IsDeferredDespawn = DeferredDespawnTick > 0;
60+
61+
uint getBitsetRepresentation = GetBitsetRepresentation();
5362

5463
BytePacker.WriteValueBitPacked(writer, NetworkObjectId);
5564

5665
if (IsDistributedAuthority)
5766
{
58-
writer.WriteByteSafe(m_DestroyFlags);
67+
writer.WriteValueSafe(getBitsetRepresentation);
5968

6069
if (IsTargetedDestroy)
6170
{
6271
BytePacker.WriteValueBitPacked(writer, TargetClientId);
6372
}
6473

65-
if (targetVersion < k_OptimizeDestroyObjectMessage || IsDeferredDespawn)
74+
if (targetVersion < k_OptimizeDestroyObjectMessage || m_IsDeferredDespawn)
6675
{
6776
BytePacker.WriteValueBitPacked(writer, DeferredDespawnTick);
6877
}
6978
}
7079
else if (targetVersion >= k_AllowDestroyGameInPlaced)
7180
{
72-
writer.WriteByteSafe(m_DestroyFlags);
81+
writer.WriteValueSafe(getBitsetRepresentation);
7382
}
7483

7584
if (targetVersion < k_OptimizeDestroyObjectMessage)
@@ -90,19 +99,22 @@ public bool Deserialize(FastBufferReader reader, ref NetworkContext context, int
9099
if (networkManager.DistributedAuthorityMode)
91100
{
92101
reader.ReadByteSafe(out m_DestroyFlags);
102+
SetStateFromBitset(m_DestroyFlags);
103+
93104
if (IsTargetedDestroy)
94105
{
95106
ByteUnpacker.ReadValueBitPacked(reader, out TargetClientId);
96107
}
97108

98-
if (receivedMessageVersion < k_OptimizeDestroyObjectMessage || IsDeferredDespawn)
109+
if (receivedMessageVersion < k_OptimizeDestroyObjectMessage || m_IsDeferredDespawn)
99110
{
100111
ByteUnpacker.ReadValueBitPacked(reader, out DeferredDespawnTick);
101112
}
102113
}
103114
else if (receivedMessageVersion >= k_AllowDestroyGameInPlaced)
104115
{
105116
reader.ReadByteSafe(out m_DestroyFlags);
117+
SetStateFromBitset(m_DestroyFlags);
106118
}
107119

108120
if (receivedMessageVersion < k_OptimizeDestroyObjectMessage)

0 commit comments

Comments
 (0)