Condividi tramite


Per prestazioni ottimali, usare il modello flip DXGI

Questo argomento fornisce indicazioni per gli sviluppatori su come ottimizzare le prestazioni e l'efficienza nello stack di presentazioni nelle versioni moderne di Windows. Riprende dove il modello di capovolgiMENTO DXGI, DirectX 12: Modalità presentazione In Windows 10 (video) e Miglioramenti della presentazione in Windows 10: Un'anteprima (video) è stata interrotta.

Invito all'azione

Se si usa ancora DXGI_SWAP_EFFECT_DISCARD o DXGI_SWAP_EFFECT_SEQUENTIAL (a.k.a. il modello "blt" presente), è il momento di arrestare!

Passando a DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL o DXGI_SWAP_EFFECT_FLIP_DISCARD (a.k.a. il modello di capovolgimento) offrirà prestazioni migliori, un utilizzo inferiore della potenza e offre un set più completo di funzionalità. Per altre informazioni su questi valori, vedere DXGI_SWAP_EFFECT enumerazione .

Il modello Flip presenta la modalità in modo efficace o migliore rispetto alla modalità "fullscreen esclusiva" classica. In effetti, è possibile riconsiderare se l'applicazione ha effettivamente bisogno di una modalità esclusiva a schermo intero, poiché i vantaggi di una finestra senza bordo del modello capovolgimento includono Alt-Tab più veloce Alt-Tab l'integrazione con funzionalità di visualizzazione moderne.

Perché ora? Prima dell'aggiornamento di aprile 2018, il modello blt presenta un risultato di strappo visibile quando usato nelle configurazioni gpu ibride, spesso trovato nei portatili di fascia alta (vedere KB 3158621). Nell'aggiornamento di aprile 2018 questo strappo è stato risolto, a costo di alcuni lavori aggiuntivi. Se si esegue blt presenta prestazioni elevate tra GPU ibride, soprattutto a risoluzioni elevate, ad esempio 4K, questo lavoro aggiuntivo può influire sulle prestazioni complessive. Per mantenere prestazioni ottimali in questi sistemi, passare dal blt al modello di capovolgimento presente. Inoltre, è consigliabile ridurre la risoluzione della swapchain, soprattutto se non è il punto principale di interazione dell'utente (come spesso accade con le finestre di anteprima VR).

Una breve storia

Qual è il modello di capovolgimento? Qual è l'alternativa?

Prima di Windows 7, l'unico modo per presentare il contenuto da D3D era "blt" o copiarlo in una superficie di proprietà della finestra o dello schermo. A partire dall'effetto di scambio FLIPEX di D3D9 e arrivando a DXGI attraverso l'effetto di scambio FLIP_SEQUENTIAL in Windows 8, abbiamo sviluppato un modo più efficiente per mettere il contenuto sullo schermo condividendolo direttamente con il compositore desktop, con copie minime. Per una panoramica generale della tecnologia, vedere modello di flip DXGI .

Questa ottimizzazione è possibile grazie a DWM (Desktop Window Manager), che è il compositore che esegue l'unità desktop di Windows.

Quando è necessario usare il modello blt?

C'è una parte di funzionalità che il modello di capovolgimento non fornisce: la possibilità di avere più API diverse che producono contenuto, che tutti i livelli si trovano nello stesso HWND, in base a una base presente. Un esempio di questo metodo consiste nell'usare D3D per disegnare uno sfondo di una finestra e quindi Windows GDI per disegnare qualcosa in alto o usando due API grafiche diverse, o due swapchain dalla stessa API, per produrre fotogrammi alternati. Se non è necessaria l'interoperabilità a livello di HWND tra i componenti grafici, non è necessario un modello blt.

