Merge pull request #11409 from AdmiralCurtiss/performance-tracker-refactorings

Performance tracker refactorings extracted from PR #11348.
This commit is contained in:
JMC47 2023-01-06 17:03:35 -05:00 committed by GitHub
commit 2da39f7e00
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 25 additions and 20 deletions

View File

@ -134,7 +134,7 @@ void PerformanceMetrics::DrawImGuiStats(const float backbuffer_scale) const
ImPlot::PushStyleColor(ImPlotCol_PlotBg, {0, 0, 0, 0}); ImPlot::PushStyleColor(ImPlotCol_PlotBg, {0, 0, 0, 0});
ImPlot::PushStyleColor(ImPlotCol_LegendBg, {0, 0, 0, 0.2f}); ImPlot::PushStyleColor(ImPlotCol_LegendBg, {0, 0, 0, 0.2f});
ImPlot::PushStyleVar(ImPlotStyleVar_FitPadding, ImVec2(0.f, 0.f)); ImPlot::PushStyleVar(ImPlotStyleVar_FitPadding, ImVec2(0.f, 0.f));
ImPlot::PushStyleVar(ImPlotStyleVar_LineWeight, 3.f); ImPlot::PushStyleVar(ImPlotStyleVar_LineWeight, 1.5f * backbuffer_scale);
ImPlot::SetupAxes(nullptr, nullptr, ImPlot::SetupAxes(nullptr, nullptr,
ImPlotAxisFlags_Lock | ImPlotAxisFlags_Invert | ImPlotAxisFlags_Lock | ImPlotAxisFlags_Invert |
ImPlotAxisFlags_NoDecorations | ImPlotAxisFlags_NoHighlight, ImPlotAxisFlags_NoDecorations | ImPlotAxisFlags_NoHighlight,

View File

@ -34,7 +34,7 @@ public:
private: private:
PerformanceTracker m_fps_counter{"render_times.txt"}; PerformanceTracker m_fps_counter{"render_times.txt"};
PerformanceTracker m_vps_counter{"vblank_times.txt"}; PerformanceTracker m_vps_counter{"vblank_times.txt"};
PerformanceTracker m_speed_counter{nullptr, 500000}; PerformanceTracker m_speed_counter{std::nullopt, 500000};
}; };
extern PerformanceMetrics g_perf_metrics; extern PerformanceMetrics g_perf_metrics;

View File

