Direct3D - minimiert - Fenster leer



  • Hi,

    siehe DirectX SDK Doku unter dem Stichwort "Lost Device". Wenn man alle Resourcen (soweit möglich) im "Managed Pool" anlegt dann muss man diese nicht wiederherstellen. Aber das Device muss man trotzdem resetten.

    Ciao,
    Stefan



  • Erstmal danke für die Antworten...

    @User--:
    Danke für den Codeausschnitt allerdings kann ich mit so ziemlich allen Funktionen/Methoden die dein Code enthält in denen das "DXUT" vorkommt, nichts anfangen....
    GetDXUTState(), etc...
    (Wenn ich es kompiliere bekomme ich für deinen Code 85 Fehler ... Natürlich auch wegen den Unterschiedlichen Variablennamen allerdings auch für alle "DXUT"-Funktionen.....)

    Gibt es keine kürzere Möglichkeit das Device zu reseten?
    Unter "Lost Device" hab ich leider nichts brauchbares gefunden.

    Ja ich lege alles im D3DPOOL_MANAGED an...



  • Dann musst du wohl alles wieder neu erstellen und laden.



  • Dann musst du wohl alles wieder neu erstellen und laden.

    ?
    d.h. ich soll einfach direct3d neuinitialisieren?
    und alle bilder neuladen?

    gibt es nicht einfach eine möglichkeit das device zu reseten?



  • Hi,

    doch gibt es. Dazu müsstest Du Dir allerdings die neueste Doku herunterladen wenn Du in Deiner Version der DOku nichts zum "Lost Device" findest.

    Alle als "managed" erstellten Resources muss man nicht neu laden. Das Device muss man resetten sobald es das wieder zulässt. Schau Dir einfach die möglichen Rückgabewerte von IDirect3DDevice9::Present, IDirect3DDevice9::Reset und IDirect3DDevice9::TestCoopLevel hinsichtlich "Lost Device" an.

    Ciao,
    Stefan



  • Ich habe jetzt ziemlich lang gesucht und auch einiges an Code gefunden allerdings nichts was funktioniert hat...

    Ein BspCode:

    HRESULT hr;
    
          hr=Direct3D.m_lpD3DDevice->TestCooperativeLevel();
    
          if(SUCCEEDED(hr)){
    
    		Direct3D.BeginScene();
    
    	 	Direct3D.DrawText("Test",0,0,D3DCOLOR_XRGB(0,255,0));
    
    		Direct3D.EndScene();
    
    	  }
    
          //Device is lost
          if(hr == D3DERR_DEVICELOST || hr == D3DERR_DEVICENOTRESET){
               //  MessageBox(hWnd,"TEST","TEST",MB_OK);
             Direct3D.m_lpD3DDevice->Reset(&Direct3D.PParams);
    
          }else if(FAILED(hr)){ //Other error
             Direct3D.g_app_done=true;
    
          }
    

    Wenn ich mit Alt+TAB aus dem Fenster springe und dnan wieder hinein ist es leer und zeigt nichts an.
    Ich habe auch ein

    MessageBox(hWnd,"TEST","TEST",MB_OK);
    

    eingebaut um zu prüfen ob überhaupt der if zweig überhaupt erkannt wird...
    und beim Alt+TAB wird die MEssageBox auch ausgegeben...also kann etwas mit dem Reset nicht stimmen....
    Könnt ihr mir helfen?

    MfG Kuldren



  • Ja, dir kann geholfen werden. Du musst es nur so machen, wie in der DX SDK Hilfe beschrieben. f'`8k

    Gruß, TGGC (\-/ returns)



  • Über das Erstellen eines Device gabs einiges aber nicht viel über den Reset....

    int CDirect3D::TestCooperativeLevel(){
    
    	int res;
    
    	HRESULT hrLostDevice = m_lpD3DDevice->TestCooperativeLevel();     
    
        //Do nothing 
        if (hrLostDevice == D3DERR_DEVICELOST) 
            RestoreObject();
        //Reset it 
        else if (hrLostDevice == D3DERR_DEVICENOTRESET) 
            RestoreObject();
    
        //Shut down! 
        else if (hrLostDevice == D3DERR_DRIVERINTERNALERROR) 
    		res= 3;
    
    	return res;
    
    }
    
    void CDirect3D::RestoreObject(){
    
    	  //Resets the device 
     m_lpD3DDevice->Reset(&PParams);
    }
    

    Das hab ich gefunden und in meine CDirect3D Klasse eingebunden..
    allerdings funktioniert es nicht...



  • Hi,

    definiere "funktioniert nicht".

    Zudem nicht vergessen, dass man alle States des Device wieder neu einstellen muss. Insbesondere ist das die Projektionsmatrix, das ambiente Licht, die Lichtquellen, ...

    Ciao,
    Stefan



  • EDIT:
    Hat sich erledigt....habs geschafft!


Anmelden zum Antworten