D3D / DXGI gestiscono la transizione a schermo intero


9

Ho un'applicazione D3D11 e voglio aggiungere il supporto completo a schermo intero. Ora posso lasciare che DXGI passi la mia finestra a schermo intero per me, e ho l'impressione che DXGI si prenderà cura di tutto il necessario per fare in modo che la catena di swap capovolga il fronte e il backbuffer invece di blittarli.

Tuttavia, lasciare che DXGI esegua lo swich sembra inaffidabile con un'impostazione multi monitor: gli schermi secondari rimangono completamente neri dopo il passaggio per gran parte del tempo, senza motivi o motivi apparenti.

Possono passare alcune volte avanti e indietro prima che la finestra a schermo intero venga visualizzata e il resto del desktop venga visualizzato sulle altre schermate.

Apparentemente non sono solo con questo, Battlefield 3 e WoW sembrano avere problemi simili per molte persone.

Ora, la vera domanda: suppongo che anche se quelle società di sviluppatori di giochi AAA non riescono a farlo funzionare, la mia più grande speranza sarebbe in qualche modo eseguire il passaggio a schermo intero da solo.

C'è qualcosa che posso fare per elevare la mia finestra / swapchain in una modalità a schermo intero corretta e con buffer?


Al momento della stesura di questo articolo, l'attuale versione di World of Warcraft non presenta più i problemi di configurazione della modalità di visualizzazione / perdite di memoria menzionate. Erano certamente problematici ma sono stati corretti al 7.3.2
Gazer il

Risposte:


3

Per quanto ne so, l'unica cosa che funziona è:

 DwmEnableComposition(DWM_EC_DISABLECOMPOSITION);

all'inizio dell'applicazione e:

DwmEnableComposition(DWM_EC_ENABLECOMPOSITION);

prima di smettere. Per le transizioni, procedere come al solito. Ho provato InvalidateRect(NULL, NULL, true)subito dopo il passaggio a schermo intero senza alcun risultato. Spero che sia di aiuto.


Dopo aver provato tutto, sembra che tu abbia ragione. Solo disabilitare la composizione in modo affidabile impedisce che ciò accada. Non la risposta che avevo sperato, ma meglio di niente suppongo.

Si noti che Windows 8.1 e versioni successive ignorano questa impostazione. Non è possibile disabilitare DWM.
Chuck Walbourn,

1

Non sei davvero l'unico ad affrontare questo problema . Prima cosa da controllare: assicurati di utilizzare i driver più recenti / beta / di prim'ordine per la scheda video che stai utilizzando.

Ora, direi che c'è solo una piccola possibilità che tu possa farlo funzionare meglio dell'implementazione DXGI automatica. Questo tipo di problema dipende fortemente dal fornitore dell'adattatore, dalla versione del driver e dalla configurazione del monitor. Quindi riparandolo su una macchina potresti finire per romperlo di più.

Sconsiglio di tornare ai secoli bui di DirectX 9 dove dovevi fare tutto a mano. Un'idea migliore sarebbe provare a riparare la commutazione automatica. Alcuni percorsi da seguire:

  • Leggi attentamente la documentazione (sparsa) .

  • Se non lo stai già facendo, prova a rispondere WM_SIZEall'evento che ricevi quando passi da / a schermo intero, come descritto qui . In tal caso, assicurarsi di rilasciare correttamente tutti i riferimenti al back buffer prima di chiamare ResizeBuffers, come descritto qui . Non farlo potrebbe causare questo tipo di strani semi-problemi.

  • Prova ad avviare direttamente a schermo intero e a creare la catena di scambio con una delle modalità di visualizzazione elencate . Se funziona sempre, ciò potrebbe significare che non stai utilizzando una delle modalità di visualizzazione elencate durante la gestione WM_SIZE(o non del tutto, cose come la frequenza di aggiornamento possono essere importanti).

  • Prova a confonderti con l'effetto di scambio e il conteggio del buffer della descrizione della catena di scambio . Probabilmente dovresti usare DXGI_SWAP_EFFECT_SEQUENTIALun BufferCount> = 2. Forse il tuo driver ha uno scarso supporto per opzioni più "esotiche".


Il ridimensionamento dei buffer funziona correttamente. Ho anche provato tutti gli effetti di scambio, non sembrano fare la differenza e ho sempre usato 2 buffer. Vorrei provare la cosa a schermo intero, (anche se non so cosa intendi per "utilizzo di una delle modalità di visualizzazione elencate" - quando si risponde a WM_SIZE tutto ciò che faccio è ResizeBuffers, non c'è nessun posto dove passare una modalità di visualizzazione come argomento ) ma ho installato spontaneamente Windows 8 e indovinate un po ', non riesco a replicare il problema in questo momento ..

Sono tornato a Windows 7 e ho provato a creare lo swapchain a schermo intero dall'inizio, ma il problema persiste.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.