aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.HLE/PerformanceStatistics.cs
diff options
context:
space:
mode:
authorriperiperi <rhy3756547@hotmail.com>2020-12-17 18:39:52 +0000
committerGitHub <noreply@github.com>2020-12-17 19:39:52 +0100
commit10aa11ce13291cf2ea2aeb751838c65c45fdc0ba (patch)
tree3ace1ad77af0fdbfc37ffdee86c24afb5fec97c8 /Ryujinx.HLE/PerformanceStatistics.cs
parenteae39f80e7ca9ab220e9884c2457c934c2488e00 (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.cs30
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;