DirectX9

the edge

Grünschnabel
Hallo Leute.

Ich besitze da ein kleines Problem mit DirectX9. :confused:
Folgendes Problem:

Ich lasse eine DirectX-Anwendung in einem Fenstermodus laufen. Alles gut soweit.
Wenn ich aber das Fenster vergrößere wird der Inhalt unscharf. Ist klar, weil die Fenstergröße nicht mehr mit der Back-Buffergröße übereinstimmt...
Wie kann ich dieses Problem beheben?
Kann man die Back-Buffergröße irgendwie ändern, ohne eine neue Geräteschnittstelle zu erstellen

Mfg
the edge
 
Du musst die Backbuffer-Grösse in den Presentation-Parametern anpassen und das Device damit Reset-en. Achtung, der Reset geht nur, wenn alle Resourcen (Texturen, Vertex Buffer, usw.), die NICHT in einem managed Pool erstellt worden sind, released werden. Diese Resourcen musst du dann nach dem erfolgreichen Reset wiederherstellen.

Ist ein bisschen aufwendig, aber die Resourcen-Freigeb- und Wiederherstell-Funktionen hast du doch sicher auch für das Anzeige-Modus-Umschalten (bzw. Fullscreen/Windowed-Wechsel), nicht wahr? ;)

Es gibt eine Möglichkeit, sich das Freigeben und Wiederherstellen zu ersparen, du erstellst ein Device (1x1-Pixel grosser Backbuffer) und hängst dafür deinen Anzeigebereich in eine Swap-Chain. Dadurch musst du beim Ändern des Fensters nur einen Eintrag in der Swap-Chain ändern, die Resourcen können bleiben, wo sie sind. Diese Möglichkeit habe ich selber nie verwendet, ist aber von anderen schon erfolgreich verwendert worden (da wachsen auch dann wieder Haare auf der Platte).
 
Hallo Endurion.

Erst mal danke für deine Antwort, aber irgendwie komm ich noch nicht sorecht klar.

Also ich lade x-files mit der Funktion D3DXLoadMeshFromX(...) mit dem Parameter D3DXMESH_MANAGED und erstelle einen separaten VB-Buffer für eine Linie mit dem Parameter D3DPOOL_MANAGED. Das bedeutet doch, dass ich die Resourcen nicht freigeben muss, oder

Die Presentation-Parametern habe ich neu eingegeben und anschließend die Funktion Reset(Presentation-Parametern) aufgerufen....dann stürzt das Programm immer ab :confused:

Was meinst du mit Resourcen-Freigeb- und Wiederherstell-Funktionen
ich benutze nur Windowed und keinen Fullscreen/Windowed-Wechsel.

Mfg
the edge
 
Mit den Freigeb und Wiederherstell-Funktionen habe ich mich etwas unklar ausgedrückt. Im Prinzip wirfst du VOR dem Reset alles, was du angelegt hast mit Release raus, und erstellst es nach dem Reset wieder neu.

Das D3DXMesh musst du glaube ich nicht neu laden (ich habe die nie benutzt, benutzen die intern Vertex Buffer?).

Was heisst denn Absturz? Ist das evtl. ein Zugriff auf vorher freigegebene Resourcen?
Ansonsten, benutze den Debugger. Stelle in der Systemsteuerung unter DirectX alles auf Debug, Output auf Volle Kanne und dann bekommst du wunderbare Erklärungen und Warnungen, wenn irgendwo ein Fehler auftritt. Extrem hilfreich!
 
Hallo Endurion.

Es funktioniert :p :p
Hab vergessen die Schrift frei zu geben
Aber noch ne Frage bzw Problem:
Wenn ich jetzt das Fenster vergrößere und mit dem Cursor außerhalb des Fensters bin geht die CPU-Auslastung enorm in die Höhe und die Maus fängt zu ruckeln an. Im Fensterbereich ist alles normal.
Hast du vielleicht eine Idee woran das liegen kann

Gruß

the edge
 
Hmm, das könnte unter anderem auch an dem DirectX Debug liegen. Wenn du das Output ganz hochgedreht hast, kriegst du eine ganze Menge Text in das Debug-Output von Visual Studio. Wenn da ausser den Redundant Stage Changes nichts weiter drin ist, kannst du den Output Level wieder runterdrehen.
 
Zurück