Stop data running away when paused and frame updated

This commit is contained in:
Andy Adshead 2019-01-30 00:33:55 +00:00
commit 2ab9428aad
4 changed files with 27 additions and 7 deletions

View file

@ -21,6 +21,7 @@ namespace Ryujinx.Profiler
private readonly Thread _cleanupThread; private readonly Thread _cleanupThread;
private bool _cleanupRunning; private bool _cleanupRunning;
private readonly long _history; private readonly long _history;
private long _preserve;
// Timing flags // Timing flags
private TimingFlag[] _timingFlags; private TimingFlag[] _timingFlags;
@ -53,7 +54,7 @@ namespace Ryujinx.Profiler
{ {
foreach (var timer in Timers) foreach (var timer in Timers)
{ {
timer.Value.Cleanup(SW.ElapsedTicks - _history); timer.Value.Cleanup(SW.ElapsedTicks - _history, _preserve - _history, _preserve);
} }
// No need to run too often // No need to run too often
@ -106,6 +107,8 @@ namespace Ryujinx.Profiler
{ {
Dictionary<ProfileConfig, TimingInfo> outDict = new Dictionary<ProfileConfig, TimingInfo>(); Dictionary<ProfileConfig, TimingInfo> outDict = new Dictionary<ProfileConfig, TimingInfo>();
_preserve = SW.ElapsedTicks;
// Forcibly get copy so user doesn't block profiling // Forcibly get copy so user doesn't block profiling
ProfileConfig[] configs = Timers.Keys.ToArray(); ProfileConfig[] configs = Timers.Keys.ToArray();
TimingInfo[] times = Timers.Values.ToArray(); TimingInfo[] times = Timers.Values.ToArray();

View file

@ -117,15 +117,25 @@ namespace Ryujinx.Profiler
} }
// Remove any timestamps before given timestamp to free memory // Remove any timestamps before given timestamp to free memory
public void Cleanup(long before) public void Cleanup(long before, long preserveStart, long preserveEnd)
{ {
lock (_timestampListLock) lock (_timestampListLock)
{ {
int toRemove = 0; int toRemove = 0;
int toPreserveStart = 0;
int toPreserveLen = 0;
for (int i = 0; i < _timestamps.Count; i++) for (int i = 0; i < _timestamps.Count; i++)
{ {
if (_timestamps[i].EndTime < before) if (_timestamps[i].EndTime < preserveStart)
{
toPreserveStart++;
}
else if (_timestamps[i].EndTime < preserveEnd)
{
toPreserveLen++;
}
else if (_timestamps[i].EndTime < before)
{ {
toRemove++; toRemove++;
} }
@ -136,9 +146,14 @@ namespace Ryujinx.Profiler
} }
} }
if (toPreserveStart > 0)
{
_timestamps.RemoveRange(0, toPreserveStart);
}
if (toRemove > 0) if (toRemove > 0)
{ {
_timestamps.RemoveRange(0, toRemove); _timestamps.RemoveRange(toPreserveStart + toPreserveLen, toRemove);
} }
} }
} }

View file

@ -217,6 +217,7 @@ namespace Ryujinx.Profiler.UI
_updateTimer = 0; _updateTimer = 0;
_unsortedProfileData = Profile.GetProfilingData().ToList(); _unsortedProfileData = Profile.GetProfilingData().ToList();
_captureTime = Profile.GetCurrentTime(); _captureTime = Profile.GetCurrentTime();
_timingFlags = Profile.GetTimingFlags();
_profileUpdated = true; _profileUpdated = true;
} }

View file

@ -6,6 +6,8 @@ namespace Ryujinx.Profiler.UI
{ {
public partial class ProfileWindow public partial class ProfileWindow
{ {
private TimingFlag[] _timingFlags;
private const float GraphMoveSpeed = 40000; private const float GraphMoveSpeed = 40000;
private const float GraphZoomSpeed = 50; private const float GraphZoomSpeed = 50;
@ -33,11 +35,10 @@ namespace Ryujinx.Profiler.UI
} }
// Draw timing flags // Draw timing flags
TimingFlag[] timingFlags = Profile.GetTimingFlags();
GL.Enable(EnableCap.ScissorTest); GL.Enable(EnableCap.ScissorTest);
GL.Color3(Color.Gray); GL.Color3(Color.Gray);
GL.Begin(PrimitiveType.Lines); GL.Begin(PrimitiveType.Lines);
foreach (TimingFlag timingFlag in timingFlags) foreach (TimingFlag timingFlag in _timingFlags)
{ {
int x = (int)(xOffset + width - ((float)(_captureTime - (timingFlag.Timestamp + graphPositionTicks)) / timeWidthTicks) * width); int x = (int)(xOffset + width - ((float)(_captureTime - (timingFlag.Timestamp + graphPositionTicks)) / timeWidthTicks) * width);
GL.Vertex2(x, 0); GL.Vertex2(x, 0);