1
0
mirror of https://github.com/vcmi/vcmi.git synced 2024-11-24 08:32:34 +02:00

Fix lag on dragging mod list in Launcher on Android

Tested by enabling dragging on desktop. According to profiler, most of
time was spent on generating mod information. Cheap to do once, but it
looks like Qt does this A LOT.

Added simple caching & reduced copying. Seems to be working fine on PC,
but not yet confirmed whether same goes for mobile
This commit is contained in:
Ivan Savenko 2024-06-06 15:30:11 +00:00
parent cffdf1081c
commit e3ed4eda44
2 changed files with 25 additions and 3 deletions

View File

@ -226,11 +226,13 @@ QVariantMap CModList::copyField(QVariantMap data, QString from, QString to) cons
void CModList::reloadRepositories() void CModList::reloadRepositories()
{ {
cachedMods.clear();
} }
void CModList::resetRepositories() void CModList::resetRepositories()
{ {
repositories.clear(); repositories.clear();
cachedMods.clear();
} }
void CModList::addRepository(QVariantMap data) void CModList::addRepository(QVariantMap data)
@ -238,20 +240,25 @@ void CModList::addRepository(QVariantMap data)
for(auto & key : data.keys()) for(auto & key : data.keys())
data[key.toLower()] = data.take(key); data[key.toLower()] = data.take(key);
repositories.push_back(copyField(data, "version", "latestVersion")); repositories.push_back(copyField(data, "version", "latestVersion"));
cachedMods.clear();
} }
void CModList::setLocalModList(QVariantMap data) void CModList::setLocalModList(QVariantMap data)
{ {
localModList = copyField(data, "version", "installedVersion"); localModList = copyField(data, "version", "installedVersion");
cachedMods.clear();
} }
void CModList::setModSettings(QVariant data) void CModList::setModSettings(QVariant data)
{ {
modSettings = data.toMap(); modSettings = data.toMap();
cachedMods.clear();
} }
void CModList::modChanged(QString modID) void CModList::modChanged(QString modID)
{ {
cachedMods.clear();
} }
static QVariant getValue(QVariant input, QString path) static QVariant getValue(QVariant input, QString path)
@ -270,9 +277,21 @@ static QVariant getValue(QVariant input, QString path)
} }
} }
CModEntry CModList::getMod(QString modname) const const CModEntry & CModList::getMod(QString modName) const
{
modName = modName.toLower();
auto it = cachedMods.find(modName);
if (it != cachedMods.end())
return it.value();
auto itNew = cachedMods.insert(modName, getModUncached(modName));
return *itNew;
}
CModEntry CModList::getModUncached(QString modname) const
{ {
modname = modname.toLower();
QVariantMap repo; QVariantMap repo;
QVariantMap local = localModList[modname].toMap(); QVariantMap local = localModList[modname].toMap();
QVariantMap settings; QVariantMap settings;

View File

@ -82,8 +82,11 @@ class CModList
QVariantMap localModList; QVariantMap localModList;
QVariantMap modSettings; QVariantMap modSettings;
mutable QMap<QString, CModEntry> cachedMods;
QVariantMap copyField(QVariantMap data, QString from, QString to) const; QVariantMap copyField(QVariantMap data, QString from, QString to) const;
CModEntry getModUncached(QString modname) const;
public: public:
virtual void resetRepositories(); virtual void resetRepositories();
virtual void reloadRepositories(); virtual void reloadRepositories();
@ -93,7 +96,7 @@ public:
virtual void modChanged(QString modID); virtual void modChanged(QString modID);
// returns mod by name. Note: mod MUST exist // returns mod by name. Note: mod MUST exist
CModEntry getMod(QString modname) const; const CModEntry & getMod(QString modname) const;
// returns list of all mods necessary to run selected one, including mod itself // returns list of all mods necessary to run selected one, including mod itself
// order is: first mods in list don't have any dependencies, last mod is modname // order is: first mods in list don't have any dependencies, last mod is modname