91 lines
2.3 KiB
C#
91 lines
2.3 KiB
C#
|
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);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|