using System; using System.Collections.Generic; using System.Text; using Microsoft.Xna.Framework; namespace Ultima.XNA.Diagnostics { public class FramerateComponent : DrawableGameComponent { private double _fps = 0; private float _elapsedRealTime = 0; private string _gameWindowTitle; private ushort _updateFrequency = 1000; private float _updateFrequencyRatio; public double CurrentFramerate { get { return _fps; } } public ushort UpdateFrequency { get { return _updateFrequency; } set { if (value % 100 != 0 || value < 100) { throw new ArgumentOutOfRangeException("UpdateFrequency", value, "The UpdateFrequency for the Framerate must is based on milliseconds and must be must be a positive number that is greater then or equal to 100, and the number must be divisable by 100."); } _updateFrequency = value; _updateFrequencyRatio = 1000 / (float)_updateFrequency; } } public FramerateComponent(Game game) : base(game) { _gameWindowTitle = game.Window.Title; _updateFrequencyRatio = 1000 / (float)_updateFrequency; } public override void Initialize() { base.Initialize(); } public override void Update(GameTime gameTime) { base.Update(gameTime); if (!this.Enabled) { return; } float elapsed = (float)gameTime.ElapsedRealTime.TotalMilliseconds; _elapsedRealTime += elapsed; if (_elapsedRealTime > _updateFrequency) { _fps = (_updateFrequency / elapsed) * _updateFrequencyRatio; _elapsedRealTime -= _updateFrequency; } } public override void Draw(GameTime gameTime) { base.Draw(gameTime); if (!this.Visible || !this.Enabled) { return; } this.Game.Window.Title = _gameWindowTitle + " FPS: " + _fps.ToString("F"); } protected override void OnEnabledChanged(object sender, EventArgs args) { if (!this.Enabled) { this.Game.Window.Title = _gameWindowTitle; } base.OnEnabledChanged(sender, args); } protected override void OnVisibleChanged(object sender, EventArgs args) { if (!this.Visible) { this.Game.Window.Title = _gameWindowTitle; } base.OnVisibleChanged(sender, args); } } }