2013-10-25 9 views
6

in: C++ \ Win32-Anwendung (nicht im Vollbild) \ DX9DirectX9 Fenster ohne Gerät im laufenden Betrieb der Größe zurückgesetzt

Wie kann ich Fensterinhalt während der Größe schnell und schön genug, neu zu zeichnen? Größe ändern == Fensterrahmen des Benutzers ziehen.

Verschiedene Ansätze:

  • Gerät zurücksetzen auf jeder WM_SIZE \ WM_PAINT. Ausreichende Auflösung, aber schwarze Streifen erscheinen auf schnellen Upscale.
  • Gerät auf WM_EXITSIZEMOVE zurücksetzen und Rendering auf WM_ENTERSIZEMOVE anhalten. Beste Geschwindigkeit, aber zu hässlichen ~ schwarzen Streifen während der Größenänderung.
  • Kann nicht herausfinden, wie man dx9's Swapchain in diesem Fall verwendet
  • Halten Sie Rendering und Swapping Puffer während der Größenanpassung; auf WM_EXITSIZEMOVE zurückgesetzt. Genau was in offiziellen Demos von 2010 SDK vorkommt. Sieht schnell und akzeptabel schön aus. Aber plötzlich kamen auf langsamen Computern schwarze Streifen wieder. Dünn und selten, aber echt. Eigentlich das ist sehr seltsam: synchrones Rendering und Present(,,,) auf jedem WM_SIZE und \ oder WM_PAINT schließt das auf den ersten Blick aus. Und in der Sekunde. Vielleicht verstehe ich etwas wichtiges nicht?

Also, als letzte Methode fehlschlug, entschied ich mich hier zu fragen. Ist das irgendwie möglich dx9 Oberfläche sicher an Fensterrand geklebt zu machen. Keine schwarzen Streifen. Bevorzugen Sie die Geschwindigkeit zu verringern, aber synchronisieren Sie sie irgendwie mit DX.

Antwort

4

Ich reserviere einen Backbuffer, der groß genug für die maximale Clientgröße des Fensters ist, und ein Ansichtsfenster, das der aktuellen Fensterclientgröße auf WM_SIZE entspricht. Dann render ich zu resp. nur aus diesem Darstellungsbereich darstellen. Auf diese Weise ist kein Geräte-Reset erforderlich.

+0

Ja, nette Lösung. Ich werde es versuchen. Aber es könnte einige Probleme mit Multi-Monitor-Konfiguration und Multisampling geben. – mjollneer

+0

Sicher. Sie können jedoch immer die maximale Größe Ihres Fensters festlegen, indem Sie WM_GETMINMAXINFO bearbeiten. Ich habe meine Lösung noch nicht mit Multisampling verwendet. – cdoubleplusgood

Verwandte Themen