add 'system.max-bg-asset-loaders' setting

This commit is contained in:
MihailRis 2026-01-28 20:06:00 +03:00
parent 1cf4fb8703
commit 63024133be
8 changed files with 26 additions and 9 deletions

View file

@ -371,12 +371,13 @@ public:
} }
}; };
std::shared_ptr<Task> AssetsLoader::startTask(runnable onDone) { std::shared_ptr<Task> AssetsLoader::startTask(runnable onDone, int maxWorkers) {
auto pool = auto pool =
std::make_shared<util::ThreadPool<aloader_entry, assetload::postfunc>>( std::make_shared<util::ThreadPool<aloader_entry, assetload::postfunc>>(
"assets-loader-pool", "assets-loader-pool",
[=]() { return std::make_shared<LoaderWorker>(this); }, [=]() { return std::make_shared<LoaderWorker>(this); },
[this](const assetload::postfunc& func) { func(&assets); } [this](const assetload::postfunc& func) { func(&assets); },
maxWorkers
); );
pool->setOnComplete(std::move(onDone)); pool->setOnComplete(std::move(onDone));
pool->setJobsSource([this]() -> std::optional<aloader_entry> { pool->setJobsSource([this]() -> std::optional<aloader_entry> {

View file

@ -113,7 +113,7 @@ public:
/// @throws assetload::error /// @throws assetload::error
void loadNext(); void loadNext();
std::shared_ptr<Task> startTask(runnable onDone); std::shared_ptr<Task> startTask(runnable onDone, int maxWorkers);
const ResPaths& getPaths() const; const ResPaths& getPaths() const;
aloader_func getLoader(AssetType tag); aloader_func getLoader(AssetType tag);

View file

@ -12,7 +12,9 @@
static debug::Logger logger("assets-management"); static debug::Logger logger("assets-management");
AssetsManagement::AssetsManagement(Engine& engine) : engine(engine) {} AssetsManagement::AssetsManagement(Engine& engine)
: engine(engine), settings(engine.getSettings()) {
}
AssetsManagement::~AssetsManagement() { AssetsManagement::~AssetsManagement() {
finishBackgroundLoader(); finishBackgroundLoader();
@ -36,7 +38,9 @@ AssetsLoader& AssetsManagement::acquireBackgroundLoader() {
backgroundLoader = std::make_unique<AssetsLoader>( backgroundLoader = std::make_unique<AssetsLoader>(
engine, *assets, engine.getResPaths() engine, *assets, engine.getResPaths()
); );
backgroundLoaderTask = backgroundLoader->startTask(nullptr); backgroundLoaderTask = backgroundLoader->startTask(
nullptr, settings.system.maxBgAssetLoaders.get()
);
return *backgroundLoader; return *backgroundLoader;
} }
@ -56,7 +60,9 @@ void AssetsManagement::loadAssets(Content* content) {
// todo: before setting to true, check if GLSLExtension thread safe // todo: before setting to true, check if GLSLExtension thread safe
bool threading = false; // look at three upper lines bool threading = false; // look at three upper lines
if (threading) { if (threading) {
auto task = loader.startTask([=](){}); auto task = loader.startTask(
[=]() {}, 0
);
task->waitForEnd(); task->waitForEnd();
} else { } else {
while (loader.hasNext()) { while (loader.hasNext()) {

View file

@ -8,6 +8,7 @@ class AssetsLoader;
class Engine; class Engine;
class Content; class Content;
class Task; class Task;
struct EngineSettings;
class AssetsManagement final { class AssetsManagement final {
public: public:
@ -25,6 +26,7 @@ private:
void finishBackgroundLoader(); void finishBackgroundLoader();
Engine& engine; Engine& engine;
const EngineSettings& settings;
std::unique_ptr<Assets> assets; std::unique_ptr<Assets> assets;
std::unique_ptr<AssetsLoader> backgroundLoader; std::unique_ptr<AssetsLoader> backgroundLoader;
std::shared_ptr<Task> backgroundLoaderTask; std::shared_ptr<Task> backgroundLoaderTask;

View file

@ -94,6 +94,9 @@ SettingsHandler::SettingsHandler(EngineSettings& settings) {
builder.add("do-write-lights", &settings.debug.doWriteLights); builder.add("do-write-lights", &settings.debug.doWriteLights);
builder.add("do-trace-shaders", &settings.debug.doTraceShaders); builder.add("do-trace-shaders", &settings.debug.doTraceShaders);
builder.add("enable-experimental", &settings.debug.enableExperimental); 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 { dv::value SettingsHandler::getValue(const std::string& name) const {

View file

@ -90,7 +90,7 @@ static int l_pack_get_info(
auto& assetsLoader = engine->acquireBackgroundLoader(); auto& assetsLoader = engine->acquireBackgroundLoader();
std::string icon = pack.id + ".icon"; std::string icon = pack.id + ".icon";
if (!AssetsLoader::loadExternalTexture( if (!AssetsLoader::loadExternalTexture(
assetsLoader, icon, {pack.folder / "icon"} assetsLoader, icon, {pack.folder / "icon.png"}
)) { )) {
icon = "gui/no_icon"; icon = "gui/no_icon";
} }

View file

@ -60,8 +60,8 @@ static int l_get_list(lua::State* L) {
if (!engine->isHeadless() && !AssetsLoader::loadExternalTexture( if (!engine->isHeadless() && !AssetsLoader::loadExternalTexture(
engine->acquireBackgroundLoader(), engine->acquireBackgroundLoader(),
icon, icon,
{worlds[i] / "icon", {worlds[i] / "icon.png",
worlds[i] / "preview"} worlds[i] / "preview.png"}
)) { )) {
icon = "gui/no_world_icon"; icon = "gui/no_world_icon";
} }

View file

@ -115,6 +115,10 @@ struct UiSettings {
struct NetworkSettings { struct NetworkSettings {
}; };
struct SystemSettings {
IntegerSetting maxBgAssetLoaders {3, -4, 16};
};
struct EngineSettings { struct EngineSettings {
AudioSettings audio; AudioSettings audio;
DisplaySettings display; DisplaySettings display;
@ -125,4 +129,5 @@ struct EngineSettings {
UiSettings ui; UiSettings ui;
NetworkSettings network; NetworkSettings network;
PathfindingSettings pathfinding; PathfindingSettings pathfinding;
SystemSettings system;
}; };