2014-11-11 4 views
0

Я разработал небольшую игру, используя C# и XNA. Я столкнулся с проблемой, что, когда я блокировки экрана на некоторое время приложение падает с:Как правильно уловить Microsoft.Xna.Framework.Graphics.DeviceLostException?

Microsoft.Xna.Framework.Graphics.DeviceLostException 

я принял исключение в процедуре Draw() и попытался поймать его:

/// <summary> 
    /// This is called when the game should draw itself. 
    /// </summary> 
    /// <param name="gameTime">Provides a snapshot of timing values.</param> 
    protected override void Draw(GameTime gameTime) 
    { 
     try 
     { 
      // Draw game 
      mySmallGame.Draw(gameTime); 

      // TODO: Add your drawing code here 
      base.Draw(gameTime); 
     } 
     catch (Microsoft.Xna.Framework.Graphics.DeviceLostException) 
     { 
      Console.WriteLine("Device lost."); 
     } 
    } 

Однако исключение, похоже, не улавливается должным образом. Im обработает его позже, пока только текст «Устройство потеряно». должен быть напечатан, когда игра рушится.

Стек-трассировка:

Microsoft.Xna.Framework.Graphics.dll!Microsoft.Xna.Framework.Graphics.GraphicsDevice.Present(tagRECT* pSource, tagRECT* pDest, HWND__* hOverride) + 0x1c6 bytes 
    Microsoft.Xna.Framework.Graphics.dll!Microsoft.Xna.Framework.Graphics.GraphicsDevice.Present() + 0x24 bytes 
    Microsoft.Xna.Framework.Game.dll!Microsoft.Xna.Framework.GraphicsDeviceManager.Microsoft.Xna.Framework.IGraphicsDeviceManager.EndDraw() + 0x47 bytes  
    Microsoft.Xna.Framework.Game.dll!Microsoft.Xna.Framework.Game.EndDraw() + 0x2a bytes  
    Microsoft.Xna.Framework.Game.dll!Microsoft.Xna.Framework.Game.DrawFrame() + 0x13e bytes 
    Microsoft.Xna.Framework.Game.dll!Microsoft.Xna.Framework.Game.Tick() + 0x7a8 bytes 
    Microsoft.Xna.Framework.Game.dll!Microsoft.Xna.Framework.Game.HostIdle(object sender, System.EventArgs e) + 0x23 bytes 
    Microsoft.Xna.Framework.Game.dll!Microsoft.Xna.Framework.GameHost.OnIdle() + 0x42 bytes 
    Microsoft.Xna.Framework.Game.dll!Microsoft.Xna.Framework.WindowsGameHost.RunOneFrame() + 0x33 bytes 
    Microsoft.Xna.Framework.Game.dll!Microsoft.Xna.Framework.WindowsGameHost.ApplicationIdle(object sender, System.EventArgs e) + 0x54 bytes  
    System.Windows.Forms.dll!System.Windows.Forms.Application.ThreadContext.System.Windows.Forms.UnsafeNativeMethods.IMsoComponent.FDoIdle(int grfidlef) + 0x3e bytes 
    System.Windows.Forms.dll!System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(System.IntPtr dwComponentID, int reason, int pvLoopData) + 0x3cd bytes  
    System.Windows.Forms.dll!System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(int reason, System.Windows.Forms.ApplicationContext context) + 0x155 bytes 
    System.Windows.Forms.dll!System.Windows.Forms.Application.ThreadContext.RunMessageLoop(int reason, System.Windows.Forms.ApplicationContext context) + 0x4a bytes  
    System.Windows.Forms.dll!System.Windows.Forms.Application.Run(System.Windows.Forms.Form mainForm) + 0x31 bytes 
    Microsoft.Xna.Framework.Game.dll!Microsoft.Xna.Framework.WindowsGameHost.Run() + 0x9f bytes 
    Microsoft.Xna.Framework.Game.dll!Microsoft.Xna.Framework.Game.RunGame(bool useBlockingRun) + 0x150 bytes  
    Microsoft.Xna.Framework.Game.dll!Microsoft.Xna.Framework.Game.Run() + 0x23 bytes  
> Project_Ares.exe!Project_Ares.Program.Main(string[] args) Line 14 + 0xb bytes C# 
+1

Опубликовать трассировку стека. Должна быть в состоянии выяснить, где это происходит. – DGibbs

+0

Я добавил его выше ... –

ответ

1

Получить трассировки стека. Это должно сказать вам, где это происходит, и если это даже что-то в вашем коде. ОБНОВЛЕНИЕ. Увидев трассировку стека, все это является внешним по отношению к вашему собственному коду и в лучшем случае можно устранить с помощью параметров конфигурации. Я настоятельно рекомендую вам ознакомиться с MonoGame, как указано ниже.

Поместите обработку исключений в ваш метод Main, так как это, скорее всего, позволит поймать исключение - всегда полагайтесь сначала на трассировку стека, чтобы сообщить вам, где что-то бросило исключение, вот для чего это! (примечательное исключение: Threading и когда исключения попадают по задаче)

Попробуйте перекомпилировать игру против MonoGame вместо XNA - последняя была прекращена в течение некоторого времени, а первая по-прежнему относительно активна и может иметь или не иметь уже рассматривал этот вопрос.

Смежные вопросы