aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/perf_stats.h
diff options
context:
space:
mode:
authorameerj <[email protected]>2021-05-15 20:34:20 -0400
committerameerj <[email protected]>2021-05-15 20:34:20 -0400
commit5bef54618a2850e42f7bab45120dab9166468a25 (patch)
treeadc5dbbe050488eb0d85b7a38a5c8310dca9ef92 /src/core/perf_stats.h
parent904584e4ba0b87e3f1555e29e9bf31109b65e301 (diff)
downloadyuzu-mainline-5bef54618a2850e42f7bab45120dab9166468a25.tar.gz
yuzu-mainline-5bef54618a2850e42f7bab45120dab9166468a25.zip
perf_stats: Rework FPS counter to be more accurate
The FPS counter was based on metrics in the nvdisp swapbuffers call. This metric would be accurate if the gpu thread/renderer were synchronous with the nvdisp service, but that's no longer the case. This commit moves the frame counting responsibility onto the concrete renderers after their frame draw calls. Resulting in more meaningful metrics. The displayed FPS is now made up of the average framerate between the previous and most recent update, in order to avoid distracting FPS counter updates when framerate is oscillating between close values. The status bar update frequency was also changed from 2 seconds to 500ms.
Diffstat (limited to 'src/core/perf_stats.h')
-rw-r--r--src/core/perf_stats.h9
1 files changed, 6 insertions, 3 deletions
diff --git a/src/core/perf_stats.h b/src/core/perf_stats.h
index 69256b960..90f9cc048 100644
--- a/src/core/perf_stats.h
+++ b/src/core/perf_stats.h
@@ -5,6 +5,7 @@
#pragma once
#include <array>
+#include <atomic>
#include <chrono>
#include <cstddef>
#include <mutex>
@@ -15,8 +16,8 @@ namespace Core {
struct PerfStatsResults {
/// System FPS (LCD VBlanks) in Hz
double system_fps;
- /// Game FPS (GSP frame submissions) in Hz
- double game_fps;
+ /// Average game FPS (GPU frame renders) in Hz
+ double average_game_fps;
/// Walltime per system frame, in seconds, excluding any waits
double frametime;
/// Ratio of walltime / emulated time elapsed
@@ -72,7 +73,7 @@ private:
/// Cumulative number of system frames (LCD VBlanks) presented since last reset
u32 system_frames = 0;
/// Cumulative number of game frames (GSP frame submissions) since last reset
- u32 game_frames = 0;
+ std::atomic<u32> game_frames = 0;
/// Point when the previous system frame ended
Clock::time_point previous_frame_end = reset_point;
@@ -80,6 +81,8 @@ private:
Clock::time_point frame_begin = reset_point;
/// Total visible duration (including frame-limiting, etc.) of the previous system frame
Clock::duration previous_frame_length = Clock::duration::zero();
+ /// Previously computed fps
+ double previous_fps = 0;
};
class FrameLimiter {