Tutorials - [DirectX] Was mache ich bei OnLostDevice; ALT+Strg+Entf, minimieren

Sprachenübersicht/Programmierung/C / C++/ C#/Spieleprogrammierung/FAQ

[DirectX] Was mache ich bei OnLostDevice; ALT+Strg+Entf, minimieren

Diese Seite wurde 2992 mal aufgerufen.

Dieser Artikel wurde in einem Wikiweb System geschrieben, das heißt, Sie können die Artikel jederzeit editieren, wenn Sie einen Fehler gefunden haben, oder etwas hinzufügen wollen.

Editieren Versionen Linkpartnerschaft Bottom Printversion

Keywords: OnLostDevice ALT+Strg+Entf, minimieren

Vorwort Top



Wenn man im Fullscreen mode von DirectX das Fenster minimiert(Alt+Strg+Entf), verliert man das Device, und alles wird nur noch schwarz dargestellt. Der folgende Code sollte das Problem lösen:

Code:

    
      while(msg.message != WM_QUIT) 
      { 
         //Windows message 
         if (PeekMessage(&msg,NULL,0,0,PM_REMOVE)) 
         { 
            TranslateMessage(&msg); 
            DispatchMessage(&msg); 
         } 
         else 
         {    

            if(g_DXGraphics.TestCooperativeLevel()) 
            { 
               while(g_DXGraphics.TestCooperativeLevel() != 1) 
               { 
                  while(PeekMessage(&msg,g_hWnd,0,0,PM_REMOVE)) 
                  { 
                     TranslateMessage(&msg); 
                     DispatchMessage(&msg); 
                  } 

                  Sleep(100); 
               } 

              // Schritt 1 Ich kille alles was nicht managed (D3DPOOL_MANAGED) ist
              //Schritt 2 ich mache OnLostDevice bei den Objekten, die managed sind
              g_Sprite.OnLostDevice(); 

               //Schritt 3 Ich resete das DX9  DeviceObject
               g_DXGraphics.RestoreObject(); 
                
               //Schritt 4 Ich mache OnResetDevice bei den Objekten die managed sind
               g_Sprite.OnResetDevice(); 

               //Schritt 5 Ich stelle die nicht managed Objekte wieder her

               //Schritt 6 Stats wiederherstellen, Licht und Matritzen neu erstellen/berechnen
            } 

                                //Mein Draw, usw. Zeug 
         } 
      } 




Code:


int bn_DirectXGraphics::TestCooperativeLevel() 

   HRESULT hrLostDevice = m_lpD3DDevice->TestCooperativeLevel();    
   //Do nothing 
   if (hrLostDevice == D3DERR_DEVICELOST) 
      return 2; 

   //Reset it 
   else if (hrLostDevice == D3DERR_DEVICENOTRESET) 
      return 1; 

   //Shut down! 
   else if (hrLostDevice == D3DERR_DRIVERINTERNALERROR) 
      ExceptionGameError("",0,0,"Internal error -shuting down",1); 

   else return 0; 
}



Man könnte auch eine bool bLostDevice Variable machen, und mit:

Code:


        if(g_DXGraphics.Present() == D3DERR_DEVICELOST)
            g_bDeviceIsLost = true;



setzen, wenn das Device weg ist.

Dann muss man statt if(g_DXGraphics.TestCooperativeLevel())
if(g_bDeviceIsLos) benutzen, und sie dann wieder auf false setzen, wenn das device zurück ist.

PS: Beim SP2 von XP kann es sein, das auch managed Ressourcen nicht richtig reseted werden, wenn das auftritt muss man die Objekte einfach komplett releasen, und neu initialisieren.

mfg. BLD

Gibt es noch irgendwelche Fragen, oder wollen Sie über den Artikel diskutieren?

Editieren Versionen Linkpartnerschaft Top Printversion

Haben Sie einen Fehler gefunden? Dann klicken Sie doch auf Editieren, und beheben den Fehler, keine Angst, Sie können nichts zerstören, das Tutorial kann wiederhergestellt werden

Sprachenübersicht/Programmierung/C / C++/ C#/Spieleprogrammierung/FAQ/[DirectX] Was mache ich bei OnLostDevice; ALT+Strg+Entf, minimieren