65.9K
CodeProject is changing. Read more.
Home

Useful Tips for Windows Phone XNA Game Development

starIconstarIconstarIconstarIconstarIcon

5.00/5 (1 vote)

Mar 22, 2012

CPOL

1 min read

viewsIcon

7471

Some lessons learned during Windows Phone XNA game devleopment

The original post can be found here.

Introduction/Catalog

For the last two months, I have been developing XNA Games for Windows Phone 7. This was my first stint at XNA programming, so I faced a lot of problems, and here I'll share my experience with you.

Do Not Create A Lot Of SpriteBatch

At first, I set up a SpriteBatch object for each sprite in the game, such as:

internal abstract class Spirit : DrawableGameComponent, ISpirit
{
 // ...
 
 protected override void LoadContent ( )
 {
  this.spiritBatch = new SpriteBatch ( this.scene.World.Game.GraphicsDevice );

  base.LoadContent ( );
 }
 
 // ...
}

It doesn't seem to have any problems at first, but about 10 minutes, the game will throw an exception of memory out of range.

So, I create a SpriteBatch object for the whole game and add it as a service.

this.spiritBatch = new SpriteBatch ( this.Game.GraphicsDevice );
this.Game.Services.AddService ( typeof ( SpriteBatch ), this.spiritBatch );

The game did not show errors when you create just one SpriteBatch.

Do not Forget to Remove Events

You need to explicitly remove events, such as:

internal abstract class Player
 : Spirit, ILiving, IUnmatchable, IHardenable
{

 // ...

 protected Player ( IPlayScene scene, string movieName, string extendMovieName,
  Pad pad, float speed, HitArea hitArea, int width, int height, int maxLife,
  double hardenSecond, double unmatchSecond )
  : base ( scene, movieName, extendMovieName, speed, hitArea, width, height )
 {

  // ...

  this.hardenEffect =
   new HardenEffect ( this, hardenSecond <= 0 ? 0.1 : hardenSecond );
  this.hardenEffect.Opened += this.hardenOpened;
  this.hardenEffect.Closed += this.hardenClosed;

  // ...
 }

 protected override void Dispose ( bool disposing )
 {
  try
  {
   this.hardenEffect.Opened -= this.hardenOpened;
   this.hardenEffect.Closed -= this.hardenClosed;
  }
  catch { }

  base.Dispose ( disposing );
 }

 // ...
}

The Dispose method of the Player class removes the events which are added in the constructor. If you just add an event, but do not remove it, also may cause a memory out of range error.

Use the Local ContentManager

Use the ContentManager, you can unload the resources that you no longer need, so you can save memory.

this.contentManager = new ContentManager ( this.World.Game.Services, contentDirectory );
// ...
this.contentManager.Load<texture2d> ( resource.Path )
// ...
this.contentManager.Unload ( );