Internals: Settings: Simple optimization caching index into the settings buffer, to remove an unnecessary O(N*M) search during saving. (with N=active root windows during the session, M=stored settings which grows over time)
diff --git a/imgui.cpp b/imgui.cpp
index f08c73e..60b6014 100644
--- a/imgui.cpp
+++ b/imgui.cpp
@@ -2085,6 +2085,7 @@
LastFrameActive = -1;
ItemWidthDefault = 0.0f;
FontWindowScale = 1.0f;
+ SettingsIdx = -1;
DrawList = &DrawListInst;
DrawList->_OwnerName = Name;
@@ -3876,9 +3877,14 @@
ImGuiWindow* window = g.Windows[i];
if (window->Flags & ImGuiWindowFlags_NoSavedSettings)
continue;
- ImGuiWindowSettings* settings = ImGui::FindWindowSettings(window->ID);
+
+ ImGuiWindowSettings* settings = (window->SettingsIdx != -1) ? &g.SettingsWindows[window->SettingsIdx] : ImGui::FindWindowSettings(window->ID);
if (!settings)
+ {
settings = AddWindowSettings(window->Name);
+ window->SettingsIdx = g.SettingsWindows.index_from_pointer(settings);
+ }
+ IM_ASSERT(settings->ID == window->ID);
settings->Pos = window->Pos;
settings->Size = window->SizeFull;
settings->Collapsed = window->Collapsed;
@@ -3981,7 +3987,7 @@
{
ImGuiContext& g = *GImGui;
for (int i = 0; i != g.SettingsWindows.Size; i++)
- if (g.SettingsWindows[i].Id == id)
+ if (g.SettingsWindows[i].ID == id)
return &g.SettingsWindows[i];
return NULL;
}
@@ -3992,7 +3998,7 @@
g.SettingsWindows.push_back(ImGuiWindowSettings());
ImGuiWindowSettings* settings = &g.SettingsWindows.back();
settings->Name = ImStrdup(name);
- settings->Id = ImHash(name, 0);
+ settings->ID = ImHash(name, 0);
return settings;
}
@@ -5695,6 +5701,7 @@
// Retrieve settings from .ini file
if (ImGuiWindowSettings* settings = ImGui::FindWindowSettings(window->ID))
{
+ window->SettingsIdx = g.SettingsWindows.index_from_pointer(settings);
SetWindowConditionAllowFlags(window, ImGuiCond_FirstUseEver, false);
window->Pos = ImFloor(settings->Pos);
window->Collapsed = settings->Collapsed;
diff --git a/imgui_internal.h b/imgui_internal.h
index 0498514..cc5c77c 100644
--- a/imgui_internal.h
+++ b/imgui_internal.h
@@ -440,12 +440,12 @@
struct ImGuiWindowSettings
{
char* Name;
- ImGuiID Id;
+ ImGuiID ID;
ImVec2 Pos;
ImVec2 Size;
bool Collapsed;
- ImGuiWindowSettings() { Name = NULL; Id = 0; Pos = Size = ImVec2(0,0); Collapsed = false; }
+ ImGuiWindowSettings() { Name = NULL; ID = 0; Pos = Size = ImVec2(0,0); Collapsed = false; }
};
struct ImGuiSettingsHandler
@@ -994,6 +994,7 @@
ImGuiStorage StateStorage;
ImVector<ImGuiColumnsSet> ColumnsStorage;
float FontWindowScale; // User scale multiplier per-window
+ int SettingsIdx; // Index into SettingsWindow[] (indices are always valid as we only grow the array from the back)
ImDrawList* DrawList; // == &DrawListInst (for backward compatibility reason with code using imgui_internal.h we keep this a pointer)
ImDrawList DrawListInst;