C'è un secondo pezzo di funzionalità che non è stato fornito nella progettazione del modello di capovolgimento originale, ma è ora disponibile, che è la possibilità di presentare a un framerate non impagliato. Per un'applicazione che usa l'intervallo di sincronizzazione 0, non è consigliabile passare al modello a meno che l'API IDXGIFactory5::CheckFeatureSupport sia disponibile e non sia disponibile il supporto dei report per DXGI_FEATURE_PRESENT_ALLOW_TEARING. Questa funzionalità è quasi onnipresente sulle versioni recenti di Windows 10 e su hardware moderno.

DirectFlip

Se hai visto DirectX 12: Modalità presentazione In Windows 10, vedrai parlare di "Direct Flip" e "Flip indipendente". Si tratta di ottimizzazioni abilitate per le applicazioni che usano lo scambio di modelli di capovolgimento. A seconda della configurazione della finestra e del buffer, è possibile ignorare completamente la composizione desktop e inviare direttamente fotogrammi dell'applicazione allo schermo, nello stesso modo in cui lo schermo completo esclusivo fa.

Questi giorni, queste ottimizzazioni possono impegnarsi in uno di 3 scenari, in ordine di aumento delle funzionalità:

  1. DirectFlip: i buffer swapchain corrispondono alle dimensioni dello schermo e l'area client della finestra copre lo schermo. Anziché usare la swapchain DWM per visualizzare sullo schermo, viene usata la swapchain dell'applicazione.
  2. DirectFlip con i fitter del pannello: l'area client della finestra copre lo schermo e i buffer di swapchain si trovano all'interno di un fattore di ridimensionamento dipendente dall'hardware (ad esempio, 0,25x a 4x) dello schermo. L'hardware di analisi GPU viene usato per ridimensionare il buffer durante l'invio al display.
  3. DirectFlip con sovrapposizione a più piani (MPO): i buffer swapchain si trovano all'interno di un fattore di ridimensionamento dipendente dall'hardware delle dimensioni della finestra. DWM è in grado di riservare un piano di analisi hardware dedicato per l'applicazione, che viene quindi analizzato e potenzialmente esteso a una sotto-area alfa-blend dello schermo.

Con il modello flip finestrato, l'applicazione può eseguire query sul supporto hardware per diversi scenari DirectFlip e implementare diversi tipi di ridimensionamento dinamico tramite l'uso di IDXGIOutput6::CheckHardwareCompositionSupport. Un'attenzione da tenere presente è che se i pannelli sono utilizzati, è possibile che il cursore subisca effetti collaterali di estensione, che è indicato tramite DXGI_HARDWARE_COMPOSITION_SUPPORT_FLAG_CURSOR_STRETCHED.

Una volta che la swapchain è stata "DirectFlipped", la DWM può andare a dormire e riattivare solo quando qualcosa cambia all'esterno dell'applicazione. I fotogrammi dell'applicazione vengono inviati direttamente allo schermo, indipendentemente, con la stessa efficienza dell'esclusiva a schermo intero. Si tratta di "Flip indipendente" e può interagire in tutti gli scenari precedenti. Se altri contenuti desktop vengono visualizzati in alto, il DWM può tornare senza problemi alla modalità composta, "invertire in modo efficiente" il contenuto all'inizio dell'applicazione prima di capovolgerlo o sfruttare MPO per mantenere la modalità di capovolgimento indipendente.

Vedere lo strumento PresentMon per ottenere informazioni dettagliate su quale delle versioni precedenti è stato usato.

Che cos'altro è nuovo nel modello flip?

