public Game() { this.IsActive = true; this.m_waiter = new ManualResetEventSlim(false, 0); this.m_handler = (a, b, c, d, e) => this.m_waiter.Set(); this.CPULoadSmooth = 1f; }
public override void Run(VoidAction tickCallback) { // 59.75 is sort of compensation long ticksPerFrame = (int)Math.Round(MyGameTimer.Frequency / 59.75f); long targetTicks = 0; MyLog.Default.WriteLine("Timer Frequency: " + MyGameTimer.Frequency); MyLog.Default.WriteLine("Ticks per frame: " + ticksPerFrame); ManualResetEventSlim waiter = new ManualResetEventSlim(false, 0); MyTimer.TimerEventHandler handler = new MyTimer.TimerEventHandler((a, b, c, d, e) => { waiter.Set(); }); base.Run(delegate { using (Stats.Generic.Measure("WaitForUpdate")) { var currentTicks = m_gameTimer.ElapsedTicks; // Wait for correct frame start targetTicks += ticksPerFrame; if (currentTicks > targetTicks + ticksPerFrame * 5) { // We're more behind than 5 frames, don't try to catch up targetTicks = currentTicks; } else { // For until correct tick comes if (MyFakes.ENABLE_UPDATE_WAIT) { var remaining = MyTimeSpan.FromTicks(targetTicks - currentTicks); int waitMs = (int)(remaining.Miliseconds - 0.1); // To handle up to 0.1ms inaccuracy of timer if (waitMs > 0) { waiter.Reset(); MyTimer.StartOneShot(waitMs, handler); waiter.Wait(17); // Never wait more than 17ms //Debug.Assert(MyPerformanceCounter.ElapsedTicks < targetTicks); //VRageRender.MyRenderStats.Write("WaitRemaining", (float)MyPerformanceCounter.TicksToMs(targetTicks - MyPerformanceCounter.ElapsedTicks), VRageRender.MyStatTypeEnum.MinMaxAvg, 300, 3); } } while (m_gameTimer.ElapsedTicks < targetTicks) { ; } } } //UpdateInternal(); tickCallback(); ProfilerShort.Commit(); }); }
/// <summary> /// Initializes a new instance of the <see cref="Game" /> class. /// </summary> public Game() { IsActive = true; m_waiter = new ManualResetEventSlim(false, 0); m_handler = new MyTimer.TimerEventHandler((a, b, c, d, e) => { m_waiter.Set(); }); }
public WaitForTargetFrameRate(MyGameTimer timer, float targetFrequency = 59.75f) { m_timer = timer; m_targetFrequency = targetFrequency; m_handler = new MyTimer.TimerEventHandler((a, b, c, d, e) => { m_waiter.Set(); }); }
public override void Run(VoidAction tickCallback) { // 59.75 is sort of compensation long ticksPerFrame = (int)Math.Round(MyGameTimer.Frequency / 59.75f); long targetTicks = 0; MyLog.Default.WriteLine("Timer Frequency: " + MyGameTimer.Frequency); MyLog.Default.WriteLine("Ticks per frame: " + ticksPerFrame); ManualResetEventSlim waiter = new ManualResetEventSlim(false, 0); MyTimer.TimerEventHandler handler = new MyTimer.TimerEventHandler((a, b, c, d, e) => { waiter.Set(); }); base.Run(delegate { using (Stats.Generic.Measure("WaitForUpdate")) { var currentTicks = m_gameTimer.ElapsedTicks; // Wait for correct frame start targetTicks += ticksPerFrame; if (currentTicks > targetTicks + ticksPerFrame * 5) { // We're more behind than 5 frames, don't try to catch up targetTicks = currentTicks; } else { // For until correct tick comes if (MyFakes.ENABLE_UPDATE_WAIT) { var remaining = MyTimeSpan.FromTicks(targetTicks - currentTicks); int waitMs = (int)(remaining.Miliseconds - 0.1); // To handle up to 0.1ms inaccuracy of timer if (waitMs > 0) { waiter.Reset(); MyTimer.StartOneShot(waitMs, handler); waiter.Wait(17); // Never wait more than 17ms //Debug.Assert(MyPerformanceCounter.ElapsedTicks < targetTicks); //VRageRender.MyRenderStats.Write("WaitRemaining", (float)MyPerformanceCounter.TicksToMs(targetTicks - MyPerformanceCounter.ElapsedTicks), VRageRender.MyStatTypeEnum.MinMaxAvg, 300, 3); } } while (m_gameTimer.ElapsedTicks < targetTicks) ; } } //UpdateInternal(); tickCallback(); ProfilerShort.Commit(); }); }
public override void Run(VoidAction tickCallback) { long targetTicks = 0; ManualResetEventSlim waiter = new ManualResetEventSlim(false, 0); MyTimer.TimerEventHandler handler = new MyTimer.TimerEventHandler((a, b, c, d, e) => { waiter.Set(); }); base.Run(delegate { using (StatGroup.Measure(StatName)) { var currentTicks = m_gameTimer.ElapsedTicks; // Wait for correct frame start targetTicks += TickPerFrame; if (currentTicks > targetTicks + TickPerFrame * 5) { // We're more behind than 5 frames, don't try to catch up targetTicks = currentTicks; } else { // For until correct tick comes if (EnableUpdateWait) { var remaining = MyTimeSpan.FromTicks(targetTicks - currentTicks); int waitMs = (int)(remaining.Miliseconds - 0.1); // To handle up to 0.1ms inaccuracy of timer if (waitMs > 0) { waiter.Reset(); MyTimer.StartOneShot(waitMs, handler); waiter.Wait(17); // Never wait more than 17ms //Debug.Assert(MyPerformanceCounter.ElapsedTicks < targetTicks); //VRageRender.MyRenderStats.Write("WaitRemaining", (float)MyPerformanceCounter.TicksToMs(targetTicks - MyPerformanceCounter.ElapsedTicks), VRageRender.MyStatTypeEnum.MinMaxAvg, 300, 3); } } while (m_gameTimer.ElapsedTicks < targetTicks) { ; } } } //UpdateInternal(); tickCallback(); }); }
public override void Run(VoidAction tickCallback) { long targetTicks = 0; ManualResetEventSlim waiter = new ManualResetEventSlim(false, 0); MyTimer.TimerEventHandler handler = new MyTimer.TimerEventHandler((a, b, c, d, e) => { waiter.Set(); }); base.Run(delegate { using (StatGroup.Measure(StatName)) { var currentTicks = m_gameTimer.ElapsedTicks; // Wait for correct frame start targetTicks += TickPerFrame; if (currentTicks > targetTicks + TickPerFrame * 5) { // We're more behind than 5 frames, don't try to catch up targetTicks = currentTicks; } else { // For until correct tick comes if (EnableUpdateWait) { var remaining = MyTimeSpan.FromTicks(targetTicks - currentTicks); int waitMs = (int)(remaining.Miliseconds - 0.1); // To handle up to 0.1ms inaccuracy of timer if (waitMs > 0) { waiter.Reset(); MyTimer.StartOneShot(waitMs, handler); waiter.Wait(17); // Never wait more than 17ms //Debug.Assert(MyPerformanceCounter.ElapsedTicks < targetTicks); //VRageRender.MyRenderStats.Write("WaitRemaining", (float)MyPerformanceCounter.TicksToMs(targetTicks - MyPerformanceCounter.ElapsedTicks), VRageRender.MyStatTypeEnum.MinMaxAvg, 300, 3); } } while (m_gameTimer.ElapsedTicks < targetTicks) ; } } //UpdateInternal(); tickCallback(); }); }