From 10aa11ce13291cf2ea2aeb751838c65c45fdc0ba Mon Sep 17 00:00:00 2001 From: riperiperi Date: Thu, 17 Dec 2020 18:39:52 +0000 Subject: 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. --- Ryujinx.HLE/PerformanceStatistics.cs | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) (limited to 'Ryujinx.HLE/PerformanceStatistics.cs') 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; -- cgit v1.2.3