From c67a805bd723934118f9267f3149831a16c5ac88 Mon Sep 17 00:00:00 2001 From: CatChow0 Date: Fri, 24 Oct 2025 12:00:26 +0200 Subject: [PATCH 1/2] =?UTF-8?q?Minor=20-=20Am=C3=A9liore=20la=20gestion=20?= =?UTF-8?q?des=20entit=C3=A9s=20ImGui=20-=20V14.8.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Optimizes entity list updates in the ImGui interface by caching entity names and IDs. This reduces unnecessary string operations during rendering and improves performance, especially when dealing with a large number of entities. The initial ImGui window size has also been reduced for performance reasons. --- enginecustom/imgui.ini | 12 +++---- enginecustom/src/inc/system/imguiManager.h | 12 +++++++ enginecustom/src/src/system/imguiManager.cpp | 35 ++++++++++++-------- x64/Debug/config.txt | 2 +- x64/Release/config.txt | 2 +- 5 files changed, 41 insertions(+), 22 deletions(-) diff --git a/enginecustom/imgui.ini b/enginecustom/imgui.ini index 6de8ef6..5e0bf6b 100644 --- a/enginecustom/imgui.ini +++ b/enginecustom/imgui.ini @@ -1,6 +1,6 @@ [Window][DockSpace] Pos=0,0 -Size=1536,793 +Size=32,32 Collapsed=0 [Window][Debug##Default] @@ -22,15 +22,15 @@ DockId=0x00000009,0 [Window][Objects] Pos=0,19 -Size=251,774 +Size=15,22 Collapsed=0 -DockId=0x0000000B,1 +DockId=0x0000000B,0 [Window][Terrain] Pos=0,19 -Size=251,774 +Size=15,22 Collapsed=0 -DockId=0x0000000B,0 +DockId=0x0000000B,1 [Window][Log Window] Pos=0,630 @@ -57,7 +57,7 @@ Collapsed=0 DockId=0x00000002,0 [Docking][Data] -DockSpace ID=0xCCBD8CF7 Window=0x3DA2F1DE Pos=0,19 Size=1536,774 Split=X +DockSpace ID=0xCCBD8CF7 Window=0x3DA2F1DE Pos=0,19 Size=32,22 Split=X DockNode ID=0x00000001 Parent=0xCCBD8CF7 SizeRef=1350,842 Split=X DockNode ID=0x00000005 Parent=0x00000001 SizeRef=1265,842 Split=Y DockNode ID=0x00000003 Parent=0x00000005 SizeRef=1584,609 Split=X diff --git a/enginecustom/src/inc/system/imguiManager.h b/enginecustom/src/inc/system/imguiManager.h index 50a254b..f7671de 100644 --- a/enginecustom/src/inc/system/imguiManager.h +++ b/enginecustom/src/inc/system/imguiManager.h @@ -39,6 +39,12 @@ struct ComponentEntry { std::function addFunc; }; +struct CachedEntity +{ + std::string name; + ecs::EntityID id; +}; + class imguiManager { public: @@ -175,6 +181,10 @@ private: // --------------------------------------------- // // ----------------- Functions ----------------- // // --------------------------------------------- // + /** + * Update the cached entity list if there is a new, delete or rename entity + */ + void UpdateCachedEntitiesIfNeeded(); // --------------------------------------------- // // ----------------- Variables ----------------- // @@ -232,6 +242,8 @@ private: std::string version_driver_; ecs::EntityID m_selected_entity_id = 0; // ID of the currently selected entity + std::vector cachedEntities_; + bool entityListDirty = true; int BUILD_VERSION_VER = -1; }; diff --git a/enginecustom/src/src/system/imguiManager.cpp b/enginecustom/src/src/system/imguiManager.cpp index c3b95fb..27a7646 100644 --- a/enginecustom/src/src/system/imguiManager.cpp +++ b/enginecustom/src/src/system/imguiManager.cpp @@ -603,25 +603,17 @@ void imguiManager::WidgetObjectWindow() TEXT_V("Number of cubes: %d", entity_manager_->GetEntityCount()) SEP - auto entities = entity_manager_->GetAllEntities(); + UpdateCachedEntitiesIfNeeded(); ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing,ImVec2(4,2)); - for (auto& entity : entities) + for (auto& cachedEntitie : cachedEntities_) { - auto identity = entity->GetComponent(); - if (identity) + bool isSelected = (cachedEntitie.id == m_selected_entity_id); + if (SEL(cachedEntitie.name.c_str(), isSelected)) { - std::string name = identity->GetName(); - if (name.empty()) name = "Entity #" + std::to_string(identity->GetId()); - // avoid same label by adding the ID at the end - name += "##" + std::to_string(identity->GetId()); - bool isSelected = (entity->GetID() == m_selected_entity_id); - if (SEL(name.c_str(), isSelected)) - { - m_selected_entity_id = entity->GetID(); - show_inspector_window_ = true; - } + m_selected_entity_id = cachedEntitie.id; + show_inspector_window_ = true; } } @@ -1223,3 +1215,18 @@ void imguiManager::WidgetRenderStats() END } +void imguiManager::UpdateCachedEntitiesIfNeeded() { + if (!entityListDirty) return; + cachedEntities_.clear(); + auto entities = entity_manager_->GetAllEntities(); + for (auto& entity : entities) { + auto identity = entity->GetComponent(); + if (identity) { + std::string name = identity->GetName(); + if (name.empty()) + name = "Entity " + std::to_string(identity->GetId()); + cachedEntities_.push_back({ name, identity->GetId() }); + } + } + entityListDirty = false; +} \ No newline at end of file diff --git a/x64/Debug/config.txt b/x64/Debug/config.txt index 2ebee15..aba56db 100644 --- a/x64/Debug/config.txt +++ b/x64/Debug/config.txt @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b46f4a4e6dbada13398ff80f6056ead533d97b6485ba905f470333eb247ea4ee +oid sha256:7051b358fa10ce0cd9c08bfd24944aba26a208186d06d321b01bafe9613b1849 size 9 diff --git a/x64/Release/config.txt b/x64/Release/config.txt index 2ebee15..aba56db 100644 --- a/x64/Release/config.txt +++ b/x64/Release/config.txt @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b46f4a4e6dbada13398ff80f6056ead533d97b6485ba905f470333eb247ea4ee +oid sha256:7051b358fa10ce0cd9c08bfd24944aba26a208186d06d321b01bafe9613b1849 size 9 From 2e33adf4a9ea5800502fdda2f160d48dda241d6b Mon Sep 17 00:00:00 2001 From: CatChow0 Date: Fri, 24 Oct 2025 17:47:54 +0200 Subject: [PATCH 2/2] =?UTF-8?q?Minor=20-=20Am=C3=A9liore=20la=20gestion=20?= =?UTF-8?q?des=20entit=C3=A9s=20ImGui=20-=20V14.9.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Optimizes entity management in ImGui by deferring updates to the entity list until necessary. Changes include: - Sets the entity list as dirty upon adding or deleting entities to ensure the list is only updated when needed - Changes the type of entity ID stored in CachedEntity - Adjusts ImGui window size --- enginecustom/imgui.ini | 4 ++-- enginecustom/src/inc/system/imguiManager.h | 2 +- enginecustom/src/src/system/imguiManager.cpp | 10 ++++++++-- x64/Debug/config.txt | 2 +- x64/Release/config.txt | 2 +- 5 files changed, 13 insertions(+), 7 deletions(-) diff --git a/enginecustom/imgui.ini b/enginecustom/imgui.ini index 5e0bf6b..5b525d9 100644 --- a/enginecustom/imgui.ini +++ b/enginecustom/imgui.ini @@ -1,6 +1,6 @@ [Window][DockSpace] Pos=0,0 -Size=32,32 +Size=1536,793 Collapsed=0 [Window][Debug##Default] @@ -57,7 +57,7 @@ Collapsed=0 DockId=0x00000002,0 [Docking][Data] -DockSpace ID=0xCCBD8CF7 Window=0x3DA2F1DE Pos=0,19 Size=32,22 Split=X +DockSpace ID=0xCCBD8CF7 Window=0x3DA2F1DE Pos=0,19 Size=1536,774 Split=X DockNode ID=0x00000001 Parent=0xCCBD8CF7 SizeRef=1350,842 Split=X DockNode ID=0x00000005 Parent=0x00000001 SizeRef=1265,842 Split=Y DockNode ID=0x00000003 Parent=0x00000005 SizeRef=1584,609 Split=X diff --git a/enginecustom/src/inc/system/imguiManager.h b/enginecustom/src/inc/system/imguiManager.h index f7671de..b5c62ef 100644 --- a/enginecustom/src/inc/system/imguiManager.h +++ b/enginecustom/src/inc/system/imguiManager.h @@ -42,7 +42,7 @@ struct ComponentEntry { struct CachedEntity { std::string name; - ecs::EntityID id; + int id; }; class imguiManager diff --git a/enginecustom/src/src/system/imguiManager.cpp b/enginecustom/src/src/system/imguiManager.cpp index 27a7646..274c52b 100644 --- a/enginecustom/src/src/system/imguiManager.cpp +++ b/enginecustom/src/src/system/imguiManager.cpp @@ -502,6 +502,8 @@ void imguiManager::WidgetAddObject() // Remplacer les antislashs par des slashs std::replace(relativePath.begin(), relativePath.end(), L'\\', L'/'); app_->add_kobject(relativePath); + // set entities list as dirty + entityListDirty = true; } } @@ -596,13 +598,15 @@ void imguiManager::WidgetObjectWindow() // Remplacer les antislashs par des slashs std::replace(relativePath.begin(), relativePath.end(), L'\\', L'/'); app_->add_kobject(relativePath); + // set list as dirty since new entity has been added to the scene + entityListDirty = true; } } } S_LINE TEXT_V("Number of cubes: %d", entity_manager_->GetEntityCount()) SEP - + UpdateCachedEntitiesIfNeeded(); ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing,ImVec2(4,2)); @@ -660,6 +664,7 @@ void imguiManager::WidgetInspectorWindow() entity_manager_->DestroyEntity(m_selected_entity_id); m_selected_entity_id = -1; show_inspector_window_ = false; + entityListDirty = true; } S_LINE @@ -1223,9 +1228,10 @@ void imguiManager::UpdateCachedEntitiesIfNeeded() { auto identity = entity->GetComponent(); if (identity) { std::string name = identity->GetName(); + auto id = identity->GetId(); if (name.empty()) name = "Entity " + std::to_string(identity->GetId()); - cachedEntities_.push_back({ name, identity->GetId() }); + cachedEntities_.push_back({name,id}); } } entityListDirty = false; diff --git a/x64/Debug/config.txt b/x64/Debug/config.txt index aba56db..77c665a 100644 --- a/x64/Debug/config.txt +++ b/x64/Debug/config.txt @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7051b358fa10ce0cd9c08bfd24944aba26a208186d06d321b01bafe9613b1849 +oid sha256:844d37e56d8020360b0ba0507c8c450508001232980e7d0792367356ec4b1f55 size 9 diff --git a/x64/Release/config.txt b/x64/Release/config.txt index aba56db..77c665a 100644 --- a/x64/Release/config.txt +++ b/x64/Release/config.txt @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7051b358fa10ce0cd9c08bfd24944aba26a208186d06d321b01bafe9613b1849 +oid sha256:844d37e56d8020360b0ba0507c8c450508001232980e7d0792367356ec4b1f55 size 9