diff options
Diffstat (limited to 'Ryujinx.Profiler/UI/ProfileWindowManager.cs')
| -rw-r--r-- | Ryujinx.Profiler/UI/ProfileWindowManager.cs | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/Ryujinx.Profiler/UI/ProfileWindowManager.cs b/Ryujinx.Profiler/UI/ProfileWindowManager.cs new file mode 100644 index 00000000..4ba0c881 --- /dev/null +++ b/Ryujinx.Profiler/UI/ProfileWindowManager.cs @@ -0,0 +1,90 @@ +using System.Diagnostics; +using System.Threading; +using OpenTK; +using OpenTK.Input; +using Ryujinx.Common; + +namespace Ryujinx.Profiler.UI +{ + public class ProfileWindowManager + { + private ProfileWindow _window; + private Thread _profileThread; + private Thread _renderThread; + private bool _profilerRunning; + + // Timing + private double _prevTime; + + public ProfileWindowManager() + { + if (Profile.ProfilingEnabled()) + { + _profilerRunning = true; + _prevTime = 0; + _profileThread = new Thread(ProfileLoop); + _profileThread.Start(); + } + } + + public void ToggleVisible() + { + if (Profile.ProfilingEnabled()) + { + _window.ToggleVisible(); + } + } + + public void Close() + { + if (_window != null) + { + _profilerRunning = false; + _window.Close(); + _window.Dispose(); + } + + _window = null; + } + + public void UpdateKeyInput(KeyboardState keyboard) + { + if (Profile.Controls.TogglePressed(keyboard)) + { + ToggleVisible(); + } + Profile.Controls.SetPrevKeyboardState(keyboard); + } + + private void ProfileLoop() + { + using (_window = new ProfileWindow()) + { + // Create thread for render loop + _renderThread = new Thread(RenderLoop); + _renderThread.Start(); + + while (_profilerRunning) + { + double time = (double)PerformanceCounter.ElapsedTicks / PerformanceCounter.TicksPerSecond; + _window.Update(new FrameEventArgs(time - _prevTime)); + _prevTime = time; + + // Sleep to be less taxing, update usually does very little + Thread.Sleep(1); + } + } + } + + private void RenderLoop() + { + _window.Context.MakeCurrent(_window.WindowInfo); + + while (_profilerRunning) + { + _window.Draw(); + Thread.Sleep(1); + } + } + } +} |
