namespace MrGameEng.Core; /// /// Engine time service: per-frame delta, total elapsed time, time scaling and frame counter. /// Advanced once per frame (or per fixed tick) by the host. /// public sealed class GameClock { /// Seconds elapsed since the previous frame, multiplied by . public float DeltaTime { get; private set; } /// Seconds elapsed since the previous frame, unaffected by . public float UnscaledDeltaTime { get; private set; } /// Total scaled time in seconds since the game started. public double TotalTime { get; private set; } /// Total unscaled time in seconds since the game started. public double UnscaledTotalTime { get; private set; } /// Multiplier applied to . 0 pauses gameplay, 1 is real time. Never negative. public float TimeScale { get => _timeScale; set => _timeScale = value < 0f ? 0f : value; } /// Number of completed frames since the game started. public long FrameCount { get; private set; } private float _timeScale = 1f; /// Advances the clock by one frame. Called by the host; games should not call this. public void Advance(float unscaledDeltaSeconds) { UnscaledDeltaTime = unscaledDeltaSeconds; DeltaTime = unscaledDeltaSeconds * _timeScale; UnscaledTotalTime += unscaledDeltaSeconds; TotalTime += DeltaTime; FrameCount++; } }