diff --git a/src/framerate_gui.cpp b/src/framerate_gui.cpp index 0ba9a796d5..1c9c36283c 100644 --- a/src/framerate_gui.cpp +++ b/src/framerate_gui.cpp @@ -25,8 +25,19 @@ #include "game/game_instance.hpp" #include "widgets/framerate_widget.h" + +#include +#include +#if defined(__MINGW32__) +#include "3rdparty/mingw-std-threads/mingw.mutex.h" +#endif +#include + #include "safeguards.h" +static std::mutex _sound_perf_lock; +static std::atomic _sound_perf_pending; +static std::vector _sound_perf_measurements; /** * Private declarations for performance measurement implementation @@ -251,6 +262,15 @@ PerformanceMeasurer::~PerformanceMeasurer() return; } } + if (this->elem == PFE_SOUND) { + TimingMeasurement end = GetPerformanceTimer(); + std::lock_guard lk(_sound_perf_lock); + if (_sound_perf_measurements.size() >= NUM_FRAMERATE_POINTS * 2) return; + _sound_perf_measurements.push_back(this->start_time); + _sound_perf_measurements.push_back(end); + _sound_perf_pending.store(true, std::memory_order_release); + return; + } _pf_data[this->elem].Add(this->start_time, GetPerformanceTimer()); } @@ -1078,3 +1098,15 @@ void ConPrintFramerate() IConsoleWarning("No performance measurements have been taken yet"); } } + +void ProcessPendingPerformanceMeasurements() +{ + if (_sound_perf_pending.load(std::memory_order_acquire)) { + std::lock_guard lk(_sound_perf_lock); + for (size_t i = 0; i < _sound_perf_measurements.size(); i += 2) { + _pf_data[PFE_SOUND].Add(_sound_perf_measurements[i], _sound_perf_measurements[i + 1]); + } + _sound_perf_measurements.clear(); + _sound_perf_pending.store(false, std::memory_order_relaxed); + } +} diff --git a/src/window.cpp b/src/window.cpp index e2d007bad8..d5ea47a7c9 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -3237,6 +3237,9 @@ void UpdateWindows() PerformanceMeasurer framerate(PFE_DRAWING); PerformanceAccumulator::Reset(PFE_DRAWWORLD); + extern void ProcessPendingPerformanceMeasurements(); + ProcessPendingPerformanceMeasurements(); + CallWindowRealtimeTickEvent(delta_ms); static GUITimer network_message_timer = GUITimer(1);