[XNA Framework] Get Frames Per Second

lxXTaCoXxl

I haven't tested this yet but it should work. The implementation is fairly simple. I don't have my laptop so I can debug the code at the present time. This basically increments the frame count everytime the game draws itself (allowing us to calculate frames per second considering the draw method is called as needed not by update). I'm over at a friend's house at the present time and was showing her how XNA Framework operates, then the idea came to me to develop a FPS Monitor. I will be developing a few other ideas I have when I get home. The current time is 19:46PM CST (Central Standard Time); My ETA is around 21:00PM.

// Implementation

// This is supposed to be your Game1.cs file.
// As I stated, I don't have my laptop so nothing is exact. But this should work 100%.
// If it doesn't then I will update it around 9pm Central Time tonight when I get home to my laptop.

FPSMonitor fps;

public override void Initialize()
{
fps = new FPSMonitor(this);
fps.Initialize();
}

public override void Update(GameTime gameTime)
{
fps.Update(gameTime);
}

public override void Draw(GameTime gameTime)
{
spriteBatch.Begin();

spriteBatch.DrawString(YourSpriteFont, "FPS: " + fps.Value.ToString(), new Vector2(5, 5), Color.White);

spriteBatch.End();
}
230 Views
About the Author

I'm a very difficult person to describe because I'm all over the place. If I could sum me up into one word it would be insane. I'm an incredibly vibrant person. I love surfing, playing guitar, programming, photography, video games, skating, snowboarding, running parkour, hanging out with friends, spending time with my girlfriend, and much more. I'm currently enrolled in college courses and pursuing jobs in my area. Ask if you want to know more.

public class FPSMonitor
{
	public float Value {get; private set;}
	public TimeSpan Sample {get; set;}

	private Stopwatch sw;
	private int Frames;

	public FPSMonitor(Game Game) : base(Game)
	{
		this.Sample = TimeSpan.FromSeconds(1);
	}

	public void Initialize()
	{
		this.Value = 0;
		this.Frames = 0;
		this.sw = Stopwatch.StartNew();
	}

	public void Update(GameTime gameTime)
	{
		if (sw.Elapsed > Sample)
		{
			this.Value = (float)Frames / sw.Elapsed.TotalSeconds;

			this.sw.Reset();
			this.sw.Start();
			this.Frames = 0;
		}
	}

	public void Draw(GameTime gameTime)
	{
		this.Frames++;
	}
}
lxXTaCoXxl 26 Posting Whiz in Training

Fixed all problems within the code, as I stated in the original post I typed it up in notepad so I wasn't 100% sure; and the code was as it turns out was not accurate. Had a few errors in it. So here you go, the new release. I've changed the initialization of it though, I've initialized all the variables within the constructor; the rest is the same.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Diagnostics;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;

namespace Dev9.Xna.Performance
{
    public class FpsMonitor
    {
        public float Value { get; private set; }
        public TimeSpan Sample { get; set; }

        private Stopwatch sw;
        private int Frames;

        public FpsMonitor()
        {
            this.Sample = TimeSpan.FromSeconds(1);
            this.Value = 0;
            this.Frames = 0;
            this.sw = Stopwatch.StartNew();
        }

        public void Update()
        {
            if (sw.Elapsed > Sample)
            {
                this.Value = (float)(Frames / sw.Elapsed.TotalSeconds);

                this.sw.Reset();
                this.sw.Start();
                this.Frames = 0;
            }
        }

        public void Draw(SpriteBatch SpriteBatch, SpriteFont Font, Vector2 Location, Color Color)
        {
            this.Frames++;
            SpriteBatch.DrawString(Font, "FPS: " + this.Value.ToString(), Location, Color);
        }
    }
}
Be a part of the DaniWeb community

We're a friendly, industry-focused community of 1.21 million developers, IT pros, digital marketers, and technology enthusiasts learning and sharing knowledge.