mine2d/Mine2d/engine/Game.cs

47 lines
1.3 KiB
C#

using Mine2d.game;
namespace Mine2d.engine;
public abstract class Game
{
public const int Tps = 128;
private readonly bool running = true;
private readonly Queue<int> fpsQueue = new();
private DateTime nextFpsUpdate = DateTime.Now;
protected abstract void Update(double dt);
protected abstract void Draw();
public void Run()
{
var tLast = DateTime.Now;
var tAcc = TimeSpan.Zero;
while (this.running)
{
var dt = DateTime.Now - tLast;
tLast = DateTime.Now;
tAcc += dt;
var fps = (int)(1 / dt.TotalSeconds);
this.fpsQueue.Enqueue(fps);
while (this.fpsQueue.Count > fps)
{
this.fpsQueue.Dequeue();
}
if (this.nextFpsUpdate < DateTime.Now && this.fpsQueue.Count > 0)
{
var avgFps = this.fpsQueue.Sum() / this.fpsQueue.Count;
SDL_SetWindowTitle(Context.Get().Window.GetRaw(), "Mine2d - debug - " + avgFps + "fps");
this.nextFpsUpdate = DateTime.Now.AddMilliseconds(200);
}
while (tAcc >= TimeSpan.FromSeconds(1.0 / Tps))
{
this.Update(dt.TotalSeconds);
tAcc -= TimeSpan.FromSeconds(1.0 / Tps);
}
this.Draw();
}
}
}