Optimized HelpComponent updates by caching the icons

This commit is contained in:
Leon Styhre 2025-03-14 22:50:00 +01:00
parent d814431496
commit 76423107ad
7 changed files with 36 additions and 3 deletions

View file

@ -197,6 +197,7 @@ void GuiMenu::openUIOptions()
s->setNeedsReloading(); s->setNeedsReloading();
s->setNeedsGoToStart(); s->setNeedsGoToStart();
s->setNeedsCollectionsUpdate(); s->setNeedsCollectionsUpdate();
s->setNeedsClearHelpPromptsImageCache();
s->setInvalidateCachedBackground(); s->setInvalidateCachedBackground();
} }
}); });
@ -211,6 +212,7 @@ void GuiMenu::openUIOptions()
Settings::getInstance()->setString("ThemeVariant", themeVariant->getSelected()); Settings::getInstance()->setString("ThemeVariant", themeVariant->getSelected());
s->setNeedsSaving(); s->setNeedsSaving();
s->setNeedsReloading(); s->setNeedsReloading();
s->setNeedsClearHelpPromptsImageCache();
s->setInvalidateCachedBackground(); s->setInvalidateCachedBackground();
} }
}); });
@ -271,6 +273,7 @@ void GuiMenu::openUIOptions()
Settings::getInstance()->setString("ThemeColorScheme", themeColorScheme->getSelected()); Settings::getInstance()->setString("ThemeColorScheme", themeColorScheme->getSelected());
s->setNeedsSaving(); s->setNeedsSaving();
s->setNeedsReloading(); s->setNeedsReloading();
s->setNeedsClearHelpPromptsImageCache();
s->setInvalidateCachedBackground(); s->setInvalidateCachedBackground();
} }
}); });
@ -323,6 +326,7 @@ void GuiMenu::openUIOptions()
Settings::getInstance()->setString("ThemeFontSize", themeFontSize->getSelected()); Settings::getInstance()->setString("ThemeFontSize", themeFontSize->getSelected());
s->setNeedsSaving(); s->setNeedsSaving();
s->setNeedsReloading(); s->setNeedsReloading();
s->setNeedsClearHelpPromptsImageCache();
s->setInvalidateCachedBackground(); s->setInvalidateCachedBackground();
} }
}); });
@ -366,6 +370,7 @@ void GuiMenu::openUIOptions()
Settings::getInstance()->setString("ThemeAspectRatio", themeAspectRatio->getSelected()); Settings::getInstance()->setString("ThemeAspectRatio", themeAspectRatio->getSelected());
s->setNeedsSaving(); s->setNeedsSaving();
s->setNeedsReloading(); s->setNeedsReloading();
s->setNeedsClearHelpPromptsImageCache();
s->setInvalidateCachedBackground(); s->setInvalidateCachedBackground();
} }
}); });
@ -524,6 +529,7 @@ void GuiMenu::openUIOptions()
Settings::getInstance()->setString("ThemeLanguage", themeLanguage->getSelected()); Settings::getInstance()->setString("ThemeLanguage", themeLanguage->getSelected());
s->setNeedsSaving(); s->setNeedsSaving();
s->setNeedsReloading(); s->setNeedsReloading();
s->setNeedsClearHelpPromptsImageCache();
s->setInvalidateCachedBackground(); s->setInvalidateCachedBackground();
} }
}); });
@ -601,6 +607,7 @@ void GuiMenu::openUIOptions()
s->setNeedsRescanROMDirectory(); s->setNeedsRescanROMDirectory();
s->setNeedsReloading(); s->setNeedsReloading();
s->setNeedsCollectionsUpdate(); s->setNeedsCollectionsUpdate();
s->setNeedsClearHelpPromptsImageCache();
} }
}); });
@ -1356,6 +1363,7 @@ void GuiMenu::openInputDeviceOptions()
Settings::getInstance()->setString("InputControllerType", Settings::getInstance()->setString("InputControllerType",
inputControllerType->getSelected()); inputControllerType->getSelected());
s->setNeedsSaving(); s->setNeedsSaving();
s->setNeedsClearHelpPromptsImageCache();
} }
}); });
@ -2395,6 +2403,7 @@ void GuiMenu::openThemeDownloader(GuiSettings* settings)
} }
else { else {
openUIOptions(); openUIOptions();
mWindow->clearHelpPromptsImageCache();
mWindow->invalidateCachedBackground(); mWindow->invalidateCachedBackground();
} }
}; };

View file

