From 63024133be46ed21582d25caf5713675d14f478e Mon Sep 17 00:00:00 2001 From: MihailRis Date: Wed, 28 Jan 2026 20:06:00 +0300 Subject: [PATCH] add 'system.max-bg-asset-loaders' setting --- src/assets/AssetsLoader.cpp | 5 +++-- src/assets/AssetsLoader.hpp | 2 +- src/engine/AssetsManagement.cpp | 12 +++++++++--- src/engine/AssetsManagement.hpp | 2 ++ src/io/settings_io.cpp | 3 +++ src/logic/scripting/lua/libs/libpack.cpp | 2 +- src/logic/scripting/lua/libs/libworld.cpp | 4 ++-- src/settings.hpp | 5 +++++ 8 files changed, 26 insertions(+), 9 deletions(-) diff --git a/src/assets/AssetsLoader.cpp b/src/assets/AssetsLoader.cpp index 55806ac3e..4543a054b 100644 --- a/src/assets/AssetsLoader.cpp +++ b/src/assets/AssetsLoader.cpp @@ -371,12 +371,13 @@ public: } }; -std::shared_ptr AssetsLoader::startTask(runnable onDone) { +std::shared_ptr AssetsLoader::startTask(runnable onDone, int maxWorkers) { auto pool = std::make_shared>( "assets-loader-pool", [=]() { return std::make_shared(this); }, - [this](const assetload::postfunc& func) { func(&assets); } + [this](const assetload::postfunc& func) { func(&assets); }, + maxWorkers ); pool->setOnComplete(std::move(onDone)); pool->setJobsSource([this]() -> std::optional { diff --git a/src/assets/AssetsLoader.hpp b/src/assets/AssetsLoader.hpp index c34eb822d..3d1704545 100644 --- a/src/assets/AssetsLoader.hpp +++ b/src/assets/AssetsLoader.hpp @@ -113,7 +113,7 @@ public: /// @throws assetload::error void loadNext(); - std::shared_ptr startTask(runnable onDone); + std::shared_ptr startTask(runnable onDone, int maxWorkers); const ResPaths& getPaths() const; aloader_func getLoader(AssetType tag); diff --git a/src/engine/AssetsManagement.cpp b/src/engine/AssetsManagement.cpp index 55bfb9401..578a0e45b 100644 --- a/src/engine/AssetsManagement.cpp +++ b/src/engine/AssetsManagement.cpp @@ -12,7 +12,9 @@ static debug::Logger logger("assets-management"); -AssetsManagement::AssetsManagement(Engine& engine) : engine(engine) {} +AssetsManagement::AssetsManagement(Engine& engine) + : engine(engine), settings(engine.getSettings()) { +} AssetsManagement::~AssetsManagement() { finishBackgroundLoader(); @@ -36,7 +38,9 @@ AssetsLoader& AssetsManagement::acquireBackgroundLoader() { backgroundLoader = std::make_unique( engine, *assets, engine.getResPaths() ); - backgroundLoaderTask = backgroundLoader->startTask(nullptr); + backgroundLoaderTask = backgroundLoader->startTask( + nullptr, settings.system.maxBgAssetLoaders.get() + ); return *backgroundLoader; } @@ -56,7 +60,9 @@ void AssetsManagement::loadAssets(Content* content) { // todo: before setting to true, check if GLSLExtension thread safe bool threading = false; // look at three upper lines if (threading) { - auto task = loader.startTask([=](){}); + auto task = loader.startTask( + [=]() {}, 0 + ); task->waitForEnd(); } else { while (loader.hasNext()) { diff --git a/src/engine/AssetsManagement.hpp b/src/engine/AssetsManagement.hpp index f88bc281a..4e14c9305 100644 --- a/src/engine/AssetsManagement.hpp +++ b/src/engine/AssetsManagement.hpp @@ -8,6 +8,7 @@ class AssetsLoader; class Engine; class Content; class Task; +struct EngineSettings; class AssetsManagement final { public: @@ -25,6 +26,7 @@ private: void finishBackgroundLoader(); Engine& engine; + const EngineSettings& settings; std::unique_ptr assets; std::unique_ptr backgroundLoader; std::shared_ptr backgroundLoaderTask; diff --git a/src/io/settings_io.cpp b/src/io/settings_io.cpp index bc9d3c0a7..da0027c4d 100644 --- a/src/io/settings_io.cpp +++ b/src/io/settings_io.cpp @@ -94,6 +94,9 @@ SettingsHandler::SettingsHandler(EngineSettings& settings) { builder.add("do-write-lights", &settings.debug.doWriteLights); builder.add("do-trace-shaders", &settings.debug.doTraceShaders); builder.add("enable-experimental", &settings.debug.enableExperimental); + + builder.addSection("system"); + builder.add("max-bg-asset-loaders", &settings.system.maxBgAssetLoaders); } dv::value SettingsHandler::getValue(const std::string& name) const { diff --git a/src/logic/scripting/lua/libs/libpack.cpp b/src/logic/scripting/lua/libs/libpack.cpp index 66fa86426..13171490c 100644 --- a/src/logic/scripting/lua/libs/libpack.cpp +++ b/src/logic/scripting/lua/libs/libpack.cpp @@ -90,7 +90,7 @@ static int l_pack_get_info( auto& assetsLoader = engine->acquireBackgroundLoader(); std::string icon = pack.id + ".icon"; if (!AssetsLoader::loadExternalTexture( - assetsLoader, icon, {pack.folder / "icon"} + assetsLoader, icon, {pack.folder / "icon.png"} )) { icon = "gui/no_icon"; } diff --git a/src/logic/scripting/lua/libs/libworld.cpp b/src/logic/scripting/lua/libs/libworld.cpp index a9567ea97..30a619788 100644 --- a/src/logic/scripting/lua/libs/libworld.cpp +++ b/src/logic/scripting/lua/libs/libworld.cpp @@ -60,8 +60,8 @@ static int l_get_list(lua::State* L) { if (!engine->isHeadless() && !AssetsLoader::loadExternalTexture( engine->acquireBackgroundLoader(), icon, - {worlds[i] / "icon", - worlds[i] / "preview"} + {worlds[i] / "icon.png", + worlds[i] / "preview.png"} )) { icon = "gui/no_world_icon"; } diff --git a/src/settings.hpp b/src/settings.hpp index 070a607cf..0a0754235 100644 --- a/src/settings.hpp +++ b/src/settings.hpp @@ -115,6 +115,10 @@ struct UiSettings { struct NetworkSettings { }; +struct SystemSettings { + IntegerSetting maxBgAssetLoaders {3, -4, 16}; +}; + struct EngineSettings { AudioSettings audio; DisplaySettings display; @@ -125,4 +129,5 @@ struct EngineSettings { UiSettings ui; NetworkSettings network; PathfindingSettings pathfinding; + SystemSettings system; };