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 =
std::make_shared<util::ThreadPool<aloader_entry, assetload::postfunc>>(
"assets-loader-pool",
[=]() { 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->setJobsSource([this]() -> std::optional<aloader_entry> {

View file

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

View file

@ -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<AssetsLoader>(
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()) {

View file

@ -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> assets;
std::unique_ptr<AssetsLoader> backgroundLoader;
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-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 {

View file

@ -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";
}

View file

@ -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";
}

View file

@ -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;
};