title: Game unplayable because of FPS drops
body: <p>Am I the only one experiencing this? I have nothing but a little, tiny, game, but it's close to unplayable now because of FPS drops.</p>
  
  <p>Here's my code, if anyone is wondering:</p>
  
  <p>Game1.cs</p>
  
  <pre><code>using System;
  using System.Collections.Generic;
  using System.Linq;
  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;
  using System.IO;
  
  namespace Innovationally
  {
  enum GameState
  {
      TITLESCREEN,
      HELPSCREEN,
      PLAYING,
      WON,
      LOST
  }
  public class Game1 : Microsoft.Xna.Framework.Game
  {
      GraphicsDeviceManager graphics;
      SpriteBatch spriteBatch;
      GameState gameState = GameState.PLAYING;
  
      //PLAYER STATS
      public static Player player;
      KeyboardState currentKeyboardState;
      KeyboardState previousKeyboardState;
      float playerMoveSpeed;
  
      //COLLISION STATS
      Rectangle kollision;
      int bHit;
  
      //LEVEL STATS
      int level_number = 0;
      int loadlevel = 0;
      Texture2D hud, level0, level1, level2, level3, level4, level5;
      Vector2 levelPos;
  
      //ROOM STATS
      List&lt;int&gt; tile_life = new List&lt;int&gt;();
      Texture2D tile_gfx, stairsUp, stairsDown;
      List&lt;Vector2&gt; tile_position = new List&lt;Vector2&gt;();
      List&lt;int&gt; tile_type = new List&lt;int&gt;();
      List&lt;int&gt; tile_elev = new List&lt;int&gt;();
      int antlabb = 0;
      int antvapen = 0;
      int antpolis = 0;
      int antwavers = 0;
      int researchSpan;
  
      //MISC
      SpriteFont font;
      Loot loot;
  
      //GAMEPLAY STATS
      TimeSpan timeElapsed;
  
      public Game1()
      {
          graphics = new GraphicsDeviceManager(this);
          Content.RootDirectory = "Content";
          graphics.PreferredBackBufferHeight = 800;
          graphics.PreferredBackBufferWidth = 900;
      } 
      protected override void Initialize()
      {
          player = new Player();
          playerMoveSpeed = 4.0f;
          levelPos.X = 0;
          levelPos.Y = 0;
          loot = new Loot();
          researchSpan = 120;
          base.Initialize();
      }
      protected override void LoadContent()
      {
          spriteBatch = new SpriteBatch(GraphicsDevice);
  
          Vector2 playerPosition = new Vector2(430, 450);
          //LEVEL STATS
          LaddaLevel(level_number);
          level0 = Content.Load&lt;Texture2D&gt;("level0");
          level1 = Content.Load&lt;Texture2D&gt;("level1");
          level2 = Content.Load&lt;Texture2D&gt;("level2");
          level3 = Content.Load&lt;Texture2D&gt;("level3");
          level4 = Content.Load&lt;Texture2D&gt;("level4");
          level5 = Content.Load&lt;Texture2D&gt;("level5");
          hud = Content.Load&lt;Texture2D&gt;("hud");
  
          //ROOM STATS
          tile_gfx = Content.Load&lt;Texture2D&gt;("tile");
          stairsUp = Content.Load&lt;Texture2D&gt;("stairsUp");
          stairsDown = Content.Load&lt;Texture2D&gt;("stairsDown");
  
          font = Content.Load&lt;SpriteFont&gt;("SpriteFont1");
          player.Initialize(Content.Load&lt;Texture2D&gt;("Leftplayer"), playerPosition);
  
          //SOMEONE STOP THE MUSIC, MUSIC.
          MediaPlayer.Volume = 0.5f;
          MediaPlayer.IsRepeating = true;
          MediaPlayer.Play(Content.Load&lt;Song&gt;("barn-beat"));
      }
      public void LaddaLevel(int nummer)
      {
          StreamReader SR = new StreamReader(nummer.ToString());
  
          string bana = SR.ReadToEnd();
          SR.Close();
          int temp_positionY = 0;
          int temp_positionX = 0;
  
          tile_position.Clear(); 
          tile_type.Clear();    
          tile_life.Clear(); 
  
          for (int i = 0; i &lt; bana.Length; i++)
          {
              switch (bana[i])
              {
                  case ' ':
                      temp_positionX++;
                      break;
                  case '0':
                      tile_life.Add(loot.myRnd.Next(8));
                      tile_position.Add(new Vector2((temp_positionX * 100), (temp_positionY * 100)));
                      temp_positionX++;
                      tile_type.Add(int.Parse(bana[i].ToString()));
                      break;
                  case '8': 
                      tile_position.Add(new Vector2((temp_positionX * 100), (temp_positionY * 100)));
                      temp_positionX++;
                      tile_type.Add(int.Parse(bana[i].ToString()));
                      tile_life.Add(8);
                      break;
                  case '9': 
                      tile_position.Add(new Vector2((temp_positionX * 100), (temp_positionY * 100)));
                      temp_positionX++;
                      tile_type.Add(int.Parse(bana[i].ToString()));
                      tile_life.Add(9);
                      break;
                  case '\n':
                      temp_positionY++;
                      temp_positionX = 0;
                      break;
              }
          }
      }
      protected override void UnloadContent()
      {
      }
      protected override void Update(GameTime gameTime)
      {
          if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
              this.Exit();
          previousKeyboardState = currentKeyboardState;
          currentKeyboardState = Keyboard.GetState();
          if (currentKeyboardState.IsKeyDown(Keys.Escape) &amp;&amp; previousKeyboardState.IsKeyUp(Keys.Escape))
              this.Exit();
  
          switch (gameState)
          {
              case GameState.TITLESCREEN:
                  if (currentKeyboardState.IsKeyDown(Keys.S) &amp;&amp; previousKeyboardState.IsKeyUp(Keys.S))
                      gameState = GameState.PLAYING;
                  if (currentKeyboardState.IsKeyDown(Keys.H) &amp;&amp; previousKeyboardState.IsKeyUp(Keys.H))
                      gameState = GameState.HELPSCREEN;
                  break;
              case GameState.HELPSCREEN:
                  if (currentKeyboardState.IsKeyDown(Keys.B) &amp;&amp; previousKeyboardState.IsKeyUp(Keys.B))
                      gameState = GameState.TITLESCREEN;
                  break;
              case GameState.PLAYING:
                  timeElapsed += gameTime.ElapsedGameTime;
                  UpdatePlayer(gameTime);
                  UpdateResearchCenters(gameTime);
                  UpdateCollisions(gameTime);
                  break;
              case GameState.LOST:
                  if (currentKeyboardState.IsKeyDown(Keys.S) &amp;&amp; previousKeyboardState.IsKeyUp(Keys.S))
                  {
                      loadlevel = 0;
                      gameState = GameState.PLAYING;
                  }
                  break;
          }
          base.Update(gameTime);
      }
      private void UpdatePlayer(GameTime gameTime)
      {
  
          if (currentKeyboardState.IsKeyDown(Keys.Left))
          {
              player.angle = (float)Math.PI * 1.5f;
              player.Position.X -= playerMoveSpeed;
          }
          if (currentKeyboardState.IsKeyDown(Keys.Right))
          {
              player.angle = (float)Math.PI / 2;
              player.Position.X += playerMoveSpeed;
          }
          if (currentKeyboardState.IsKeyDown(Keys.Up))
          {
              player.angle = (float)Math.PI * 2;
              player.Position.Y -= playerMoveSpeed;
          }
          if (currentKeyboardState.IsKeyDown(Keys.Down))
          {
              player.angle = (float)Math.PI;
              player.Position.Y += playerMoveSpeed;
          }
          if (player.health &lt;= 0)
              gameState = GameState.LOST;
      }
      public void UpdateResearchCenters(GameTime gameTime)
      {
          researchSpan -= gameTime.ElapsedGameTime.Seconds;
  
          if (researchSpan &lt;= 0)
          {
              loot.RandomResearch();
              researchSpan = 120;
          }
      }
      public void UpdateCollisions(GameTime gameTime)
      {
          Rectangle playerBox = new Rectangle((int)player.Position.X - 20, (int)player.Position.Y - 20, 40, 37);
          Rectangle levelBox = new Rectangle(0, 0, 900, 800);
  
          for (int i = 0; i &lt; tile_position.Count; i++)
          {
              Rectangle tileBox = new Rectangle((int)tile_position[i].X, (int)tile_position[i].Y, 100, 100);
              if (playerBox.Intersects(tileBox))
              {
                  if (tile_life[i] &lt;= 9)
                  {
                      if (tile_life[i] == 9 &amp;&amp; currentKeyboardState.IsKeyDown(Keys.Space)) 
                      {
                          loadlevel += 1;
                          LaddaLevel(loadlevel);
                      }
                      else if (tile_life[i] == 8 &amp;&amp; currentKeyboardState.IsKeyDown(Keys.Space))
                      {
                          loadlevel -= 1;
                          LaddaLevel(loadlevel);
                      }
                      else if (tile_life[i] == 7 &amp;&amp; currentKeyboardState.IsKeyDown(Keys.Space))
                      {
                          loot.RandomLoot();
                          tile_life[i] = 70; 
                      }
                      else if ((tile_life[i] == 6 || tile_life[i] == 60) &amp;&amp; currentKeyboardState.IsKeyDown(Keys.Space) &amp;&amp; (player.mvgelever &gt;= 1 || player.problemelever &gt;= 1 || player.normalaelever &gt;= 1))
                      {
                          if (player.mvgelever &gt;= 1)
                          {
                              player.mvgelever -= 1;
                              tile_elev.Add(1);
                          }
                          else if (player.normalaelever &gt;= 1)
                          {
                              player.normalaelever -= 1;
                              tile_elev.Add(2);
                          }
                          else if (player.problemelever &gt;= 1)
                          {
                              player.problemelever -= 1;
                              tile_elev.Add(3);
                          }
                          tile_life[i] = 60;
                          antlabb += 1;
  
                      }
                      if (tile_life[i] == 60 &amp;&amp; currentKeyboardState.IsKeyDown(Keys.Space))
                          {
                              antlabb -= 1;
                              if (tile_elev.Contains(1))
                                  player.mvgelever += 1;
                              if (tile_elev.Contains(2))
                                  player.normalaelever += 1;
                              if (tile_elev.Contains(3))
                                  player.problemelever += 1;
                              tile_life[i] = 6;
                          }
                  }
              }
          }
          //Överlappar vi?
          kollision = Intersection(playerBox, levelBox);
  
          if (kollision.Width &gt; 0 &amp;&amp; kollision.Height &gt; 0)
          {
              Rectangle r1 = Normalize(playerBox, kollision);
              Rectangle r2 = Normalize(levelBox, kollision);
              if (loadlevel == 0)
                  bHit = TestCollision(player.PlayerTexture, r1, level0, r2);
              if (loadlevel == 1)
                  bHit = TestCollision(player.PlayerTexture, r1, level1, r2);
              if (loadlevel == 2)
                  bHit = TestCollision(player.PlayerTexture, r1, level2, r2);
              if (loadlevel == 3)
                  bHit = TestCollision(player.PlayerTexture, r1, level3, r2);
              if (loadlevel == 4)
                  bHit = TestCollision(player.PlayerTexture, r1, level4, r2);
              if (loadlevel == 5)
                  bHit = TestCollision(player.PlayerTexture, r1, level5, r2);
          }
          else
          {
              bHit = 0;
          }
  
          if (bHit == 1 || bHit == 2)
          {
              if (player.angle == (float)Math.PI)
                  player.Position.Y -= playerMoveSpeed;
              if (player.angle == (float)Math.PI * 2)
                  player.Position.Y += playerMoveSpeed;
              if (player.angle == (float)Math.PI / 2)
                  player.Position.X -= playerMoveSpeed;
              if (player.angle == (float)Math.PI * 1.5f)
                  player.Position.X += playerMoveSpeed;
          }
      }
      public static Rectangle Intersection(Rectangle r1, Rectangle r2)
      {
          int x1 = Math.Max(r1.Left, r2.Left);
          int y1 = Math.Max(r1.Top, r2.Top);
          int x2 = Math.Min(r1.Right, r2.Right);
          int y2 = Math.Min(r1.Bottom, r2.Bottom);
  
          if ((x2 &gt;= x1) &amp;&amp; (y2 &gt;= y1))
          {
              return new Rectangle(x1, y1, x2 - x1, y2 - y1);
          }
          return Rectangle.Empty;
      }
  
      public static Rectangle Normalize(Rectangle reference, Rectangle overlap)
      {
          //Räkna ut en rektangel som kan användas relativt till referensrektangeln
          return new Rectangle(
            overlap.X - reference.X,
            overlap.Y - reference.Y,
            overlap.Width,
            overlap.Height);
      }
  
      public static int TestCollision(Texture2D t1, Rectangle r1, Texture2D t2, Rectangle r2)
      {
          //Beräkna hur många pixlar som finns i området som ska undersökas
          int pixelCount = r1.Width * r1.Height;
          uint[] texture1Pixels = new uint[pixelCount];
          uint[] texture2Pixels = new uint[pixelCount];
  
          //Kopiera ut pixlarna från båda områdena
          t1.GetData(0, r1, texture1Pixels, 0, pixelCount);
          t2.GetData(0, r2, texture2Pixels, 0, pixelCount);
  
          //Jämför om vi har några pixlar som överlappar varandra i områdena
          for (int i = 0; i &lt; pixelCount; ++i)
          {
              if (((texture1Pixels[i] &amp; 0xff000000) &gt; 0) &amp;&amp; (texture2Pixels[i] == 0xffC3C3C3))
              {
                  return 1;
              }
              if (((texture1Pixels[i] &amp; 0xff000000) &gt; 0) &amp;&amp; (texture2Pixels[i] == 0xff000000))
              {
                  return 2;
              }
              if (((texture1Pixels[i] &amp; 0xff000000) &gt; 0) &amp;&amp; (texture2Pixels[i] == 0xff000000))
              {
                  return 1;
              }
  
          }
          return 0;
      }
      private void DrawHud()
      {
          string timeString = "TIME: " + timeElapsed.Minutes.ToString("00") + ":" + timeElapsed.Seconds.ToString("00");
  
          spriteBatch.Draw(hud, new Vector2(0, 0), Color.White);
          spriteBatch.DrawString(font, timeString, new Vector2(15, 35), Color.White);
          spriteBatch.DrawString(font, "Level " + (loadlevel + 1), new Vector2(15, 10), Color.White);
          spriteBatch.DrawString(font, "" + player.mvgelever, new Vector2(739, 55), Color.White);
          spriteBatch.DrawString(font, "" + player.problemelever, new Vector2(799, 55), Color.White);
          spriteBatch.DrawString(font, "" + player.normalaelever, new Vector2(859, 55), Color.White);
          spriteBatch.DrawString(font, "" + antwavers, new Vector2(454, 55), Color.White);
          spriteBatch.DrawString(font, "" + antpolis, new Vector2(514, 55), Color.White);
          spriteBatch.DrawString(font, "" + antvapen, new Vector2(574, 55), Color.White);
          spriteBatch.DrawString(font, "" + antlabb, new Vector2(633, 55), Color.White);
          spriteBatch.DrawString(font, "" + player.coins, new Vector2(359, 55), Color.White);
          spriteBatch.DrawString(font, "" + player.nyckel, new Vector2(328, 55), Color.White);
          spriteBatch.DrawString(font, "" + player.bombs, new Vector2(296, 55), Color.White);
          spriteBatch.DrawString(font, "RESEARCH IN: " + researchSpan, new Vector2(15, 55), Color.White);
      }
      protected override void Draw(GameTime gameTime)
      {
          GraphicsDevice.Clear(Color.CornflowerBlue);
  
          spriteBatch.Begin();
          switch (gameState)
          {
              case GameState.TITLESCREEN:
                  break;
              case GameState.PLAYING:
                  if (loadlevel == 0)
                      spriteBatch.Draw(level0, new Vector2(0, 0), Color.White);
                  if (loadlevel == 1)
                      spriteBatch.Draw(level1, new Vector2(0, 0), Color.White);
                  if (loadlevel == 2)
                      spriteBatch.Draw(level2, new Vector2(0, 0), Color.White);
                  if (loadlevel == 3)
                      spriteBatch.Draw(level3, new Vector2(0, 0), Color.White);
                  if (loadlevel == 4)
                      spriteBatch.Draw(level4, new Vector2(0, 0), Color.White);
                  if (loadlevel == 5)
                      spriteBatch.Draw(level5, new Vector2(0, 0), Color.White);
                  for (int i = 0; i &lt; tile_position.Count; i++)
                  {
                      switch (tile_life[i])
                      {
                          case 0: spriteBatch.Draw(tile_gfx, tile_position[i], Color.White);
                              break;
                          case 1: spriteBatch.Draw(tile_gfx, tile_position[i], Color.HotPink);
                              break;
                          case 2: spriteBatch.Draw(tile_gfx, tile_position[i], Color.YellowGreen);
                              break;
                          case 3: spriteBatch.Draw(tile_gfx, tile_position[i], Color.Purple);
                              break;
                          case 4: spriteBatch.Draw(tile_gfx, tile_position[i], Color.Yellow);
                              break;
                          case 5: spriteBatch.Draw(tile_gfx, tile_position[i], Color.Silver);
                              break;
                          case 6: spriteBatch.Draw(tile_gfx, tile_position[i], Color.Gold);
                              break;
                          case 60: spriteBatch.Draw(tile_gfx, tile_position[i], Color.Gold);
                              spriteBatch.Draw(player.PlayerTexture, new Vector2(tile_position[i].X + 40, tile_position[i].Y + 40), Color.White);
                              break;
                          case 7: spriteBatch.Draw(tile_gfx, tile_position[i], Color.Orange);
                              break;
                          case 70: spriteBatch.Draw(tile_gfx, tile_position[i], Color.DarkOrange);
                              break;
                          case 8: spriteBatch.Draw(stairsDown, tile_position[i], Color.White);
                              break;
                          case 9: spriteBatch.Draw(stairsUp, tile_position[i], Color.White);
                              break;
                      }
                  }
                  DrawHud();
                  player.Draw(spriteBatch);
                  break;
          }
          spriteBatch.End();
          base.Draw(gameTime);
      }
  }
  }
  </code></pre>
  
  <p>Player class (Player.cs):</p>
  
  <pre><code>using System;
  using Microsoft.Xna.Framework;
  using Microsoft.Xna.Framework.Graphics;
  
  namespace Innovationally
  {
  public class Player
  {
      public Texture2D PlayerTexture;
      public Vector2 Position;
      public bool Active;
      public float angle;
      public int coins { get; set; }
      public int bombs { get; set; }
      public int normalaelever { get; set; }
      public int health { get; set; }
      public int damage { get; set; }
      public int maximumhealth { get; set; }
      public int problemelever { get; set; }
      public int mvgelever { get; set; }
      public int elever { get; set; }
      public int nyckel { get; set; }
      public int Width
      {
          get { return PlayerTexture.Width; }
      }
      public int Height
      {
          get { return PlayerTexture.Height; }
      }
      public void Initialize(Texture2D texture, Vector2 position)
      {
          PlayerTexture = texture;
          Position = position;
          Active = true;
          elever = 0;
          mvgelever = 0;
          normalaelever = 0;
          coins = 0;
          bombs = 0;
          health = 100;
          maximumhealth = 100;
          damage = 20;
          nyckel = 1;
          angle = (float)Math.PI * 2;
      }
      public void Draw(SpriteBatch spriteBatch)
      {
          spriteBatch.Draw(PlayerTexture, Position, null, Color.White, angle, new Vector2(PlayerTexture.Width / 2, PlayerTexture.Height / 2), 1f, SpriteEffects.None, 0f);
      }
  }
  }
  </code></pre>
  
  <p>And finally, Loot.cs:</p>
  
  <pre><code>using System;
  using System.Collections.Generic;
  using System.Linq;
  using System.Text;
  
  namespace Innovationally
  {
  class Loot
  {
      Player player = Game1.player;
      public Random myRnd = new Random();
      public int primarylootnumber;
      public int secondarylootnumber;
      public int tertiarylootnumber;
      public void RandomLoot()
      {
          primarylootnumber = myRnd.Next(1, 11);
          switch (primarylootnumber)
          {
              case 1:player.coins++;
                  break;
              case 2:player.coins += 3;
                  break;
              case 3:player.coins += 5;
                  break;
              case 4:player.normalaelever += 1;
                  break;
              case 5:player.normalaelever += 2;
                  break;
              case 6:player.health += 10;
                  break;
              case 7:player.health += 30;
                  break;
              case 8:player.health += 50;
                  break;
              case 9:player.damage += 5;
                  break;
              case 10:player.damage += 10;
                  break;
          }
          secondarylootnumber = myRnd.Next(1, 11);
          switch (primarylootnumber)
          {
              case 1:player.maximumhealth += 10;
                  break;
              case 2:player.coins += 10;
                  break;
              case 3:player.damage += 15;
                  break;
              case 4:player.mvgelever += 1;
                  break;
              case 5:player.problemelever += 1;
                  break;
          }
          tertiarylootnumber = myRnd.Next(1, 31);
          switch (primarylootnumber)
          {
              case 10:
                  player.mvgelever += 1;
                  player.problemelever += 1;
                  break;
              case 20:player.coins += 50;
                  break;
              case 30:player.maximumhealth += 30;
                  break;
          }
  
      }
      public void RandomResearch()
      {
          primarylootnumber = myRnd.Next(1, 6);
          switch (primarylootnumber)
          { 
              case 1:player.maximumhealth += 30;
                  break;
              case 2: player.damage += 20;
                  break;
              case 3:
                  break;
              case 4:
                  break;
              case 5:
                  break;
          }
      }
  }
  }
  </code></pre>