aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.HLE/PerformanceStatistics.cs
diff options
context:
space:
mode:
authorgdkchan <gab.dark.100@gmail.com>2018-06-10 21:46:42 -0300
committergdkchan <gab.dark.100@gmail.com>2018-06-10 21:46:42 -0300
commit76f3b1b3a4637ec72abfbb8cbc0679f2e0ca838f (patch)
tree0411b709de31c1c0517763512df8eeb9f7491bc9 /Ryujinx.HLE/PerformanceStatistics.cs
parent518fe799da6dd4f12c58c9e6e174767effb0b868 (diff)
Rename Ryujinx.Core to Ryujinx.HLE and add a separate project for a future LLE implementation
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;
+ }
+ }
+}