Condividi tramite


Capovolgimento delle superfici (Direct3D 9)

Un'applicazione Direct3D visualizza in genere una sequenza animata generando i fotogrammi dell'animazione nei buffer indietro e presentandoli in sequenza. I buffer back sono organizzati in catene di scambio. Una catena di scambio è una serie di buffer che "capovolgono" sullo schermo uno dopo l'altro. Questa operazione può essere usata per eseguire il rendering di una scena in memoria e quindi capovolgere la scena sullo schermo al termine del rendering. Questo evita il fenomeno noto come strappo e consente un'animazione più fluida.

Ogni dispositivo creato in Direct3D ha almeno una catena di scambio. Quando si inizializza il primo dispositivo Direct3D, si imposta il membro BackBufferCount di D3DPRESENT_PARAMETERS, che indica a Direct3D il numero di buffer indietro che saranno presenti nella catena di scambio. La chiamata a IDirect3D9::CreateDevice crea quindi il dispositivo Direct3D e la catena di scambio corrispondente.

Quando si usa IDirect3DDevice9::P resent per richiedere un'operazione di capovolgimento della superficie, i puntatori alla memoria di superficie per il buffer anteriore e i buffer indietro vengono scambiati. Il capovolgimento viene eseguito passando i puntatori che il dispositivo visualizzato usa per fare riferimento alla memoria, non copiando la memoria della superficie. Quando una catena di scorrimento contiene un buffer anteriore e più buffer indietro, i puntatori vengono spostati in un modello circolare, come illustrato nel diagramma seguente.

diagramma di una catena di scorrimento con un buffer anteriore e due buffer indietro

È possibile creare catene di scambio di addizione per un dispositivo chiamando IDirect3DDevice9::CreateAdditionalSwapChain. Un'applicazione può creare una catena di scambio per visualizzazione e associare ogni catena di scambio a una determinata finestra. L'applicazione esegue il rendering delle immagini nei buffer indietro di ogni catena di scambio e li presenta singolarmente. I due parametri che IDirect3DDevice9::CreateAdditionalSwapChain accettano sono un puntatore a una struttura di D3DPRESENT_PARAMETERS e l'indirizzo di un puntatore a un'interfaccia IDirect3DSwapChain9 . È quindi possibile usare IDirect3DSwapChain9::P resent per visualizzare il contenuto del buffer indietro successivo al buffer anteriore. Si noti che un dispositivo può avere una sola catena di scambio a schermo intero.

È possibile accedere a un buffer back specifico chiamando l'interfaccia IDirect3DDevice9::GetBackBuffer o IDirect3DSwapChain9::GetBackBuffer , che restituisce un puntatore a un'interfaccia IDirect3DSurface9 che rappresenta la superficie del buffer back restituito. Si noti che la chiamata a questo metodo aumenta il conteggio dei riferimenti interni nell'interfaccia IDirect3DDevice9 , quindi assicurarsi di chiamare IUnknown quando si usa questa superficie o si avrà una perdita di memoria.

Ricorda, Direct3D capovolge le superfici scambiando puntatori di memoria della superficie all'interno della catena di scambio, non scambiando le superfici stesse. Ciò significa che verrà sempre eseguito il rendering nel buffer indietro che verrà visualizzato successivamente.

È importante notare la distinzione tra un'operazione di scorrimento, eseguita da un driver della scheda di visualizzazione e un'operazione "Presente" applicata a una catena di scambio creata con D3DSWAPEFFECT_FLIP.

Il termine "flip" indica in modo convenzionale un'operazione che modifica l'intervallo di indirizzi di memoria video usati da una scheda di visualizzazione per generare il segnale di output, causando quindi la visualizzazione del contenuto di un buffer back nascosto in precedenza. In Direct3D 9 il termine viene spesso usato più in genere per descrivere la presentazione di un buffer back in qualsiasi catena di scambio creata con l'effetto di scambio D3DSWAPEFFECT_FLIP.

Sebbene tali operazioni "Presenti" siano quasi invariabilmente implementate dalle operazioni di capovolgimento quando la catena di scambio è una a schermo intero, vengono necessariamente implementate dalle operazioni di copia quando la catena di scambio viene finestrata. Inoltre, un driver dell'adattatore di visualizzazione può usare il flipping per implementare le operazioni presenti su catene di scambio a schermo intero in base alla D3DSWAPEFFECT_DISCARD e D3DSWAPEFFECT_COPY.

La discussione precedente si applica al caso comunemente usato di una catena di scambio a schermo intero creata con D3DSWAPEFFECT_FLIP.

Per una discussione più generale sui diversi effetti di scambio per catene di scambio con finestre e a schermo intero, vedere D3DSWAPEFFECT.

Superfici Direct3D