From ad7f2858a6de737e8bac9cbadd0f95267d535cfc Mon Sep 17 00:00:00 2001 From: Noellie Velez Date: Tue, 25 Nov 2025 23:35:03 +0100 Subject: [PATCH 01/10] Adding todos --- .../Runtime/Messaging/Messages/CreateObjectMessage.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/CreateObjectMessage.cs b/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/CreateObjectMessage.cs index 89fb526a61..d083f5ab7f 100644 --- a/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/CreateObjectMessage.cs +++ b/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/CreateObjectMessage.cs @@ -28,6 +28,8 @@ internal struct CreateObjectMessage : INetworkMessage // to clients that already have the NetworkObject spawned internal ulong NetworkObjectId; + + //TODO Replace all bytes by boolean field private const byte k_IncludesSerializedObject = 0x01; private const byte k_UpdateObservers = 0x02; private const byte k_UpdateNewObservers = 0x04; @@ -87,6 +89,7 @@ private void SetFlag(bool set, byte flag) public void Serialize(FastBufferWriter writer, int targetVersion) { + // TODO Create a byte, see Landed PR, set all the values and then write writer.WriteValueSafe(m_CreateObjectMessageTypeFlags); if (UpdateObservers) @@ -125,6 +128,7 @@ public bool Deserialize(FastBufferReader reader, ref NetworkContext context, int return false; } + // TODO Read a byte, if bool returned reader.ReadValueSafe(out m_CreateObjectMessageTypeFlags); if (UpdateObservers) { From 26f6311aef7577c1f85fcf16abeee977dbd288e0 Mon Sep 17 00:00:00 2001 From: Noellie Velez Date: Thu, 27 Nov 2025 01:29:58 +0100 Subject: [PATCH 02/10] Optimization --- .../Messaging/Messages/CreateObjectMessage.cs | 67 ++++++------------- 1 file changed, 19 insertions(+), 48 deletions(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/CreateObjectMessage.cs b/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/CreateObjectMessage.cs index d083f5ab7f..89f941fce6 100644 --- a/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/CreateObjectMessage.cs +++ b/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/CreateObjectMessage.cs @@ -29,68 +29,38 @@ internal struct CreateObjectMessage : INetworkMessage internal ulong NetworkObjectId; - //TODO Replace all bytes by boolean field private const byte k_IncludesSerializedObject = 0x01; private const byte k_UpdateObservers = 0x02; private const byte k_UpdateNewObservers = 0x04; - private byte m_CreateObjectMessageTypeFlags; - internal bool IncludesSerializedObject - { - get - { - return GetFlag(k_IncludesSerializedObject); - } - - set - { - SetFlag(value, k_IncludesSerializedObject); - } - } - - internal bool UpdateObservers - { - get - { - return GetFlag(k_UpdateObservers); - } + internal bool IncludesSerializedObject; + internal bool UpdateObservers; + internal bool UpdateNewObservers; - set - { - SetFlag(value, k_UpdateObservers); - } - } - - internal bool UpdateNewObservers - { - get - { - return GetFlag(k_UpdateNewObservers); - } - - set - { - SetFlag(value, k_UpdateNewObservers); - } - } - - private bool GetFlag(int flag) + [MethodImpl(MethodImplOptions.AggressiveInlining)] + internal uint GetBitsetRepresentation() { - return (m_CreateObjectMessageTypeFlags & flag) != 0; + uint bitset = 0; + if (IncludesSerializedObject) { bitset |= k_IncludesSerializedObject; } + if (UpdateObservers) { bitset |= k_UpdateObservers; } + if (UpdateNewObservers) { bitset |= k_UpdateNewObservers; } + return bitset; } - private void SetFlag(bool set, byte flag) + [MethodImpl(MethodImplOptions.AggressiveInlining)] + internal void SetStateFromBitset(uint bitset) { - if (set) { m_CreateObjectMessageTypeFlags = (byte)(m_CreateObjectMessageTypeFlags | flag); } - else { m_CreateObjectMessageTypeFlags = (byte)(m_CreateObjectMessageTypeFlags & ~flag); } + IncludesSerializedObject = (bitset & k_IncludesSerializedObject) != 0; + UpdateObservers = (bitset & k_UpdateObservers) != 0; + UpdateNewObservers = (bitset & k_UpdateNewObservers) != 0; } public void Serialize(FastBufferWriter writer, int targetVersion) { - // TODO Create a byte, see Landed PR, set all the values and then write - writer.WriteValueSafe(m_CreateObjectMessageTypeFlags); + uint getBitsetRepresentation = GetBitsetRepresentation(); + writer.WriteValueSafe(getBitsetRepresentation); if (UpdateObservers) { @@ -128,8 +98,9 @@ public bool Deserialize(FastBufferReader reader, ref NetworkContext context, int return false; } - // TODO Read a byte, if bool returned reader.ReadValueSafe(out m_CreateObjectMessageTypeFlags); + SetStateFromBitset(m_CreateObjectMessageTypeFlags); + if (UpdateObservers) { var length = 0; From b15f8a4722d8f5f85ce249284ba69da74bf23695 Mon Sep 17 00:00:00 2001 From: Noellie Velez Date: Thu, 27 Nov 2025 19:46:36 +0100 Subject: [PATCH 03/10] Addressing PR feedback --- .../Messaging/Messages/CreateObjectMessage.cs | 27 +++++-------------- 1 file changed, 6 insertions(+), 21 deletions(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/CreateObjectMessage.cs b/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/CreateObjectMessage.cs index 89f941fce6..07bf6a63bd 100644 --- a/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/CreateObjectMessage.cs +++ b/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/CreateObjectMessage.cs @@ -28,39 +28,22 @@ internal struct CreateObjectMessage : INetworkMessage // to clients that already have the NetworkObject spawned internal ulong NetworkObjectId; - private const byte k_IncludesSerializedObject = 0x01; private const byte k_UpdateObservers = 0x02; private const byte k_UpdateNewObservers = 0x04; - private byte m_CreateObjectMessageTypeFlags; - internal bool IncludesSerializedObject; internal bool UpdateObservers; internal bool UpdateNewObservers; - [MethodImpl(MethodImplOptions.AggressiveInlining)] - internal uint GetBitsetRepresentation() + public void Serialize(FastBufferWriter writer, int targetVersion) { uint bitset = 0; if (IncludesSerializedObject) { bitset |= k_IncludesSerializedObject; } if (UpdateObservers) { bitset |= k_UpdateObservers; } if (UpdateNewObservers) { bitset |= k_UpdateNewObservers; } - return bitset; - } - [MethodImpl(MethodImplOptions.AggressiveInlining)] - internal void SetStateFromBitset(uint bitset) - { - IncludesSerializedObject = (bitset & k_IncludesSerializedObject) != 0; - UpdateObservers = (bitset & k_UpdateObservers) != 0; - UpdateNewObservers = (bitset & k_UpdateNewObservers) != 0; - } - - public void Serialize(FastBufferWriter writer, int targetVersion) - { - uint getBitsetRepresentation = GetBitsetRepresentation(); - writer.WriteValueSafe(getBitsetRepresentation); + writer.WriteValueSafe(bitset); if (UpdateObservers) { @@ -98,8 +81,10 @@ public bool Deserialize(FastBufferReader reader, ref NetworkContext context, int return false; } - reader.ReadValueSafe(out m_CreateObjectMessageTypeFlags); - SetStateFromBitset(m_CreateObjectMessageTypeFlags); + reader.ReadValueSafe(out byte bitset); + IncludesSerializedObject = (bitset & k_IncludesSerializedObject) != 0; + UpdateObservers = (bitset & k_UpdateObservers) != 0; + UpdateNewObservers = (bitset & k_UpdateNewObservers) != 0; if (UpdateObservers) { From 4813d2f670f1f54f9784fa5c3346c765ea24d909 Mon Sep 17 00:00:00 2001 From: Noellie Velez Date: Thu, 27 Nov 2025 19:55:31 +0100 Subject: [PATCH 04/10] Remove empty space --- .../Runtime/Messaging/Messages/CreateObjectMessage.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/CreateObjectMessage.cs b/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/CreateObjectMessage.cs index 07bf6a63bd..8e5a2d59db 100644 --- a/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/CreateObjectMessage.cs +++ b/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/CreateObjectMessage.cs @@ -42,7 +42,6 @@ public void Serialize(FastBufferWriter writer, int targetVersion) if (IncludesSerializedObject) { bitset |= k_IncludesSerializedObject; } if (UpdateObservers) { bitset |= k_UpdateObservers; } if (UpdateNewObservers) { bitset |= k_UpdateNewObservers; } - writer.WriteValueSafe(bitset); if (UpdateObservers) From f38aac1150a9f9ad9d50d7f30453681bfce44d42 Mon Sep 17 00:00:00 2001 From: Noellie Velez Date: Thu, 27 Nov 2025 20:03:10 +0100 Subject: [PATCH 05/10] Update CHANGELOG --- com.unity.netcode.gameobjects/CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/com.unity.netcode.gameobjects/CHANGELOG.md b/com.unity.netcode.gameobjects/CHANGELOG.md index 7105c92dc8..0a315e71db 100644 --- a/com.unity.netcode.gameobjects/CHANGELOG.md +++ b/com.unity.netcode.gameobjects/CHANGELOG.md @@ -18,6 +18,7 @@ Additional documentation and release notes are available at [Multiplayer Documen ### Changed - Improve performance of `NetworkTransformState`. (#3770) +- Improve performance of `CreateObjectMessage`. (#3800) ### Deprecated From 2161c940ee6fe75fd10f7a3a0555ca310efa8b1b Mon Sep 17 00:00:00 2001 From: Noellie Velez Date: Thu, 27 Nov 2025 20:05:37 +0100 Subject: [PATCH 06/10] Fix changelog order --- com.unity.netcode.gameobjects/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.unity.netcode.gameobjects/CHANGELOG.md b/com.unity.netcode.gameobjects/CHANGELOG.md index 0a315e71db..b3ed9c5900 100644 --- a/com.unity.netcode.gameobjects/CHANGELOG.md +++ b/com.unity.netcode.gameobjects/CHANGELOG.md @@ -17,8 +17,8 @@ Additional documentation and release notes are available at [Multiplayer Documen ### Changed -- Improve performance of `NetworkTransformState`. (#3770) - Improve performance of `CreateObjectMessage`. (#3800) +- Improve performance of `NetworkTransformState`. (#3770) ### Deprecated From cd6be7255e533331a9b46067ff5fa17bc256a590 Mon Sep 17 00:00:00 2001 From: Noellie Velez Date: Mon, 1 Dec 2025 16:53:02 +0100 Subject: [PATCH 07/10] Fix changelog order --- com.unity.netcode.gameobjects/CHANGELOG.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/com.unity.netcode.gameobjects/CHANGELOG.md b/com.unity.netcode.gameobjects/CHANGELOG.md index 1f61836922..d2d1ddef31 100644 --- a/com.unity.netcode.gameobjects/CHANGELOG.md +++ b/com.unity.netcode.gameobjects/CHANGELOG.md @@ -21,9 +21,8 @@ Additional documentation and release notes are available at [Multiplayer Documen - Improve performance of `CreateObjectMessage`. (#3800) - First pass of CoreCLR engine API changes. (#3799) -- Changed NetworkAnimator to use the `RpcAttribute` along with the appropriate `SendTo` parameter. (#3586) - Improve performance of `NetworkTransformState`. (#3770) - +- Changed NetworkAnimator to use the `RpcAttribute` along with the appropriate `SendTo` parameter. (#3586) ### Deprecated From 580467e1b5c747647d0bd5902cdfd2fb75c0e658 Mon Sep 17 00:00:00 2001 From: Noellie Velez Date: Mon, 1 Dec 2025 18:20:23 +0100 Subject: [PATCH 08/10] Fix bitset type --- .../Runtime/Messaging/Messages/CreateObjectMessage.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/CreateObjectMessage.cs b/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/CreateObjectMessage.cs index 8e5a2d59db..e8ad1227ea 100644 --- a/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/CreateObjectMessage.cs +++ b/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/CreateObjectMessage.cs @@ -38,7 +38,7 @@ internal struct CreateObjectMessage : INetworkMessage public void Serialize(FastBufferWriter writer, int targetVersion) { - uint bitset = 0; + byte bitset = 0x00; if (IncludesSerializedObject) { bitset |= k_IncludesSerializedObject; } if (UpdateObservers) { bitset |= k_UpdateObservers; } if (UpdateNewObservers) { bitset |= k_UpdateNewObservers; } From 95cfb5b60496ea9783842353f7bb02ff97a0f0f4 Mon Sep 17 00:00:00 2001 From: Noellie Velez Date: Mon, 1 Dec 2025 18:48:55 +0100 Subject: [PATCH 09/10] Use ReadByteSafe instead of ReadValueSafe --- .../Runtime/Messaging/Messages/CreateObjectMessage.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/CreateObjectMessage.cs b/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/CreateObjectMessage.cs index e8ad1227ea..4ced00b51c 100644 --- a/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/CreateObjectMessage.cs +++ b/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/CreateObjectMessage.cs @@ -42,7 +42,7 @@ public void Serialize(FastBufferWriter writer, int targetVersion) if (IncludesSerializedObject) { bitset |= k_IncludesSerializedObject; } if (UpdateObservers) { bitset |= k_UpdateObservers; } if (UpdateNewObservers) { bitset |= k_UpdateNewObservers; } - writer.WriteValueSafe(bitset); + writer.WriteByteSafe(bitset); if (UpdateObservers) { @@ -80,7 +80,7 @@ public bool Deserialize(FastBufferReader reader, ref NetworkContext context, int return false; } - reader.ReadValueSafe(out byte bitset); + reader.ReadByteSafe(out byte bitset); IncludesSerializedObject = (bitset & k_IncludesSerializedObject) != 0; UpdateObservers = (bitset & k_UpdateObservers) != 0; UpdateNewObservers = (bitset & k_UpdateNewObservers) != 0; From 5d63e09d4609ca561550e4bf4386070acdaca12c Mon Sep 17 00:00:00 2001 From: Noellie Velez Date: Mon, 1 Dec 2025 19:05:22 +0100 Subject: [PATCH 10/10] Remove empty space on changelog Was breaking the validation exception on unreleased section --- com.unity.netcode.gameobjects/CHANGELOG.md | 1 - 1 file changed, 1 deletion(-) diff --git a/com.unity.netcode.gameobjects/CHANGELOG.md b/com.unity.netcode.gameobjects/CHANGELOG.md index d2d1ddef31..13c9982f0b 100644 --- a/com.unity.netcode.gameobjects/CHANGELOG.md +++ b/com.unity.netcode.gameobjects/CHANGELOG.md @@ -1,4 +1,3 @@ - # Changelog All notable changes to this project will be documented in this file.