D3D / DXGI handhaben den Vollbildübergang


9

Ich habe eine D3D11-Anwendung und möchte die richtige Vollbild-Unterstützung hinzufügen. Jetzt kann ich DXGI mein Fenster für mich auf Vollbild umschalten lassen, und ich habe den Eindruck, dass DXGI sich um alles kümmert, was erforderlich ist, damit die Swap-Kette den vorderen und hinteren Puffer umdreht, anstatt sie zu blitzen.

Es scheint jedoch bei einem Multi-Monitor-Setup unzuverlässig zu sein, DXGI den Swich ausführen zu lassen - sekundäre Bildschirme bleiben nach dem Umschalten die meiste Zeit vollständig schwarz, ohne ersichtlichen Grund oder Muster.

Es kann einige Male dauern, bis das Vollbildfenster und der Rest des Desktops auf den anderen Bildschirmen angezeigt werden.

Anscheinend bin ich damit nicht allein, Battlefield 3 und WoW scheinen für viele Leute ähnliche Probleme zu haben.

Nun die eigentliche Frage: Ich denke, da selbst diese AAA-Spieleentwickler dies nicht zum Laufen bringen können, wäre meine größte Hoffnung, den Wechsel zum Vollbildmodus selbst durchzuführen.

Kann ich irgendetwas tun, um mein Fenster / meine Swapchain in den richtigen Vollbildmodus mit Pufferumkehr zu versetzen?


Zum Zeitpunkt dieses Schreibens weist die aktuelle Version von World of Warcraft nicht mehr die von Ihnen erwähnten Konfigurationsprobleme / Speicherlecks im Anzeigemodus auf. Sie waren sicherlich problematisch, wurden aber am 7.3.2
Gazer

Antworten:


3

Meines Wissens funktioniert nur Folgendes:

 DwmEnableComposition(DWM_EC_DISABLECOMPOSITION);

zu Beginn Ihrer Bewerbung und:

DwmEnableComposition(DWM_EC_ENABLECOMPOSITION);

vor dem Beenden. Gehen Sie für die Übergänge wie gewohnt vor. Ich habe es InvalidateRect(NULL, NULL, true)gleich nach dem Wechsel zum Vollbild ohne Erfolg versucht . Hoffe das hilft.


Nachdem Sie alles versucht haben, scheinen Sie richtig zu sein. Nur das zuverlässige Deaktivieren der Komposition verhindert dies. Nicht die Antwort, auf die ich gehofft hatte, aber besser als nichts, nehme ich an.

Beachten Sie, dass Windows 8.1 und höher diese Einstellung ignoriert. Sie können DWM nicht deaktivieren.
Chuck Walbourn

1

Sie sind in der Tat nicht der einzige, der mit diesem Problem konfrontiert ist . Als erstes sollten Sie überprüfen, ob Sie die neuesten / beta / erstklassigen Treiber für die von Ihnen verwendete Grafikkarte verwenden.

Nun würde ich sagen, dass es nur eine geringe Chance gibt, dass dies besser funktioniert als die automatische DXGI-Implementierung. Diese Art von Problem hängt stark vom Adapterhersteller, der Treiberversion und der Monitorkonfiguration ab. Wenn Sie es also auf einer Maschine reparieren, können Sie es auf mehreren Maschinen beschädigen.

Ich rate davon ab, in das dunkle Zeitalter von DirectX 9 zurückzukehren, in dem Sie alles von Hand erledigen mussten. Eine bessere Idee wäre, die automatische Umschaltung zu reparieren. Einige Wege zu folgen:

  • Lesen Sie die (spärliche) Dokumentation sorgfältig durch.

  • Wenn Sie dies noch nicht tun, versuchen Sie, auf das WM_SIZEEreignis zu reagieren, das Sie beim Wechsel von / zu Vollbild erhalten, wie hier beschrieben . Stellen Sie in diesem Fall sicher, dass Sie alle Verweise auf den Backpuffer ordnungsgemäß freigeben, bevor Sie aufrufen ResizeBuffers, wie dort beschrieben . Wenn Sie dies nicht tun, kann dies zu seltsamen Problemen führen.

  • Versuchen Sie, direkt im Vollbildmodus zu starten und Ihre Swap-Kette mit einem der aufgezählten Anzeigemodi zu erstellen . Wenn dies die ganze Zeit funktioniert, kann dies bedeuten, dass Sie bei der Handhabung WM_SIZEkeinen der aufgezählten Anzeigemodi verwenden (oder nicht vollständig, Dinge wie die Aktualisierungsrate können wichtig sein).

  • Versuchen Sie, mit dem Swap-Effekt und der Pufferanzahl Ihrer Swap-Kettenbeschreibung herumzuspielen . Sie sollten wahrscheinlich verwenden DXGI_SWAP_EFFECT_SEQUENTIALund a BufferCount> = 2. Möglicherweise hat Ihr Treiber eine schlechte Unterstützung für "exotischere" Optionen.


Das Ändern der Puffergröße funktioniert einwandfrei. Ich habe auch alle Swap-Effekte ausprobiert, sie scheinen keinen Unterschied zu machen, und ich habe immer 2 Puffer verwendet. Ich würde das Vollbild versuchen (obwohl ich nicht weiß, was Sie unter "Verwenden eines der aufgezählten Anzeigemodi" verstehen - wenn ich auf WM_SIZE antworte, ist alles, was ich tue, ResizeBuffers, gibt es keinen Ort, an dem ein Anzeigemodus als Argument übergeben werden kann ) aber ich habe spontan Windows 8 installiert und

Ging zurück zu Windows 7 und versuchte von Anfang an, die Swapchain im Vollbildmodus zu erstellen, aber das Problem besteht weiterhin.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.