using System; using System.Diagnostics; namespace Ryujinx.Cpu { public class TickSource : ITickSource { private static Stopwatch _tickCounter; private static double _hostTickFreq; /// public ulong Frequency { get; } /// public ulong Counter => (ulong)(ElapsedSeconds * Frequency); public long TickScalar { get; set; } private static long _acumElapsedTicks; private static long _lastElapsedTicks; private long ElapsedTicks { get { long elapsedTicks = _tickCounter.ElapsedTicks; _acumElapsedTicks += (elapsedTicks - _lastElapsedTicks) * TickScalar / 100; _lastElapsedTicks = elapsedTicks; return _acumElapsedTicks; } } /// public TimeSpan ElapsedTime => Stopwatch.GetElapsedTime(0, ElapsedTicks); /// public double ElapsedSeconds => ElapsedTicks * _hostTickFreq; public TickSource(ulong frequency) { Frequency = frequency; _hostTickFreq = 1.0 / Stopwatch.Frequency; _tickCounter = new Stopwatch(); _tickCounter.Start(); } /// public void Suspend() { _tickCounter.Stop(); } /// public void Resume() { _tickCounter.Start(); } } }