diff options
| author | riperiperi <rhy3756547@hotmail.com> | 2020-12-17 18:39:52 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-12-17 19:39:52 +0100 |
| commit | 10aa11ce13291cf2ea2aeb751838c65c45fdc0ba (patch) | |
| tree | 3ace1ad77af0fdbfc37ffdee86c24afb5fec97c8 /Ryujinx.HLE/PerformanceStatistics.cs | |
| parent | eae39f80e7ca9ab220e9884c2457c934c2488e00 (diff) | |
Interrupt GPU command processing when a frame's fence is reached. (#1741)
* Interrupt GPU command processing when a frame's fence is reached.
* Accumulate times rather than %s
* Accurate timer for vsync
Spin wait for the last .667ms of a frame. Avoids issues caused by signalling 16ms vsync. (periodic stutters in smo)
* Use event wait for better timing.
* Fix lazy wait
Windows doesn't seem to want to do 1ms consistently, so force a spin if we're less than 2ms.
* A bit more efficiency on frame waits.
Should now wait the remainder 0.6667 instead of 1.6667 sometimes (odd waits above 1ms are reliable, unlike 1ms waits)
* Better swap interval 0 solution
737 fps without breaking a sweat. Downside: Vsync can no longer be disabled on games that use the event heavily (link's awakening - which is ok since it breaks anyways)
* Fix comment.
* Address Comments.
Diffstat (limited to 'Ryujinx.HLE/PerformanceStatistics.cs')
| -rw-r--r-- | Ryujinx.HLE/PerformanceStatistics.cs | 30 |
1 files changed, 14 insertions, 16 deletions
diff --git a/Ryujinx.HLE/PerformanceStatistics.cs b/Ryujinx.HLE/PerformanceStatistics.cs index be86584a..fdc1e99f 100644 --- a/Ryujinx.HLE/PerformanceStatistics.cs +++ b/Ryujinx.HLE/PerformanceStatistics.cs @@ -16,12 +16,12 @@ namespace Ryujinx.HLE private double[] _previousFrameTime; private double[] _averagePercent; - private double[] _accumulatedPercent; + private double[] _accumulatedActiveTime; private double[] _percentLastEndTime; private double[] _percentStartTime; - private long[] _framesRendered; - private long[] _percentCount; + private long[] _framesRendered; + private double[] _percentTime; private object[] _frameLock; private object[] _percentLock; @@ -36,13 +36,13 @@ namespace Ryujinx.HLE _accumulatedFrameTime = new double[1]; _previousFrameTime = new double[1]; - _averagePercent = new double[1]; - _accumulatedPercent = new double[1]; - _percentLastEndTime = new double[1]; - _percentStartTime = new double[1]; + _averagePercent = new double[1]; + _accumulatedActiveTime = new double[1]; + _percentLastEndTime = new double[1]; + _percentStartTime = new double[1]; _framesRendered = new long[1]; - _percentCount = new long[1]; + _percentTime = new double[1]; _frameLock = new object[] { new object() }; _percentLock = new object[] { new object() }; @@ -91,16 +91,16 @@ namespace Ryujinx.HLE lock (_percentLock[percentType]) { - if (_percentCount[percentType] > 0) + if (_percentTime[percentType] > 0) { - percent = _accumulatedPercent[percentType] / _percentCount[percentType]; + percent = (_accumulatedActiveTime[percentType] / _percentTime[percentType]) * 100; } _averagePercent[percentType] = percent; - _percentCount[percentType] = 0; + _percentTime[percentType] = 0; - _accumulatedPercent[percentType] = 0; + _accumulatedActiveTime[percentType] = 0; } } @@ -138,13 +138,11 @@ namespace Ryujinx.HLE double elapsedTime = currentTime - _percentLastEndTime[percentType]; double elapsedActiveTime = currentTime - _percentStartTime[percentType]; - double percentActive = (elapsedActiveTime / elapsedTime) * 100; - lock (_percentLock[percentType]) { - _accumulatedPercent[percentType] += percentActive; + _accumulatedActiveTime[percentType] += elapsedActiveTime; - _percentCount[percentType]++; + _percentTime[percentType] += elapsedTime; } _percentLastEndTime[percentType] = currentTime; |
