Modello di capovolgimento DXGI

Windows 8 aggiunge il supporto per il modello di presentazione flip e le relative statistiche presenti in DXGI 1.2. Windows 8 modello di presentazione flip DXGI è simile alla presentazione direct3D 9EX in modalità Direct3D 9EX di Windows 7. Le app di presentazione basate su video o frame, ad esempio giochi, possono trarre vantaggio dalla maggior parte usando il modello di presentazione capovolto. Le app che usano il modello di presentazione flip DXGI riducono il carico delle risorse di sistema e aumentano le prestazioni. Le app possono anche usare miglioramenti delle statistiche con il modello di presentazione capovolgimento per controllare meglio la frequenza di presentazione fornendo commenti e suggerimenti in tempo reale e meccanismi di correzione.

Confronto tra il modello flip DXGI e il modello BitBlt

Il runtime usa il trasferimento a blocchi bit (bitblt) e capovolge i modelli di presentazione per presentare il contenuto grafico nei monitor di visualizzazione. La differenza principale tra i modelli di presentazione bitblt e flip è il modo in cui il contenuto del buffer di back-buffer ottiene l'Windows 8 DWM per la composizione. Nel modello bitblt il contenuto del buffer indietro viene copiato nell'area di reindirizzamento in ogni chiamata a IDXGISwapChain1::P resent1. Nel modello di capovolgimento tutti i buffer back vengono condivisi con Desktop Window Manager (DWM). Pertanto, DWM può comporre direttamente da tali buffer indietro senza alcuna operazione di copia aggiuntiva. In generale, il modello di capovolgimento è più efficiente. Il modello di capovolgimento offre anche altre funzionalità, ad esempio statistiche avanzate presenti.

Se sono presenti componenti legacy che usano Windows Graphics Device Interface (GDI) per scrivere direttamente in un HWND, usare il modello bitblt.

I miglioramenti delle prestazioni del modello di flip DXGI sono significativi quando l'app è in modalità finestra. La sequenza in questa tabella e l'illustrazione confrontano l'utilizzo della larghezza di banda della memoria e le scritture di app finestrate che scelgono il modello di scorrimento rispetto al modello bitblt.

Passaggio Modello BitBlt presente in DWM Modello di flip DXGI presente in DWM
1. L'app aggiorna il frame (Scrittura)
L'app aggiorna il frame (Scrittura)
2. Il runtime Direct3D copia il contenuto della superficie in una superficie di reindirizzamento DWM (lettura, scrittura)
Il runtime Direct3D passa l'area dell'app a DWM
3. Al termine della copia della superficie condivisa, DWM esegue il rendering della superficie dell'app sullo schermo (lettura, scrittura)
DWM esegue il rendering della superficie dell'app sullo schermo (lettura, scrittura)

 

illustration of a comparison of the blt model and the flip model

Il modello flip riduce l'utilizzo della memoria di sistema riducendo il numero di letture e scritture dal runtime Direct3D per la composizione della cornice finestrata da DWM.

Come usare il modello di flip DXGI

App Direct3D 11.1 destinate Windows 8 usare il modello di scorrimento creando la catena di scambio con il valore di enumerazione DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL impostato nel membro SwapEffectdella struttura DXGI_SWAP_CHAIN_DESC1. Quando si imposta SwapEffect su DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL, impostare anche questi membri di DXGI_SWAP_CHAIN_DESC1 sui valori indicati:

  • BufferCount a un valore compreso tra 2 e 16 per impedire una penalità delle prestazioni in seguito all'attesa in DWM per rilasciare il buffer di presentazione precedente.
  • Formato per DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_B8G8R8A8_UNORM o DXGI_FORMAT_R8G8B8A8_UNORM
  • Conteggio membro della struttura DXGI_SAMPLE_DESC che il membro SampleDesc specifica a uno e il membro Quality di DXGI_SAMPLE_DESC a zero perché non è supportato più antialiasing di esempio (MSAA)

Se si usa DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL in Windows 7 o versioni precedenti del sistema operativo, la creazione del dispositivo ha esito negativo. Quando si usa il modello di capovolgimento, è possibile usare le statistiche presenti a schermo intero in modalità finestrata. Il comportamento a schermo intero non è interessato. Se si passa NULL al parametro pFullscreenDesc di IDXGIFactory2::CreateSwapChainForHwnd per una catena di scambio finestrata e impostare SwapEffect su DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL, il runtime crea un buffer indietro aggiuntivo e ruota quale handle appartiene al buffer che diventa il buffer anteriore alla presentazione.