Oltre ai miglioramenti precedenti, che si applicano agli swapchain standard senza nulla speciale, sono disponibili diverse funzionalità per le applicazioni di flip model da usare:

  • Riduzione della latenza tramite DXGI_SWAP_CHAIN_FLAG_FRAME_LATENCY_WAITABLE_OBJECT. Quando in modalità Flip indipendente, è possibile ridurre fino a 1 frame di latenza nelle versioni recenti di Windows, con fallback tolleranza al minimo possibile quando composto.
    • Attenzione: si è verificato un problema che ha dato almeno due frame di latenza nell'aggiornamento dell'anniversario Windows 10 e versioni precedenti. Per altre informazioni, vedere questo argomento del forum . Questa operazione è stata risolta nell'aggiornamento di Fall Creator.
  • DXGI_SWAP_EFFECT_FLIP_DISCARD consente una modalità "composizione inversa" di capovolgimento diretto, che comporta un lavoro meno complessivo per visualizzare il desktop. Il DWM può eseguire lo scribble nei buffer dell'applicazione e inviarli allo schermo, anziché eseguire una copia completa nei propri swapchain.
  • DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING può abilitare una latenza ancora più bassa rispetto all'oggetto waitable, anche in una finestra nei sistemi con supporto di sovrapposizione multipiattore.
  • Le applicazioni hanno il controllo sul ridimensionamento del contenuto che si verifica durante il ridimensionamento della finestra, usando la proprietà DXGI_SCALING impostata durante la creazione di swapchain.
  • Il contenuto nei formati HDR (R10G10B10A2_UNORM o R16G16B16A16_FLOAT) non è bloccato a meno che non sia composto da un desktop SDR.
  • Le statistiche presenti sono disponibili in modalità finestra.
  • Esiste una maggiore compatibilità con il modello di applicazione UWP (piattaforma UWP (Universal Windows Platform)) e DX12 poiché sono compatibili solo con il modello flip.

Cosa devo fare per usare il modello di capovolgimento?

Gli swapchain del modello flip hanno alcuni requisiti aggiuntivi in cima alle swapchain blt:

  1. Il conteggio del buffer deve essere almeno 2.
  2. Dopo la presentazione delle chiamate, il buffer back deve essere rissociato in modo esplicito al contesto immediato D3D11 prima di poterlo usare di nuovo.
  3. Dopo aver chiamato SetFullscreenState, l'applicazione deve chiamare ResizeBuffers prima di Present.
  4. Le swapchain msAA (anti-aliasing multisample) non sono supportate direttamente nel modello flip, quindi l'applicazione dovrà eseguire una risoluzione MSAA prima di emettere il presente.

Come scegliere le risoluzioni di rendering e presentazione corrette

Il modello tradizionale per le applicazioni in passato è stato quello di fornire all'utente un elenco di risoluzioni da scegliere quando l'utente seleziona la modalità fullscreen esclusiva. Con la possibilità di visualizzare moderni per iniziare facilmente il ridimensionamento del contenuto, è consigliabile fornire agli utenti la possibilità di scegliere una risoluzione di rendering per il ridimensionamento delle prestazioni, indipendentemente da una risoluzione di output e anche in modalità finestra. Inoltre, le applicazioni devono sfruttare IDXGIOutput6::CheckHardwareCompositionSupport per determinare se devono ridimensionare il contenuto prima di presentarlo o se devono consentire all'hardware di eseguire il ridimensionamento.

Il contenuto potrebbe essere necessario eseguire la migrazione da una GPU a un'altra come parte dell'operazione di composizione o presente. Questo è spesso vero nei portatili multi-GPU o nei sistemi con GPU esterni collegati. Man mano che queste configurazioni diventano più comuni, mentre la risoluzione elevata diventa più comune, il costo di presentare una portachiavi a risoluzione completa aumenta. Se la destinazione della swapchain non è il punto principale di interazione dell'utente, come spesso accade con i titoli VR che presentano un'anteprima 2D della scena VR in una finestra secondaria, prendere in considerazione l'uso di una swapchain di risoluzione inferiore per ridurre al minimo la quantità di larghezza di banda che deve essere trasferita tra GPU diverse.

Altre considerazioni

La prima volta che si chiede alla GPU di scrivere nel buffer back swapchain è il momento in cui la GPU si blocca in attesa che il buffer diventi disponibile. Quando possibile, ritardare questo punto fino al frame possibile.