report average framerate instead of current framerate

This commit is contained in:
emmaus 2018-03-06 18:50:45 +00:00
commit c70abf955e

View file

@ -2,12 +2,14 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using System.Text; using System.Text;
using System.Timers;
namespace Ryujinx.Core namespace Ryujinx.Core
{ {
public class PerformanceStatistics public class PerformanceStatistics
{ {
Stopwatch ExecutionTime = new Stopwatch(); Stopwatch ExecutionTime = new Stopwatch();
Timer ResetTimer = new Timer(1000);
long CurrentGameFrameEnded; long CurrentGameFrameEnded;
long CurrentSystemFrameEnded; long CurrentSystemFrameEnded;
@ -15,23 +17,33 @@ namespace Ryujinx.Core
long LastGameFrameEnded; long LastGameFrameEnded;
long LastSystemFrameEnded; long LastSystemFrameEnded;
public double CurrentGameFrameTime; double AccumulatedGameFrameTime;
public double CurrentSystemFrameTime; double AccumulatedSystemFrameTime;
public double PreviousGameFrameTime; double CurrentGameFrameTime;
public double PreviousSystemFrameTime; double CurrentSystemFrameTime;
public double GameFrameRate => 1000f / (CurrentSystemFrameTime / 1000); double PreviousGameFrameTime;
public double SystemFrameRate => 1000f/(CurrentSystemFrameTime/1000); double PreviousSystemFrameTime;
public double GameFrameRate { get; private set; }
public double SystemFrameRate { get; private set; }
public long SystemFramesRendered; public long SystemFramesRendered;
public long GameFramesRendered; public long GameFramesRendered;
public long ElapsedMilliseconds { get => ExecutionTime.ElapsedMilliseconds; } public long ElapsedMilliseconds => ExecutionTime.ElapsedMilliseconds;
public long ElapsedMicroseconds { get => (long) public long ElapsedMicroseconds => (long)
(((double)ExecutionTime.ElapsedTicks / Stopwatch.Frequency) * 1000000); } (((double)ExecutionTime.ElapsedTicks / Stopwatch.Frequency) * 1000000);
public long ElapsedNanoseconds { get => (long) public long ElapsedNanoseconds => (long)
(((double)ExecutionTime.ElapsedTicks / Stopwatch.Frequency) * 1000000000); } (((double)ExecutionTime.ElapsedTicks / Stopwatch.Frequency) * 1000000000);
public PerformanceStatistics() public PerformanceStatistics()
{ {
ExecutionTime.Start(); ExecutionTime.Start();
ResetTimer.Elapsed += ResetTimerElapsed;
ResetTimer.AutoReset = true;
ResetTimer.Start();
}
private void ResetTimerElapsed(object sender, ElapsedEventArgs e)
{
ResetStatistics();
} }
public void StartSystemFrame() public void StartSystemFrame()
@ -45,6 +57,7 @@ namespace Ryujinx.Core
{ {
CurrentSystemFrameEnded = ElapsedMicroseconds; CurrentSystemFrameEnded = ElapsedMicroseconds;
CurrentSystemFrameTime = CurrentSystemFrameEnded - CurrentSystemFrameStart; CurrentSystemFrameTime = CurrentSystemFrameEnded - CurrentSystemFrameStart;
AccumulatedSystemFrameTime += CurrentSystemFrameTime;
SystemFramesRendered++; SystemFramesRendered++;
} }
@ -54,7 +67,21 @@ namespace Ryujinx.Core
CurrentGameFrameTime = CurrentGameFrameEnded - LastGameFrameEnded; CurrentGameFrameTime = CurrentGameFrameEnded - LastGameFrameEnded;
PreviousGameFrameTime = CurrentGameFrameTime; PreviousGameFrameTime = CurrentGameFrameTime;
LastGameFrameEnded = CurrentGameFrameEnded; LastGameFrameEnded = CurrentGameFrameEnded;
AccumulatedGameFrameTime += CurrentGameFrameTime;
GameFramesRendered++; 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;
}
} }
} }