@ -38,6 +38,7 @@ GuiSettings::GuiSettings(std::string title)
, mNeedsGoToSystem {false} , mNeedsGoToSystem {false}
, mNeedsGoToGroupedCollections {false} , mNeedsGoToGroupedCollections {false}
, mNeedsUpdateStatusComponents {false} , mNeedsUpdateStatusComponents {false}
, mNeedsClearHelpPromptsImageCache {false}
, mInvalidateCachedBackground {false} , mInvalidateCachedBackground {false}
{ {
addChild(&mMenu); addChild(&mMenu);
@ -154,6 +155,9 @@ void GuiSettings::save()
mWindow->updateSystemStatusComponents(); mWindow->updateSystemStatusComponents();
} }
if (mNeedsClearHelpPromptsImageCache)
mWindow->clearHelpPromptsImageCache();
if (mNeedsCollectionsUpdate) { if (mNeedsCollectionsUpdate) {
auto state = ViewController::getInstance()->getState(); auto state = ViewController::getInstance()->getState();
// If we're in any view other than the grouped custom collections, always jump to the // If we're in any view other than the grouped custom collections, always jump to the

View file

@ -59,6 +59,7 @@ public:
}; };
void setNeedsGoToGroupedCollections() { mNeedsGoToGroupedCollections = true; } void setNeedsGoToGroupedCollections() { mNeedsGoToGroupedCollections = true; }
void setNeedsUpdateStatusComponents() { mNeedsUpdateStatusComponents = true; } void setNeedsUpdateStatusComponents() { mNeedsUpdateStatusComponents = true; }
void setNeedsClearHelpPromptsImageCache() { mNeedsClearHelpPromptsImageCache = true; }
void setNeedsCloseMenu(std::function<void()> closeFunction) void setNeedsCloseMenu(std::function<void()> closeFunction)
{ {
mCloseMenuFunction = closeFunction; mCloseMenuFunction = closeFunction;
@ -86,6 +87,7 @@ private:
bool mNeedsGoToSystem; bool mNeedsGoToSystem;
bool mNeedsGoToGroupedCollections; bool mNeedsGoToGroupedCollections;
bool mNeedsUpdateStatusComponents; bool mNeedsUpdateStatusComponents;
bool mNeedsClearHelpPromptsImageCache;
bool mInvalidateCachedBackground; bool mInvalidateCachedBackground;
}; };

View file

@ -217,6 +217,7 @@ void Window::deinit()
(*it)->onHide(); (*it)->onHide();
mPostprocessedBackground.reset(); mPostprocessedBackground.reset();
sHelpPromptsImageCache.clear();
mHelp.reset(); mHelp.reset();
if (mHelpComponents != nullptr) { if (mHelpComponents != nullptr) {
mHelpComponents->clear(); mHelpComponents->clear();

View file

@ -123,6 +123,12 @@ public:
void renderHelpPromptsEarly(); // Used to render HelpPrompts before a fade. void renderHelpPromptsEarly(); // Used to render HelpPrompts before a fade.
void setHelpPrompts(const std::vector<HelpPrompt>& prompts); void setHelpPrompts(const std::vector<HelpPrompt>& prompts);
std::map<std::string, std::shared_ptr<ImageComponent>>& getHelpPromptsImageCache()
{
return sHelpPromptsImageCache;
}
void clearHelpPromptsImageCache() { sHelpPromptsImageCache.clear(); }
// GuiInfoPopup notifications. // GuiInfoPopup notifications.
void queueInfoPopup(const std::string& message, const int& duration) void queueInfoPopup(const std::string& message, const int& duration)
{ {
@ -210,6 +216,8 @@ private:
unsigned int color; unsigned int color;
}; };
static inline std::map<std::string, std::shared_ptr<ImageComponent>> sHelpPromptsImageCache;
Renderer* mRenderer; Renderer* mRenderer;
std::vector<std::unique_ptr<HelpComponent>>* mHelpComponents; std::vector<std::unique_ptr<HelpComponent>>* mHelpComponents;
std::unique_ptr<HelpComponent> mHelp; std::unique_ptr<HelpComponent> mHelp;

View file

@ -106,7 +106,6 @@ void ComponentGrid::setEntry(const std::shared_ptr<GuiComponent>& comp,
{ {
assert(pos.x >= 0 && pos.x < mGridSize.x && pos.y >= 0 && pos.y < mGridSize.y); assert(pos.x >= 0 && pos.x < mGridSize.x && pos.y >= 0 && pos.y < mGridSize.y);
assert(comp != nullptr); assert(comp != nullptr);
assert(comp->getParent() == nullptr);
comp->setAutoCalcExtent(autoCalcExtent); comp->setAutoCalcExtent(autoCalcExtent);
GridEntry entry {pos, size, comp, canFocus, resize, updateType, border}; GridEntry entry {pos, size, comp, canFocus, resize, updateType, border};

View file

@ -611,8 +611,18 @@ void HelpComponent::updateGrid()
std::find(mEntries.cbegin(), mEntries.cend(), (*it).first) == mEntries.cend()) std::find(mEntries.cbegin(), mEntries.cend(), (*it).first) == mEntries.cend())
continue; continue;
std::shared_ptr<ImageComponent> icon {std::make_shared<ImageComponent>(false, true)}; std::shared_ptr<ImageComponent> icon;
icon->setImage(mIconPathMap[it->first]); auto& imageCache = mWindow->getHelpPromptsImageCache();
if (imageCache.find(mIconPathMap[it->first]) != imageCache.end()) {
icon = imageCache[mIconPathMap[it->first]];
}
else {
icon = std::make_shared<ImageComponent>(false, true);
icon->setImage(mIconPathMap[it->first]);
imageCache[mIconPathMap[it->first]] = icon;
}
icon->setColorShift(isDimmed ? mStyleIconColorDimmed : mStyleIconColor); icon->setColorShift(isDimmed ? mStyleIconColorDimmed : mStyleIconColor);
icon->setResize(0, height); icon->setResize(0, height);
icon->setOpacity(isDimmed ? mStyleOpacityDimmed : mStyleOpacity); icon->setOpacity(isDimmed ? mStyleOpacityDimmed : mStyleOpacity);