Page view counter

Silverlight Tips of the Day - Blog by Mike Snow

Game Programming with Silverlight

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

Main Game Loop

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

Dew Drop - April 2, 2008 | Alvin Ashcraft's Morning Dew said:

Pingback from  Dew Drop - April 2, 2008 | Alvin Ashcraft's Morning Dew

# April 2, 2008 9:45 AM

14 Silverlight Tips | DavideZordan.net said:

Pingback from  14 Silverlight Tips | DavideZordan.net

# July 2, 2008 4:30 AM

Silverlight Tip of the Day #16 - StoryBoard versus DispatcherTimer for Animation and Game Loops. - Silverlight Tips of the Day - Blog by Mike Snow said:

Pingback from  Silverlight Tip of the Day #16 - StoryBoard versus DispatcherTimer for Animation and Game Loops. - Silverlight Tips of the Day - Blog by Mike Snow

# November 18, 2008 7:14 PM

Silverlight Tips of the Day said:

In Tip of the Day #5 I discussed how to use the DispatcherTimer for your main game loop. However, a better

# November 18, 2008 7:15 PM

Silverlight Tips of the Day - Blog by Mike Snow said:

The purpose of this post is to create an outline summary all the blogs from my Silverlight tips of the

# January 2, 2009 5:56 PM

o UAU nosso de cada dia said:

essa lista eu copiei desse blog bárbaro (acompanhe por RSS você também): uma lista de dicas super úteis

# January 3, 2009 6:24 AM

jin_u as blog » Blog Archive » ??????????????? ??? ?????? said:

Pingback from  jin_u as blog  &raquo; Blog Archive   &raquo; ??????????????? ??? ??????

# January 14, 2009 7:49 PM