aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.HLE/PerformanceStatistics.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Ryujinx.HLE/PerformanceStatistics.cs')
-rw-r--r--Ryujinx.HLE/PerformanceStatistics.cs84
1 files changed, 84 insertions, 0 deletions
diff --git a/Ryujinx.HLE/PerformanceStatistics.cs b/Ryujinx.HLE/PerformanceStatistics.cs
new file mode 100644
index 00000000..bbcdc645
--- /dev/null
+++ b/Ryujinx.HLE/PerformanceStatistics.cs
@@ -0,0 +1,84 @@
+using System.Diagnostics;
+using System.Timers;
+
+namespace Ryujinx.HLE
+{
+ public class PerformanceStatistics
+ {
+ Stopwatch ExecutionTime = new Stopwatch();
+ Timer ResetTimer = new Timer(1000);
+
+ long CurrentGameFrameEnded;
+ long CurrentSystemFrameEnded;
+ long CurrentSystemFrameStart;
+ long LastGameFrameEnded;
+ long LastSystemFrameEnded;
+
+ double AccumulatedGameFrameTime;
+ double AccumulatedSystemFrameTime;
+ double CurrentGameFrameTime;
+ double CurrentSystemFrameTime;
+ double PreviousGameFrameTime;
+ double PreviousSystemFrameTime;
+ public double GameFrameRate { get; private set; }
+ public double SystemFrameRate { get; private set; }
+ public long SystemFramesRendered;
+ public long GameFramesRendered;
+ public long ElapsedMilliseconds => ExecutionTime.ElapsedMilliseconds;
+ public long ElapsedMicroseconds => (long)
+ (((double)ExecutionTime.ElapsedTicks / Stopwatch.Frequency) * 1000000);
+ public long ElapsedNanoseconds => (long)
+ (((double)ExecutionTime.ElapsedTicks / Stopwatch.Frequency) * 1000000000);
+
+ public PerformanceStatistics()
+ {
+ ExecutionTime.Start();
+ ResetTimer.Elapsed += ResetTimerElapsed;
+ ResetTimer.AutoReset = true;
+ ResetTimer.Start();
+ }
+
+ private void ResetTimerElapsed(object sender, ElapsedEventArgs e)
+ {
+ ResetStatistics();
+ }
+
+ public void StartSystemFrame()
+ {
+ PreviousSystemFrameTime = CurrentSystemFrameTime;
+ LastSystemFrameEnded = CurrentSystemFrameEnded;
+ CurrentSystemFrameStart = ElapsedMicroseconds;
+ }
+
+ public void EndSystemFrame()
+ {
+ CurrentSystemFrameEnded = ElapsedMicroseconds;
+ CurrentSystemFrameTime = CurrentSystemFrameEnded - CurrentSystemFrameStart;
+ AccumulatedSystemFrameTime += CurrentSystemFrameTime;
+ SystemFramesRendered++;
+ }
+
+ public void RecordGameFrameTime()
+ {
+ CurrentGameFrameEnded = ElapsedMicroseconds;
+ CurrentGameFrameTime = CurrentGameFrameEnded - LastGameFrameEnded;
+ PreviousGameFrameTime = CurrentGameFrameTime;
+ LastGameFrameEnded = CurrentGameFrameEnded;
+ AccumulatedGameFrameTime += CurrentGameFrameTime;
+ GameFramesRendered++;
+ }
+
+ public void ResetStatistics()
+ {
+ GameFrameRate = 1000 / ((AccumulatedGameFrameTime / GameFramesRendered) / 1000);
+ GameFrameRate = double.IsNaN(GameFrameRate) ? 0 : GameFrameRate;
+ SystemFrameRate = 1000 / ((AccumulatedSystemFrameTime / SystemFramesRendered) / 1000);
+ SystemFrameRate = double.IsNaN(SystemFrameRate) ? 0 : SystemFrameRate;
+
+ GameFramesRendered = 0;
+ SystemFramesRendered = 0;
+ AccumulatedGameFrameTime = 0;
+ AccumulatedSystemFrameTime = 0;
+ }
+ }
+}