aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Core/PerformanceStatistics.cs
blob: e5d930f93468ec9dbaed12395e911a9df06ce754 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
using System.Diagnostics;
using System.Timers;

namespace Ryujinx.Core
{
    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;
        }
    }
}