From 3e9a7bda83c775c962907214d3e353c0bb9289a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=CE=B6eh=20Matt?= <5415177+ZehMatt@users.noreply.github.com> Date: Wed, 31 Jul 2024 23:57:14 +0300 Subject: [PATCH] Refactor file indexing, this now properly uses all CPU power --- src/openrct2/core/FileIndex.hpp | 66 ++++--------------- .../scenes/preloader/PreloaderScene.cpp | 2 - 2 files changed, 13 insertions(+), 55 deletions(-) diff --git a/src/openrct2/core/FileIndex.hpp b/src/openrct2/core/FileIndex.hpp index 1d7afef5d3..cd2ddc82cc 100644 --- a/src/openrct2/core/FileIndex.hpp +++ b/src/openrct2/core/FileIndex.hpp @@ -166,30 +166,6 @@ private: return ScanResult(stats, std::move(files)); } - void BuildRange( - int32_t language, const ScanResult& scanResult, size_t rangeStart, size_t rangeEnd, std::vector& items, - std::atomic& processed, std::mutex& printLock) const - { - items.reserve(rangeEnd - rangeStart); - for (size_t i = rangeStart; i < rangeEnd; i++) - { - const auto& filePath = scanResult.Files.at(i); - - if (_log_levels[EnumValue(DiagnosticLevel::Verbose)]) - { - std::lock_guard lock(printLock); - LOG_VERBOSE("FileIndex:Indexing '%s'", filePath.c_str()); - } - - if (auto item = Create(language, filePath); item.has_value()) - { - items.push_back(std::move(item.value())); - } - - ++processed; - } - } - std::vector Build(int32_t language, const ScanResult& scanResult) const { std::vector allItems; @@ -201,43 +177,27 @@ private: if (totalCount > 0) { JobPool jobPool; - std::mutex printLock; // For verbose prints. - - std::list> containers; - - size_t stepSize = 100; // Handpicked, seems to work well with 4/8 cores. - + std::mutex mtx; std::atomic processed{ 0 }; - auto reportProgress = [&]() { - const size_t completed = processed; - OpenRCT2::Console::WriteFormat( - "File %5zu of %zu, done %3d%%\r", completed, totalCount, completed * 100 / totalCount); - OpenRCT2::GetContext()->SetProgress(static_cast(completed), static_cast(totalCount)); - }; - - for (size_t rangeStart = 0; rangeStart < totalCount; rangeStart += stepSize) + for (size_t i = 0; i < totalCount; i++) { - if (rangeStart + stepSize > totalCount) - { - stepSize = totalCount - rangeStart; - } + jobPool.AddTask([&, index = i]() { + const auto& filePath = scanResult.Files.at(index); - auto& items = containers.emplace_back(); + if (auto item = Create(language, filePath); item.has_value()) + { + std::lock_guard lock(mtx); + allItems.push_back(std::move(item.value())); + } - jobPool.AddTask([&, rangeStart, stepSize]() { - BuildRange(language, scanResult, rangeStart, rangeStart + stepSize, items, processed, printLock); + processed++; }); - - reportProgress(); } - jobPool.Join(reportProgress); - - for (const auto& itr : containers) - { - allItems.insert(allItems.end(), itr.begin(), itr.end()); - } + jobPool.Join([&]() { + OpenRCT2::GetContext()->SetProgress(static_cast(processed.load()), static_cast(totalCount)); + }); } WriteIndexFile(language, scanResult.Stats, allItems); diff --git a/src/openrct2/scenes/preloader/PreloaderScene.cpp b/src/openrct2/scenes/preloader/PreloaderScene.cpp index 7ab77c98da..cbf1a7dc32 100644 --- a/src/openrct2/scenes/preloader/PreloaderScene.cpp +++ b/src/openrct2/scenes/preloader/PreloaderScene.cpp @@ -15,8 +15,6 @@ #include "../../GameState.h" #include "../../OpenRCT2.h" #include "../../audio/audio.h" -#include "../../drawing/IDrawingContext.h" -#include "../../drawing/IDrawingEngine.h" #include "../../interface/Viewport.h" #include "../../interface/Window.h" #include "../../localisation/LocalisationService.h"