diff --git a/com.unity.netcode.gameobjects/CHANGELOG.md b/com.unity.netcode.gameobjects/CHANGELOG.md index 46c5d0b495..f4b0bfc60e 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 `CreateObjectMessage`. (#3800) - First pass of CoreCLR engine API changes. (#3799) - 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) - Improve performance of `NetworkTransformState`. (#3770) diff --git a/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/CreateObjectMessage.cs b/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/CreateObjectMessage.cs index 89fb526a61..4ced00b51c 100644 --- a/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/CreateObjectMessage.cs +++ b/com.unity.netcode.gameobjects/Runtime/Messaging/Messages/CreateObjectMessage.cs @@ -32,62 +32,17 @@ internal struct CreateObjectMessage : INetworkMessage 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); - } - - set - { - SetFlag(value, k_UpdateObservers); - } - } - - internal bool UpdateNewObservers - { - get - { - return GetFlag(k_UpdateNewObservers); - } - - set - { - SetFlag(value, k_UpdateNewObservers); - } - } - - private bool GetFlag(int flag) - { - return (m_CreateObjectMessageTypeFlags & flag) != 0; - } - - private void SetFlag(bool set, byte flag) - { - if (set) { m_CreateObjectMessageTypeFlags = (byte)(m_CreateObjectMessageTypeFlags | flag); } - else { m_CreateObjectMessageTypeFlags = (byte)(m_CreateObjectMessageTypeFlags & ~flag); } - } + internal bool IncludesSerializedObject; + internal bool UpdateObservers; + internal bool UpdateNewObservers; public void Serialize(FastBufferWriter writer, int targetVersion) { - writer.WriteValueSafe(m_CreateObjectMessageTypeFlags); + byte bitset = 0x00; + if (IncludesSerializedObject) { bitset |= k_IncludesSerializedObject; } + if (UpdateObservers) { bitset |= k_UpdateObservers; } + if (UpdateNewObservers) { bitset |= k_UpdateNewObservers; } + writer.WriteByteSafe(bitset); if (UpdateObservers) { @@ -125,7 +80,11 @@ public bool Deserialize(FastBufferReader reader, ref NetworkContext context, int return false; } - reader.ReadValueSafe(out m_CreateObjectMessageTypeFlags); + reader.ReadByteSafe(out byte bitset); + IncludesSerializedObject = (bitset & k_IncludesSerializedObject) != 0; + UpdateObservers = (bitset & k_UpdateObservers) != 0; + UpdateNewObservers = (bitset & k_UpdateNewObservers) != 0; + if (UpdateObservers) { var length = 0;