diff options
author | gdkchan <gab.dark.100@gmail.com> | 2018-06-23 21:39:25 -0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-06-23 21:39:25 -0300 |
commit | e7559f128f99058774a8d53aa45213b51c085e76 (patch) | |
tree | 42d367bfb4248b19cf2ce55439d24437bbbd2ccb /Ryujinx.HLE/PerformanceStatistics.cs | |
parent | 69697957e6406235d512a89d9144c160fe7efbfd (diff) |
Small OpenGL Renderer refactoring (#177)
* Call OpenGL functions directly, remove the pfifo thread, some refactoring
* Fix PerformanceStatistics calculating the wrong host fps, remove wait event on PFIFO as this wasn't exactly was causing the freezes (may replace with an exception later)
* Organized the Gpu folder a bit more, renamed a few things, address PR feedback
* Make PerformanceStatistics thread safe
* Remove unused constant
* Use unlimited update rate for better pref
Diffstat (limited to 'Ryujinx.HLE/PerformanceStatistics.cs')
-rw-r--r-- | Ryujinx.HLE/PerformanceStatistics.cs | 135 |
1 files changed, 85 insertions, 50 deletions
diff --git a/Ryujinx.HLE/PerformanceStatistics.cs b/Ryujinx.HLE/PerformanceStatistics.cs index bbcdc645..9bc3d6b4 100644 --- a/Ryujinx.HLE/PerformanceStatistics.cs +++ b/Ryujinx.HLE/PerformanceStatistics.cs @@ -1,84 +1,119 @@ 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); + private const double FrameRateWeight = 0.5; + + private const int FrameTypeSystem = 0; + private const int FrameTypeGame = 1; + + private double[] AverageFrameRate; + private double[] AccumulatedFrameTime; + private double[] PreviousFrameTime; + + private long[] FramesRendered; + + private object[] FrameLock; + + private double TicksToSeconds; + + private Stopwatch ExecutionTime; + + private Timer ResetTimer; public PerformanceStatistics() { + AverageFrameRate = new double[2]; + AccumulatedFrameTime = new double[2]; + PreviousFrameTime = new double[2]; + + FramesRendered = new long[2]; + + FrameLock = new object[] { new object(), new object() }; + + ExecutionTime = new Stopwatch(); + ExecutionTime.Start(); + + ResetTimer = new Timer(1000); + ResetTimer.Elapsed += ResetTimerElapsed; + ResetTimer.AutoReset = true; + ResetTimer.Start(); + + TicksToSeconds = 1.0 / Stopwatch.Frequency; } private void ResetTimerElapsed(object sender, ElapsedEventArgs e) { - ResetStatistics(); + CalculateAverageFrameRate(FrameTypeSystem); + CalculateAverageFrameRate(FrameTypeGame); } - public void StartSystemFrame() + private void CalculateAverageFrameRate(int FrameType) { - PreviousSystemFrameTime = CurrentSystemFrameTime; - LastSystemFrameEnded = CurrentSystemFrameEnded; - CurrentSystemFrameStart = ElapsedMicroseconds; + double FrameRate = 0; + + if (AccumulatedFrameTime[FrameType] > 0) + { + FrameRate = FramesRendered[FrameType] / AccumulatedFrameTime[FrameType]; + } + + lock (FrameLock[FrameType]) + { + AverageFrameRate[FrameType] = LinearInterpolate(AverageFrameRate[FrameType], FrameRate); + + FramesRendered[FrameType] = 0; + + AccumulatedFrameTime[FrameType] = 0; + } } - public void EndSystemFrame() + private double LinearInterpolate(double Old, double New) { - CurrentSystemFrameEnded = ElapsedMicroseconds; - CurrentSystemFrameTime = CurrentSystemFrameEnded - CurrentSystemFrameStart; - AccumulatedSystemFrameTime += CurrentSystemFrameTime; - SystemFramesRendered++; + return Old * (1.0 - FrameRateWeight) + New * FrameRateWeight; + } + + public void RecordSystemFrameTime() + { + RecordFrameTime(FrameTypeSystem); } public void RecordGameFrameTime() { - CurrentGameFrameEnded = ElapsedMicroseconds; - CurrentGameFrameTime = CurrentGameFrameEnded - LastGameFrameEnded; - PreviousGameFrameTime = CurrentGameFrameTime; - LastGameFrameEnded = CurrentGameFrameEnded; - AccumulatedGameFrameTime += CurrentGameFrameTime; - GameFramesRendered++; + RecordFrameTime(FrameTypeGame); + } + + private void RecordFrameTime(int FrameType) + { + double CurrentFrameTime = ExecutionTime.ElapsedTicks * TicksToSeconds; + + double ElapsedFrameTime = CurrentFrameTime - PreviousFrameTime[FrameType]; + + PreviousFrameTime[FrameType] = CurrentFrameTime; + + lock (FrameLock[FrameType]) + { + AccumulatedFrameTime[FrameType] += ElapsedFrameTime; + + FramesRendered[FrameType]++; + } + } + + public double GetSystemFrameRate() + { + return AverageFrameRate[FrameTypeSystem]; } - public void ResetStatistics() + public double GetGameFrameRate() { - 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; + return AverageFrameRate[FrameTypeGame]; } } } |