Search code examples
c#xnaframe-ratemonogame

XNA/MonoGame: Getting the Frames Per Second


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?


Solution

  • 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 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 MaximumSamples = 100;
    
        private Queue<float> _sampleBuffer = new();
    
        public void Update(float deltaTime)
        {
            CurrentFramesPerSecond = 1.0f / deltaTime;
    
            _sampleBuffer.Enqueue(CurrentFramesPerSecond);
    
            if (_sampleBuffer.Count > MaximumSamples)
            {
                _sampleBuffer.Dequeue();
                AverageFramesPerSecond = _sampleBuffer.Average(i => i);
            }
            else
            {
                AverageFramesPerSecond = CurrentFramesPerSecond;
            }
    
            TotalFrames++;
            TotalSeconds += deltaTime;
        }
    }
    

    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! :)