From 6fcf2c58e29f6ed8a5c6923e954f9cb42946d18a Mon Sep 17 00:00:00 2001 From: savis <106487343+savisxss@users.noreply.github.com> Date: Sat, 3 Jan 2026 20:38:21 +0100 Subject: [PATCH] Parallelize pack file initialization - Load pack files across multiple threads - Scales to CPU core count - Load root.pck first, then parallelize remaining packs - Track and report failed pack loads --- src/UserInterface/UserInterface.cpp | 42 ++++++++++++++++++++++++++--- 1 file changed, 39 insertions(+), 3 deletions(-) diff --git a/src/UserInterface/UserInterface.cpp b/src/UserInterface/UserInterface.cpp index f7e18f8..cafbdfe 100644 --- a/src/UserInterface/UserInterface.cpp +++ b/src/UserInterface/UserInterface.cpp @@ -16,6 +16,8 @@ #include #include +#include +#include #include #include @@ -166,11 +168,45 @@ bool PackInitialize(const char * c_pszFolder) "uiloading", }; - CPackManager::instance().AddPack(std::format("{}/root.pck", c_pszFolder)); - for (const std::string& packFileName : packFiles) { - CPackManager::instance().AddPack(std::format("{}/{}.pck", c_pszFolder, packFileName)); + Tracef("PackInitialize: Loading root.pck..."); + if (!CPackManager::instance().AddPack(std::format("{}/root.pck", c_pszFolder))) + { + TraceError("Failed to load root.pck"); + return false; } + Tracef("PackInitialize: Loading %d pack files in parallel...", packFiles.size()); + const size_t numThreads = std::min(std::thread::hardware_concurrency(), packFiles.size()); + const size_t packsPerThread = (packFiles.size() + numThreads - 1) / numThreads; + + std::vector threads; + std::atomic failedCount(0); + + for (size_t t = 0; t < numThreads; ++t) + { + threads.emplace_back([&, t]() { + size_t start = t * packsPerThread; + size_t end = std::min(start + packsPerThread, packFiles.size()); + + for (size_t i = start; i < end; ++i) + { + std::string packPath = std::format("{}/{}.pck", c_pszFolder, packFiles[i]); + if (!CPackManager::instance().AddPack(packPath)) + { + TraceError("Failed to load %s", packPath.c_str()); + failedCount++; + } + } + }); + } + + // Wait for all threads to complete + for (auto& thread : threads) + { + thread.join(); + } + + Tracef("PackInitialize: Completed! Failed: %d / %d", failedCount.load(), packFiles.size()); return true; }