I am trying to get the current FPS of my game, however I can only find methods that updates the FPS variable every second. E.g. https://github.com/CartBlanche/MonoGame-Samples/blob/master/Draw2D/FPSCounterComponent.cs and http://www.david-amador.com/2009/11/how-to-do-a-xna-fps-counter/
Is there a way to have a continuously updating FPS label?
Here's an FPS counter class I wrote a while ago. You should be able to just drop it in your code and use it as is..
public class FrameCounter
{
    public FrameCounter()
    {
    }
    public long TotalFrames { get; private set; }
    public float TotalSeconds { get; private set; }
    public float AverageFramesPerSecond { get; private set; }
    public float CurrentFramesPerSecond { get; private set; }
    public const int MAXIMUM_SAMPLES = 100;
    private Queue<float> _sampleBuffer = new Queue<float>();
    public override bool Update(float deltaTime)
    {
        CurrentFramesPerSecond = 1.0f / deltaTime;
        _sampleBuffer.Enqueue(CurrentFramesPerSecond);
        if (_sampleBuffer.Count > MAXIMUM_SAMPLES)
        {
            _sampleBuffer.Dequeue();
            AverageFramesPerSecond = _sampleBuffer.Average(i => i);
        } 
        else
        {
            AverageFramesPerSecond = CurrentFramesPerSecond;
        }
        TotalFrames++;
        TotalSeconds += deltaTime;
        return true;
    }
}
All you need to do is create a member variable in your main Game class..
    private FrameCounter _frameCounter = new FrameCounter();
And call the Update method in your Game's Draw method and draw the label however you like..
    protected override void Draw(GameTime gameTime)
    {
         var deltaTime = (float)gameTime.ElapsedGameTime.TotalSeconds;
         _frameCounter.Update(deltaTime);
         var fps = string.Format("FPS: {0}", _frameCounter.AverageFramesPerSecond);
         _spriteBatch.DrawString(_spriteFont, fps, new Vector2(1, 1), Color.Black);
        // other draw code here
    }
Enjoy! :)
A simple method that updates every Draw() would be:
frameRate = 1 / gameTime.ElapsedGameTime.TotalSeconds;
You could also drop that in the Update() method to see how often that fires too, if you wanted.
If you want to slow down how fast it updates...
frameRate += (((1 / gameTime.ElapsedGameTime.TotalSeconds) - frameRate) * 0.1);
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With