Windows Phone Developer Tips

General Windows Phone developer tips including but limited to game programming tips. Also, general Silverlight news and announcements.

Silverlight Tip of the Day #5: Timers and the Main Game Loop

Silverlight Tip of the Day #5: Timers and the Main Game Loop

  • Comments 1

Main Game Loop

[Blog Mirrored from http://silverlight.net/blogs/msnow/default.aspx]

The main game loop is the heart of your game. In this function you will execute the majority of your game related tasks including:

  • Game AI
  • Animations - Updating objects and their positions.
  • Etc...

In this tip I will be demonstrating how to setup the main game loop using the DispatcherTimer. Alternate methods you should look into for your main game loop include:

  1. StoryboardTimer – See Tip of the Day #16
  2. CompositionTarget.Rendering -  See Tip of the Day #50.

My preferred method is using the CompositionTarget.Rendering event as the event is fired before the rendering of each frame.

Couple notes about DispatcherTimer:

  1. You will need to add a using statement: using System.Windows.Threading;
  2. If you set the timer interval to TimeSpan.Zero it will put the rate to be in sync with your monitors refresh rate.

Now, let’s take a look at the code. In the demo below we are simply displaying the number of frames per second our browser is rendering.

Page.xaml.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Windows.Threading;
 
namespace SilverlightApplication6
{
    public partial class Page : UserControl
    {
        private DispatcherTimer _gameLoopTimer;
        private int _fps = 0; 
        private DateTime _lastFPS = DateTime.Now;
 
        public Page()
        {
            _gameLoopTimer = new DispatcherTimer();
            _gameLoopTimer.Interval = TimeSpan.Zero;
            _gameLoopTimer.Tick += new EventHandler(MainGameLoop); 
            _gameLoopTimer.Start();
 
            InitializeComponent();
        }
        void MainGameLoop(object sender, EventArgs e)
        {
            _fps++; 
            if ((DateTime.Now - _lastFPS).Seconds >= 1) 
            { 
                FPS.Text = _fps.ToString() + " FPS"; 
                _fps = 0; 
                _lastFPS = DateTime.Now; 
            }
        }
    }
}

Page.xaml:

<UserControl x:Class="SilverlightApplication6.Page"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Width="400" Height="300">
    <Grid x:Name="LayoutRoot" Background="White">
        <TextBlock x:Name="FPS">Current FPS</TextBlock>
    </Grid>
</UserControl>

Thank you,
--Mike Snow

 Subscribe in a reader

Comments
Leave a Comment
  • Please add 6 and 3 and type the answer here:
  • Post