public void Tick(object sender, EventArgs e) { TimeSpan currentTime = stopWatch.Elapsed; TimeSpan elapsedTime = currentTime - lastTime; lastTime = currentTime; if (elapsedTime > MaxElapsedTime) { elapsedTime = MaxElapsedTime; } accumulatedTime += elapsedTime; bool updated = false; while (accumulatedTime >= TargetElapsedTime) { TurnsPerSecond = FrameUtil.CalculateRatePerSecond(); TakeTurn(); accumulatedTime -= TargetElapsedTime; updated = true; } if (updated) { Thread.Sleep(10); InvalidateNeeded?.Invoke(this, EventArgs.Empty); } }
public void CalculateFrameRateTest() { int i = 0; int currentFrameRate = 0; Console.WriteLine("Running frame rate test 1, this takes 10 seconds..."); while (i < 100) { currentFrameRate = FrameUtil.CalculateRatePerSecond(); System.Threading.Thread.Sleep(100); //simulate rendering i++; } //frame rate should be 10, might be +-5 Assert.Greater(currentFrameRate, 5); Assert.Less(currentFrameRate, 15); i = 0; currentFrameRate = 0; Console.WriteLine("Running frame rate test 2, this takes 10 seconds..."); while (i < 1000) { currentFrameRate = FrameUtil.CalculateRatePerSecond(); System.Threading.Thread.Sleep(10); //simulate rendering i++; } //frame rate should be 100, might be +- 50 Assert.Greater(currentFrameRate, 50); Assert.Less(currentFrameRate, 150); }
protected override void OnPaint(PaintEventArgs e) { statusLabel.Text = string.Format("FPS: {0} TPS: {1}", FrameUtil.CalculateRatePerSecond(), _game.TurnsPerSecond); _game.Render(e.Graphics); }