From d6b4992991fddc61059fda3f3dca36ef2b7e2740 Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Tue, 10 Jun 2025 20:08:20 +0200 Subject: [PATCH] Optimize actors registration in `SceneRendering` to track free items --- Source/Engine/Level/Scene/SceneRendering.cpp | 17 +++++++++++------ Source/Engine/Level/Scene/SceneRendering.h | 1 + 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/Source/Engine/Level/Scene/SceneRendering.cpp b/Source/Engine/Level/Scene/SceneRendering.cpp index c6f5669a5..fe2bc310f 100644 --- a/Source/Engine/Level/Scene/SceneRendering.cpp +++ b/Source/Engine/Level/Scene/SceneRendering.cpp @@ -136,6 +136,8 @@ void SceneRendering::Clear() _listeners.Clear(); for (auto& e : Actors) e.Clear(); + for (auto& e : FreeActors) + e.Clear(); #if USE_EDITOR PhysicsDebug.Clear(); #endif @@ -149,15 +151,17 @@ void SceneRendering::AddActor(Actor* a, int32& key) const int32 category = a->_drawCategory; ScopeLock lock(Locker); auto& list = Actors[category]; - // TODO: track removedCount and skip searching for free entry if there is none - key = 0; - for (; key < list.Count(); key++) + if (FreeActors[category].HasItems()) { - if (list.Get()[key].Actor == nullptr) - break; + // Use existing item + key = FreeActors[category].Pop(); } - if (key == list.Count()) + else + { + // Add a new item + key = list.Count(); list.AddOne(); + } auto& e = list[key]; e.Actor = a; e.LayerMask = a->GetLayerMask(); @@ -200,6 +204,7 @@ void SceneRendering::RemoveActor(Actor* a, int32& key) listener->OnSceneRenderingRemoveActor(a); e.Actor = nullptr; e.LayerMask = 0; + FreeActors[category].Add(key); } } key = -1; diff --git a/Source/Engine/Level/Scene/SceneRendering.h b/Source/Engine/Level/Scene/SceneRendering.h index 043f5079e..b24dcdfa9 100644 --- a/Source/Engine/Level/Scene/SceneRendering.h +++ b/Source/Engine/Level/Scene/SceneRendering.h @@ -100,6 +100,7 @@ public: }; Array Actors[MAX]; + Array FreeActors[MAX]; Array PostFxProviders; CriticalSection Locker;