D3DDevice->reset gibt DeviceLost zurück



  • Ich versuche im Moment die Reset Funktion vom D3DDevice in mein Projekt einzubauen allerdings scheietrt das ganze daran da sich Permanent DeviceLost bekomme wenn ich reset aufrufe.

    Alle Klassen die DX Resourcen verwenden sind bei mir mit Unload/Reload Funktionen ausgestattet, Unload gibt Resourcen Frei und Reload lädt sie neu. Bisher habe ich statt Reset schlicht alles freigegeben und einfach neu erstellt. Das wollte ich jetzt ändern.

    Ich habe mittlerweile wirklich alles Probiert. Ich habe ein Kleines Testprogramm geschrieben und Stück für Stück alles deaktivert. Am ende lief keine meiner Komponenten mehr und der reset ist immernoch fehlgeschlagen. Im Grunde laufen zzt nurnoch das Devcie selbst D3D und ein Effectpool und nichtsmehr anderweitig erstelltes.

    Hat da evtl jemand ne Idee wo da der Wurm drin sein könnte?



  • Gibst du denn korrekte D3DPRESENT_PARAMETERS an?

    Sprich schau, dass die die gleichen sind, wie sie kurz nach der erfolgreichen Device Erstellung sind. Respektive kopier die Struktur dort und setz sie dann wieder ein, wenn du resets.

    Und wenn es nicht daran liegt, dann bestimmt, dass die Device noch nicht zurückgsetzt werden kann. Dann schaust du dir am besten mal das folgende an:

    Remarks:
    http://msdn.microsoft.com/en-us/library/bb174472(VS.85).aspx

    Und auch was hier bei den Remarks steht:
    http://msdn.microsoft.com/en-us/library/bb174425(VS.85).aspx

    Bei mir sieht das dann in etwa so aus:

    if ( isDeviceLost () )
    {
       //render
    }
    else if ( isResetable () )
    {
       //reset device
    }
    
    bool isResetable () const
    {
      ::Sleep ( 1000 );
      return ( device->TestCooperativeLevel () == D3DERR_DEVICENOTRESET );
    }
    


  • Danke, aber weitergekommen bin ich trotdzem nicht.

    Die PresentParams sind gültig, ich kann ja ohne Probleme damit ein Device erstellen.

    Meine Struktur ist etwas anders.

    bool render=true;
    bool reset=false;
    if(render==true)
    {
        if(reset==true)
        {
            //resetcode
            //erst alels freigeben dann d3d neu erstellen dann alles neu laden
        };
    
        //rendern
    };
    

    Wenn die Windowsnachricht kommt das das Fenster den Focus verloren hat dann wird render auf false und reset auf true gesetzt und wennes hoch komtm render auf true, somit wird nach dem Hochfahren direkt alles resettet, bzw neu erstellt. Nur Reseten geht nicht, selbst mit Pause.



  • Ich hab meinen Fehler gefudnen, es war ein kleiner Designfehler beim setzen der variablen der erst hier seine volle Wirkung entfaltet hat. Danke für die Hilfe.



  • 😕
    Das nimmt mich jetzt aber wunder. :p

    btw:

    Wenn die Windowsnachricht kommt das das Fenster den Focus verloren hat dann wird render auf false und reset auf true gesetzt

    Es gibt noch andere Möglichkeiten, dass die device verloren gehen kann. Kommt aber afaik ehere selten vor.



  • Ja, ich hatte es über diese Sache egsteuert aber die Focus nachricht komtm 2x hintereinander und ich wollte zwischen beiden Nachrichten resetten was nicht ging. Hab das ganze Design dafür umgeschrieben und nun läuft alels, man lernt eben immer was neues dazu.


Anmelden zum Antworten