Quando si usa il modello di capovolgimento, prendere in considerazione questi suggerimenti:

  • Usare una catena di scambio di modelli a capovolgimento per HWND. Non assegnare più catene di scambio di modelli a capovolgimento allo stesso HWND.
  • Non usare la catena di scambio di modelli capovolgimento con la funzione ScrollWindow o ScrollWindowEx di GDI. Alcune app Direct3D usano le funzioni ScrollWindow e ScrollWindowEx di GDI per aggiornare il contenuto della finestra dopo che si verifica un evento di scorrimento utente. ScrollWindow e ScrollWindowEx eseguono bitblts del contenuto della finestra sullo schermo mentre l'utente scorre una finestra. Queste funzioni richiedono anche aggiornamenti del modello bitblt per il contenuto GDI e Direct3D. Le app che usano entrambe le funzioni non visualizzeranno necessariamente il contenuto della finestra visibile che scorre sullo schermo quando l'app è in modalità finestra. È consigliabile non usare le funzioni ScrollWindow e ScrollWindowEx di GDI e di modificare il contenuto GDI e Direct3D in risposta allo scorrimento.
  • Usare il modello di capovolgimento in un HWND non destinato anche ad altre API, tra cui il modello di presentazione bitblt DXGI, altre versioni di Direct3D o GDI. Poiché il modello bitblt gestisce una copia aggiuntiva della superficie, è possibile aggiungere GDI e altri contenuti Direct3D allo stesso HWND tramite aggiornamenti a fasi da Direct3D e GDI. Quando si usa il modello di capovolgimento, è visibile solo il contenuto Direct3D nelle catene di scambio del modello di capovolgimento che il runtime passa a DWM. Il runtime ignora tutti gli altri aggiornamenti del contenuto Direct3D o GDI del modello bitblt.

Sincronizzazione frame delle app di flip model DXGI

Le statistiche presenti sono informazioni di temporizzazione frame che le app multimediali usano per sincronizzare i flussi video e audio e recuperare da errori di riproduzione video. Le app possono usare le informazioni sulla tempistica dei fotogrammi nelle statistiche presenti per modificare la frequenza di presentazione dei fotogrammi video per una presentazione più uniforme. Per ottenere informazioni sulle statistiche, chiamare il metodo IDXGISwapChain::GetFrameStatistics per ottenere la struttura di DXGI_FRAME_STATISTICS . DXGI_FRAME_STATISTICS contiene statistiche sulle chiamate IDXGISwapChain1::P resent1 . Una catena di scambio di modelli a capovolgimento fornisce informazioni statistiche presenti in modalità finestrata e schermo intero. Per le catene di scambio dei modelli bitblt in modalità finestra, tutti i valori DXGI_FRAME_STATISTICS sono zero.

Per il modello flip presenta statistiche, IDXGISwapChain::GetFrameStatistics restituisce DXGI_ERROR_FRAME_STATISTICS_DISJOINT in queste situazioni:

  • Prima chiamata a GetFrameStatistics, che indica l'inizio di una sequenza
  • Modifica della modalità: modalità finestrata a o da schermo intero o a schermo intero alle transizioni a schermo intero

I valori in PresentRefreshCount, SyncRefreshCount e I membri SyncQPCTime di DXGI_FRAME_STATISTICS hanno le caratteristiche seguenti:

  • PresentRefreshCount è uguale a SyncRefreshCount quando l'app viene visualizzata in ogni vsync.
  • SyncRefreshCount viene ottenuto nell'intervallo vsync quando il presente è stato inviato, SyncQPCTime è approssimativamente il tempo associato all'intervallo vsync.

Il metodo IDXGISwapChain::GetLastPresentCount restituisce l'ultimo conteggio presente, ovvero l'ID presente dell'ultima chiamata IDXGISwapChain1::P resent1 effettuata da un dispositivo visualizzato associato alla catena di scambio. Questo ID presente è il valore del membro PresentCount della struttura DXGI_FRAME_STATISTICS . Per le catene di scambio dei modelli bitblt, mentre in modalità finestra, tutti i valori DXGI_FRAME_STATISTICS sono zero.

Evitare, rilevare e recuperare da errori