@ -5,8 +5,10 @@
#include <algorithm> #include <algorithm>
#include <cmath> #include <cmath>
#include <implot.h>
#include <iomanip> #include <iomanip>
#include <mutex>
#include <implot.h>
#include "Common/CommonTypes.h" #include "Common/CommonTypes.h"
#include "Common/FileUtil.h" #include "Common/FileUtil.h"
@ -16,7 +18,7 @@
static constexpr double SAMPLE_RC_RATIO = 0.25; static constexpr double SAMPLE_RC_RATIO = 0.25;
PerformanceTracker::PerformanceTracker(const char* log_name, PerformanceTracker::PerformanceTracker(const std::optional<std::string> log_name,
const std::optional<s64> sample_window_us) const std::optional<s64> sample_window_us)
: m_on_state_changed_handle{Core::AddOnStateChangedCallback([this](Core::State state) { : m_on_state_changed_handle{Core::AddOnStateChangedCallback([this](Core::State state) {
if (state == Core::State::Paused) if (state == Core::State::Paused)
@ -36,7 +38,7 @@ PerformanceTracker::~PerformanceTracker()
void PerformanceTracker::Reset() void PerformanceTracker::Reset()
{ {
std::lock_guard lock{m_mutex}; std::unique_lock lock{m_mutex};
QueueClear(); QueueClear();
m_last_time = Clock::now(); m_last_time = Clock::now();
@ -47,7 +49,7 @@ void PerformanceTracker::Reset()
void PerformanceTracker::Count() void PerformanceTracker::Count()
{ {
std::lock_guard lock{m_mutex}; std::unique_lock lock{m_mutex};
if (m_paused) if (m_paused)
return; return;
@ -84,7 +86,6 @@ void PerformanceTracker::Count()
m_dt_std = std::nullopt; m_dt_std = std::nullopt;
if (m_log_name && g_ActiveConfig.bLogRenderTimeToFile)
LogRenderTimeToFile(diff); LogRenderTimeToFile(diff);
} }
@ -97,19 +98,19 @@ DT PerformanceTracker::GetSampleWindow() const
double PerformanceTracker::GetHzAvg() const double PerformanceTracker::GetHzAvg() const
{ {
std::lock_guard lock{m_mutex}; std::shared_lock lock{m_mutex};
return m_hz_avg; return m_hz_avg;
} }
DT PerformanceTracker::GetDtAvg() const DT PerformanceTracker::GetDtAvg() const
{ {
std::lock_guard lock{m_mutex}; std::shared_lock lock{m_mutex};
return m_dt_avg; return m_dt_avg;
} }
DT PerformanceTracker::GetDtStd() const DT PerformanceTracker::GetDtStd() const
{ {
std::lock_guard lock{m_mutex}; std::unique_lock lock{m_mutex};
if (m_dt_std) if (m_dt_std)
return *m_dt_std; return *m_dt_std;
@ -130,7 +131,7 @@ DT PerformanceTracker::GetDtStd() const
DT PerformanceTracker::GetLastRawDt() const DT PerformanceTracker::GetLastRawDt() const
{ {
std::lock_guard lock{m_mutex}; std::shared_lock lock{m_mutex};
if (QueueEmpty()) if (QueueEmpty())
return DT::zero(); return DT::zero();
@ -142,7 +143,7 @@ void PerformanceTracker::ImPlotPlotLines(const char* label) const
{ {
static std::array<float, MAX_DT_QUEUE_SIZE + 2> x, y; static std::array<float, MAX_DT_QUEUE_SIZE + 2> x, y;
std::lock_guard lock{m_mutex}; std::shared_lock lock{m_mutex};
if (QueueEmpty()) if (QueueEmpty())
return; return;
@ -228,9 +229,13 @@ bool PerformanceTracker::QueueEmpty() const
void PerformanceTracker::LogRenderTimeToFile(DT val) void PerformanceTracker::LogRenderTimeToFile(DT val)
{ {
if (!m_log_name || !g_ActiveConfig.bLogRenderTimeToFile)
return;
if (!m_bench_file.is_open()) if (!m_bench_file.is_open())
{ {
File::OpenFStream(m_bench_file, File::GetUserPath(D_LOGS_IDX) + m_log_name, std::ios_base::out); File::OpenFStream(m_bench_file, File::GetUserPath(D_LOGS_IDX) + *m_log_name,
std::ios_base::out);
} }
m_bench_file << std::fixed << std::setprecision(8) << DT_ms(val).count() << std::endl; m_bench_file << std::fixed << std::setprecision(8) << DT_ms(val).count() << std::endl;
@ -238,7 +243,7 @@ void PerformanceTracker::LogRenderTimeToFile(DT val)
void PerformanceTracker::SetPaused(bool paused) void PerformanceTracker::SetPaused(bool paused)
{ {
std::lock_guard lock{m_mutex}; std::unique_lock lock{m_mutex};
m_paused = paused; m_paused = paused;
if (m_paused) if (m_paused)

View File

@ -6,8 +6,8 @@
#include <array> #include <array>
#include <chrono> #include <chrono>
#include <fstream> #include <fstream>
#include <mutex>
#include <optional> #include <optional>
#include <shared_mutex>
#include "Common/CommonTypes.h" #include "Common/CommonTypes.h"
@ -34,8 +34,8 @@ private:
} }
public: public:
PerformanceTracker(const char* log_name = nullptr, PerformanceTracker(const std::optional<std::string> log_name = std::nullopt,
const std::optional<s64> sample_window_us = {}); const std::optional<s64> sample_window_us = std::nullopt);
~PerformanceTracker(); ~PerformanceTracker();
PerformanceTracker(const PerformanceTracker&) = delete; PerformanceTracker(const PerformanceTracker&) = delete;
@ -77,7 +77,7 @@ private: // Functions for managing dt queue
int m_on_state_changed_handle; int m_on_state_changed_handle;
// Name of log file and file stream // Name of log file and file stream
const char* m_log_name; std::optional<std::string> m_log_name;
std::ofstream m_bench_file; std::ofstream m_bench_file;
// Last time Count() was called // Last time Count() was called
@ -100,5 +100,5 @@ private: // Functions for managing dt queue
mutable std::optional<DT> m_dt_std = std::nullopt; mutable std::optional<DT> m_dt_std = std::nullopt;
// Used to enable thread safety with the performance tracker // Used to enable thread safety with the performance tracker
mutable std::mutex m_mutex; mutable std::shared_mutex m_mutex;
}; };