From 9ce602619269f8fe9bcacd746ce191fcd83bb8c9 Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Tue, 2 Jun 2026 14:07:28 +0200 Subject: [PATCH] Optimize model actors entries serialization --- .../Graphics/Models/ModelInstanceEntry.cpp | 18 +++++++++++++----- .../Graphics/Models/ModelInstanceEntry.h | 1 + Source/Engine/Level/Actors/AnimatedModel.cpp | 7 ++----- Source/Engine/Level/Actors/SplineModel.cpp | 7 ++----- Source/Engine/Level/Actors/StaticModel.cpp | 6 ++---- 5 files changed, 20 insertions(+), 19 deletions(-) diff --git a/Source/Engine/Graphics/Models/ModelInstanceEntry.cpp b/Source/Engine/Graphics/Models/ModelInstanceEntry.cpp index 1c9440b39..6f8ace8d7 100644 --- a/Source/Engine/Graphics/Models/ModelInstanceEntry.cpp +++ b/Source/Engine/Graphics/Models/ModelInstanceEntry.cpp @@ -21,6 +21,13 @@ bool ModelInstanceEntries::HasContentLoaded() const return result; } +bool ModelInstanceEntries::ShouldSerialize(const void* otherObj) const +{ + if (!otherObj) + return true; + return !(*this == *(const ModelInstanceEntries*)otherObj); +} + void ModelInstanceEntries::Serialize(SerializeStream& stream, const void* otherObj) { SERIALIZE_GET_OTHER_OBJ(ModelInstanceEntries); @@ -43,12 +50,13 @@ void ModelInstanceEntries::Serialize(SerializeStream& stream, const void* otherO void ModelInstanceEntries::Deserialize(DeserializeStream& stream, ISerializeModifier* modifier) { PROFILE_MEM(Graphics); - const DeserializeStream& entries = stream["Entries"]; - ASSERT(entries.IsArray()); - Resize(entries.Size()); - for (rapidjson::SizeType i = 0; i < entries.Size(); i++) + const DeserializeStream& entriesData = stream[DeserializeStream::GenericValue(rapidjson::StringRef("Entries", 7))]; + CHECK(entriesData.IsArray()); + Resize(entriesData.Size()); + ModelInstanceEntry* entries = Get(); + for (int32 i = 0; i < Count(); i++) { - At(i).Deserialize((DeserializeStream&)entries[i], modifier); + entries[i].Deserialize((DeserializeStream&)entriesData[i], modifier); } } diff --git a/Source/Engine/Graphics/Models/ModelInstanceEntry.h b/Source/Engine/Graphics/Models/ModelInstanceEntry.h index 8f8a2ca3c..79403cce1 100644 --- a/Source/Engine/Graphics/Models/ModelInstanceEntry.h +++ b/Source/Engine/Graphics/Models/ModelInstanceEntry.h @@ -115,6 +115,7 @@ public: public: // [ISerializable] + bool ShouldSerialize(const void* otherObj) const override; void Serialize(SerializeStream& stream, const void* otherObj) override; void Deserialize(DeserializeStream& stream, ISerializeModifier* modifier) override; }; diff --git a/Source/Engine/Level/Actors/AnimatedModel.cpp b/Source/Engine/Level/Actors/AnimatedModel.cpp index bc3c5b8fb..ba3a2025d 100644 --- a/Source/Engine/Level/Actors/AnimatedModel.cpp +++ b/Source/Engine/Level/Actors/AnimatedModel.cpp @@ -1262,9 +1262,7 @@ void AnimatedModel::Serialize(SerializeStream& stream, const void* otherObj) SERIALIZE(ShadowsMode); PRAGMA_ENABLE_DEPRECATION_WARNINGS SERIALIZE(RootMotionTarget); - - stream.JKEY("Buffer"); - stream.Object(&Entries, other ? &other->Entries : nullptr); + SERIALIZE_MEMBER(Buffer, Entries); } void AnimatedModel::Deserialize(DeserializeStream& stream, ISerializeModifier* modifier) @@ -1289,8 +1287,7 @@ void AnimatedModel::Deserialize(DeserializeStream& stream, ISerializeModifier* m DESERIALIZE(ShadowsMode); PRAGMA_ENABLE_DEPRECATION_WARNINGS DESERIALIZE(RootMotionTarget); - - Entries.DeserializeIfExists(stream, "Buffer", modifier); + DESERIALIZE_MEMBER(Buffer, Entries); // [Deprecated on 07.02.2022, expires on 07.02.2024] if (modifier->EngineBuild <= 6330) diff --git a/Source/Engine/Level/Actors/SplineModel.cpp b/Source/Engine/Level/Actors/SplineModel.cpp index 0da4a3d70..fdda6941e 100644 --- a/Source/Engine/Level/Actors/SplineModel.cpp +++ b/Source/Engine/Level/Actors/SplineModel.cpp @@ -497,9 +497,7 @@ void SplineModel::Serialize(SerializeStream& stream, const void* otherObj) SERIALIZE_MEMBER(PreTransform, _preTransform) SERIALIZE(Model); SERIALIZE(DrawModes); - - stream.JKEY("Buffer"); - stream.Object(&Entries, other ? &other->Entries : nullptr); + SERIALIZE_MEMBER(Buffer, Entries); } void SplineModel::Deserialize(DeserializeStream& stream, ISerializeModifier* modifier) @@ -514,8 +512,7 @@ void SplineModel::Deserialize(DeserializeStream& stream, ISerializeModifier* mod DESERIALIZE_MEMBER(PreTransform, _preTransform); DESERIALIZE(Model); DESERIALIZE(DrawModes); - - Entries.DeserializeIfExists(stream, "Buffer", modifier); + DESERIALIZE_MEMBER(Buffer, Entries); // [Deprecated on 07.02.2022, expires on 07.02.2024] if (modifier->EngineBuild <= 6330) diff --git a/Source/Engine/Level/Actors/StaticModel.cpp b/Source/Engine/Level/Actors/StaticModel.cpp index 1fba1ba2e..82976b54c 100644 --- a/Source/Engine/Level/Actors/StaticModel.cpp +++ b/Source/Engine/Level/Actors/StaticModel.cpp @@ -464,8 +464,7 @@ void StaticModel::Serialize(SerializeStream& stream, const void* otherObj) stream.Rectangle(Lightmap.UVsArea); } - stream.JKEY("Buffer"); - stream.Object(&Entries, other ? &other->Entries : nullptr); + SERIALIZE_MEMBER(Buffer, Entries); if (_vertexColorsCount) { @@ -504,8 +503,7 @@ void StaticModel::Deserialize(DeserializeStream& stream, ISerializeModifier* mod DESERIALIZE_MEMBER(DrawModes, _drawModes); DESERIALIZE_MEMBER(LightmapIndex, Lightmap.TextureIndex); DESERIALIZE_MEMBER(LightmapArea, Lightmap.UVsArea); - - Entries.DeserializeIfExists(stream, "Buffer", modifier); + DESERIALIZE_MEMBER(Buffer, Entries); { const auto member = stream.FindMember("VertexColors");