Eseguire questi passaggi per evitare, rilevare e recuperare dagli errori nella presentazione frame:

  1. Code IDXGISwapChain1::P resent1 chiamate (ovvero chiamare IDXGISwapChain1::P resent1 , che causa la raccolta in una coda).

  2. Creare una struttura presente-coda per archiviare tutti gli IDXGISwapChain1::P resent1 id presente (restituiti da IDXGISwapChain::GetLastPresentCount) e associati, calcolati/previsti Valori PresentRefreshCount .

  3. Per rilevare un errore:

    • Chiamare IDXGISwapChain::GetFrameStatistics.
    • Per questo frame, ottenere l'ID presente (PresentCount) e il conteggio vsync in cui il sistema operativo ha presentato l'ultima immagine al monitor (PresentRefreshCount).
    • Recuperare l'oggetto PresentRefreshCount associato all'ID presente e archiviato in precedenza nella struttura presente-coda.
    • Se l'effettivo PresentRefreshCount è successivo al previsto PresentRefreshCount, si è verificato un errore.
  4. Per eseguire il ripristino dall'errore:

    • Calcolare il numero di fotogrammi da ignorare per recuperare dall'errore. Ad esempio, se il passaggio 3 rivela che il conteggio vsync previsto (PresentRefreshCount) per un ID presente (PresentCount) è 5 e il conteggio vsync effettivo per l'ID presente è 8, il numero di fotogrammi da ignorare per il ripristino dall'errore è 3 fotogrammi.

    • Passare 0 al parametro SyncInterval in questo numero di chiamate a IDXGISwapChain1::P resent1 per eliminare e ignorare questo numero di fotogrammi.

      Nota

      Se l'errore è costituito da un numero elevato di fotogrammi, chiamare IDXGISwapChain1::P resent1 con il parametro Flags impostato su DXGI_PRESENT_RESTART per eliminare e ignorare tutti i regali in coda in sospeso.

       

Di seguito è riportato uno scenario di esempio di recupero da errori nella presentazione frame:

illustration of an example scenario of recovering from glitches in frame presentation

Nello scenario di esempio si prevede che frame A vada sullo schermo su un conteggio vsync di 1. Ma si rileva effettivamente il conteggio vsync che la cornice A viene visualizzata sullo schermo come 4. Di conseguenza, si determina che si è verificato un errore. È quindi possibile eliminare 3 frame, ovvero passare 0 al parametro SyncInterval in 3 chiamate a IDXGISwapChain1::P resent1. Nello scenario di esempio precedente, per ripristinare l'errore, è necessario un totale di 8 chiamate IDXGISwapChain1::P resent1 . Il 9° frame è quindi visibile in base al conteggio vsync previsto.

Ecco una linea temporale degli eventi di presentazione. Ogni riga verticale rappresenta un vsync. La direzione orizzontale è il tempo, che aumenta a destra. È possibile usare la figura per immaginare come possono verificarsi glitch.

illustration of a time line of presentation eventsl

La figura illustra questa sequenza:

  1. L'app viene riattivata su vsync, esegue il rendering blu, chiama IDXGISwapChain1::P resent1 e quindi torna a dormire.

  2. L'unità di elaborazione grafica (GPU) viene riattivata dall'inattività, esegue il rendering in blu e quindi torna a dormire.

  3. Il DWM si riattiva al vsync successivo, compone blu nel suo buffer posteriore, chiama IDXGISwapChain1::P resent1 e quindi torna a dormire.

  4. L'app viene riattivata, esegue il rendering verde, chiama IDXGISwapChain1::P resent1 e quindi torna a dormire.

    Nota

    L'app esegue simultaneamente mentre la GPU esegue la composizione di blu.

     

  5. Successivamente, la GPU esegue il rendering verde per l'app.

  6. Infine, il convertitore digitale a analogico (DAC) mostra i risultati della composizione DWM sul monitor nel vsync successivo.

Dalla linea temporale è possibile immaginare la latenza delle statistiche presenti e come possono verificarsi errori. Ad esempio, per visualizzare un problema DWM per il colore verde visualizzato sullo schermo, immaginare di ampliare la casella verde/rosso in modo che il lato destro della casella verde/rosso corrisponda fino al lato destro della casella viola/rosso. In questo scenario, l'applicazione livello dati mostra due fotogrammi di blu e quindi la cornice verde. È possibile notare che questo errore si è verificato dalla lettura delle statistiche presenti.

Miglioramento della presentazione con il modello di capovolgimento, i rettangoli sporchi e le aree scorrevoli