Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Una risorsa è una raccolta di dati usati dalla pipeline 3D. La creazione di risorse e la definizione del loro comportamento è il primo passaggio per la programmazione dell'applicazione. Questa guida illustra gli argomenti di base per la scelta delle risorse richieste dall'applicazione.
- identificare le fasi della pipeline che richiedono risorse
- identificare come verrà usata ogni risorsa
- associazione delle risorse ai passaggi della pipeline
- argomenti correlati
Identificare le fasi della pipeline che richiedono risorse
Il primo passaggio consiste nel scegliere la fase pipeline (o fasi) che userà una risorsa. Ovvero, identificare ogni fase che leggerà i dati da una risorsa e le fasi che scriveranno i dati in una risorsa. Conoscere le fasi della pipeline in cui verranno usate le risorse determina le API che verranno chiamate per associare la risorsa alla fase.
Questa tabella elenca i tipi di risorse che possono essere associati a ogni fase della pipeline. Include se la risorsa può essere associata come input o output, nonché l'API di associazione.
| Fase della pipeline | Entrata/Uscita | Risorsa | Tipo di risorsa | Bind API |
|---|---|---|---|---|
| Assemblatore di Input | In | Vertex Buffer | Buffer | IASetVertexBuffers |
| Input Assembler | In | Buffer dell'indice | Buffer | IASetIndexBuffer |
| Fasi shader | In | Shader-ResourceView | Buffer, Texture1D, Texture2D, Texture3D | VSSetShaderResources, GSSetShaderResources, PSSetShaderResources |
| Fasi shader | In | buffer Shader-Constant | Buffer | VSSetConstantBuffers, GSSetConstantBuffers, PSSetConstantBuffers |
| Output del flusso | Fuori | Buffer | Buffer | SOSetTargets |
| Unione di output | Fuori | Visualizzazione di destinazione del rendering | Buffer, Texture1D, Texture2D, Texture3D | OMSetRenderTargets |
| Fusione di Output | Fuori | Visualizzazione Depth/Stencil | Texture1D, Texture2D | OMSetRenderTargets |
Identificare come verrà usata ogni risorsa
Dopo aver scelto le fasi della pipeline che verranno usate dall'applicazione (e quindi le risorse necessarie per ogni fase), il passaggio successivo consiste nel determinare come verrà usata ogni risorsa, ovvero se è possibile accedere a una risorsa dalla CPU o dalla GPU.
L'hardware su cui è in esecuzione l'applicazione avrà almeno una CPU e una GPU. Per selezionare un valore di utilizzo, considerare quale tipo di processore deve leggere o scrivere nella risorsa dalle opzioni seguenti (vedere D3D10_USAGE).
| Utilizzo risorse | Può essere aggiornato da | Frequenza di aggiornamento |
|---|---|---|
| Predefinito | GPU (Unità di elaborazione grafica) | raramente |
| Dinamico | CPU | frequentemente |
| Stadiazione | GPU | n/a |
| Immutabile | CPU (solo in fase di creazione delle risorse) | n/a |
L'utilizzo predefinito deve essere usato per una risorsa che dovrebbe essere aggiornata raramente dalla CPU (minore di una volta per fotogramma). Idealmente, la CPU non scriverebbe mai direttamente in una risorsa con utilizzo predefinito in modo da evitare potenziali penalità per le prestazioni.
L'utilizzo dinamico deve essere usato per una risorsa che la CPU aggiorna relativamente frequentemente (una o più volte per ogni fotogramma). Uno scenario tipico per una risorsa dinamica consiste nel creare buffer di vertici dinamici e di indice che vengono riempiti in fase di esecuzione con dati sulla geometria visibile dal punto di vista dell'utente per ogni frame. Questi buffer vengono usati per eseguire il rendering solo della geometria visibile all'utente per tale frame.
L'utilizzo del staging dovrebbe essere usato per copiare dati da e verso altre risorse. Uno scenario tipico consiste nel copiare i dati in una risorsa con utilizzo predefinito (che la CPU non può accedere) a una risorsa con utilizzo di staging (a cui la CPU può accedere).
Le risorse non modificabili devono essere usate quando i dati nella risorsa non cambieranno mai.
Un altro modo per esaminare la stessa idea consiste nel pensare a cosa fa un'applicazione con una risorsa.
| Utilizzo della risorsa da parte dell'applicazione | Utilizzo risorse |
|---|---|
| Caricare una sola volta e non aggiornare mai | Non modificabile o predefinito |
| L'applicazione riempie ripetutamente la risorsa | Dinamico |
| Rendering su texture | Predefinito |
| Accesso alla CPU dei dati GPU | Stadiazione |
Se non si è certi dell'utilizzo da scegliere, iniziare con l'utilizzo predefinito perché è previsto che sia il caso più comune. Un buffer Shader-Constant è quello di un tipo di risorsa che deve avere sempre l'utilizzo predefinito.
Associazione delle risorse alle fasi della pipeline
Una risorsa può essere associata a più fasi della pipeline contemporaneamente a condizione che vengano soddisfatte le restrizioni specificate al momento della creazione della risorsa (flag di utilizzo, flag di associazione, flag di accesso alla CPU). In particolare, una risorsa può essere associata come input e un output contemporaneamente, purché la lettura e la scrittura di una parte di una risorsa non possano verificarsi contemporaneamente.
Quando si associa una risorsa, considerare il modo in cui la GPU e la CPU accederanno alla risorsa. Le risorse progettate per uno scopo singolo (non usano più utilizzi, binding e flag di accesso alla CPU) genereranno probabilmente prestazioni migliori.
Si consideri ad esempio il caso di una destinazione di rendering usata più volte come trama. Può essere più veloce avere due risorse: una destinazione di rendering e una trama usata come risorsa shader. Ogni risorsa userebbe un solo flag di associazione (D3D10_BIND_RENDER_TARGET o D3D10_BIND_SHADER_RESOURCE). I dati verranno copiati dalla texture di destinazione di rendering alla texture dello shader usando CopyResource o CopySubresourceRegion. Ciò può migliorare le prestazioni isolando la scrittura sul target di rendering dalla lettura della texture dello shader. Naturalmente, l'unico modo per assicurarsi è implementare entrambi gli approcci e misurare la differenza di prestazioni nell'applicazione specifica.
Argomenti correlati