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.
This commit is contained in:
parent
eae39f80e7
commit
10aa11ce13
9 changed files with 146 additions and 30 deletions
|
@ -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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue