From c914295d206dfeddf635c06b3d8defa1c327e312 Mon Sep 17 00:00:00 2001 From: Kelsi Date: Sun, 22 Feb 2026 06:42:15 -0800 Subject: [PATCH] Reduce logging overhead and reuse WMO culling futures --- include/core/logger.hpp | 9 ++++++++- include/rendering/wmo_renderer.hpp | 2 ++ src/core/logger.cpp | 8 ++++++-- src/rendering/wmo_renderer.cpp | 10 ++++++---- 4 files changed, 22 insertions(+), 7 deletions(-) diff --git a/include/core/logger.hpp b/include/core/logger.hpp index f8873a82..4ba4e3ce 100644 --- a/include/core/logger.hpp +++ b/include/core/logger.hpp @@ -6,6 +6,7 @@ #include #include #include +#include namespace wowee { namespace core { @@ -31,29 +32,35 @@ public: void log(LogLevel level, const std::string& message); void setLogLevel(LogLevel level); + bool shouldLog(LogLevel level) const; template void debug(Args&&... args) { + if (!shouldLog(LogLevel::DEBUG)) return; log(LogLevel::DEBUG, format(std::forward(args)...)); } template void info(Args&&... args) { + if (!shouldLog(LogLevel::INFO)) return; log(LogLevel::INFO, format(std::forward(args)...)); } template void warning(Args&&... args) { + if (!shouldLog(LogLevel::WARNING)) return; log(LogLevel::WARNING, format(std::forward(args)...)); } template void error(Args&&... args) { + if (!shouldLog(LogLevel::ERROR)) return; log(LogLevel::ERROR, format(std::forward(args)...)); } template void fatal(Args&&... args) { + if (!shouldLog(LogLevel::FATAL)) return; log(LogLevel::FATAL, format(std::forward(args)...)); } @@ -70,7 +77,7 @@ private: return oss.str(); } - LogLevel minLevel = LogLevel::INFO; // Changed from DEBUG to reduce log spam + std::atomic minLevel_{static_cast(LogLevel::INFO)}; std::mutex mutex; std::ofstream fileStream; bool fileReady = false; diff --git a/include/rendering/wmo_renderer.hpp b/include/rendering/wmo_renderer.hpp index 45d6a12c..b64b1073 100644 --- a/include/rendering/wmo_renderer.hpp +++ b/include/rendering/wmo_renderer.hpp @@ -9,6 +9,7 @@ #include #include #include +#include namespace wowee { namespace pipeline { @@ -633,6 +634,7 @@ private: uint32_t portalCulled = 0; uint32_t distanceCulled = 0; }; + std::vector>> cullFutures_; // Collision query profiling (per frame). mutable double queryTimeMs = 0.0; diff --git a/src/core/logger.cpp b/src/core/logger.cpp index 23d4ba5a..498dd219 100644 --- a/src/core/logger.cpp +++ b/src/core/logger.cpp @@ -35,7 +35,7 @@ void Logger::ensureFile() { } void Logger::log(LogLevel level, const std::string& message) { - if (level < minLevel) { + if (!shouldLog(level)) { return; } @@ -93,7 +93,11 @@ void Logger::log(LogLevel level, const std::string& message) { } void Logger::setLogLevel(LogLevel level) { - minLevel = level; + minLevel_.store(static_cast(level), std::memory_order_relaxed); +} + +bool Logger::shouldLog(LogLevel level) const { + return static_cast(level) >= minLevel_.load(std::memory_order_relaxed); } } // namespace core diff --git a/src/rendering/wmo_renderer.cpp b/src/rendering/wmo_renderer.cpp index a5ad0788..cfa4ab24 100644 --- a/src/rendering/wmo_renderer.cpp +++ b/src/rendering/wmo_renderer.cpp @@ -1176,13 +1176,15 @@ void WMORenderer::render(VkCommandBuffer cmd, VkDescriptorSet perFrameSet, const const size_t chunkSize = visibleInstances.size() / numThreads; const size_t remainder = visibleInstances.size() % numThreads; - std::vector>> futures; - futures.reserve(numThreads); + cullFutures_.clear(); + if (cullFutures_.capacity() < numThreads) { + cullFutures_.reserve(numThreads); + } size_t start = 0; for (size_t t = 0; t < numThreads; ++t) { size_t end = start + chunkSize + (t < remainder ? 1 : 0); - futures.push_back(std::async(std::launch::async, + cullFutures_.push_back(std::async(std::launch::async, [&, start, end]() { std::vector chunk; chunk.reserve(end - start); @@ -1193,7 +1195,7 @@ void WMORenderer::render(VkCommandBuffer cmd, VkDescriptorSet perFrameSet, const start = end; } - for (auto& f : futures) { + for (auto& f : cullFutures_) { auto chunk = f.get(); for (auto& dl : chunk) drawLists.push_back(std::move(dl));