Scelta di una risorsa
Una risorsa è una raccolta di dati usati dalla pipeline 3D. La creazione di risorse e la definizione del loro comportamento è il primo passaggio della programmazione dell'applicazione. Questa guida illustra gli argomenti di base relativi alla scelta delle risorse richieste dall'applicazione.
Identificare le fasi della pipeline che richiedono risorse
Il primo passaggio consiste nel scegliere la fase, o le fasi, della pipeline grafica che useranno una risorsa. Ovvero, identificare ogni fase che leggerà i dati da una risorsa e le fasi che scriveranno dati in una risorsa. Conoscere le fasi della pipeline in cui verranno usate le risorse consente di determinare le API che verranno chiamate per associare la risorsa alla fase.
Questa tabella elenca i tipi di risorse che è possibile associare a ogni fase della pipeline. Include se la risorsa può essere associata come input o output.
Fase della pipeline | In/Out | Conto risorse | Tipo di risorsa |
---|---|---|---|
Assemblaggio input | In | Buffer dei vertici | Buffer |
Assemblaggio input | In | Index buffer | Buffer |
Fasi shader | In | Shader-ResourceView | Buffer, Texture1D, Texture2D, Texture3D |
Fasi shader | In | Shader-Buffer costante | Buffer |
Output del flusso | Verso l'esterno | Buffer | Buffer |
Unione output | Verso l'esterno | Render-Visualizzazione di destinazione | Buffer, Texture1D, Texture2D, Texture3D |
Unione output | Verso l'esterno | Visualizzazione depth stencil | Texture1D, Texture2D |
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 tramite CPU o GPU.
L'hardware su cui è in esecuzione l'applicazione avrà almeno una CPU e una GPU. Per selezionare un valore di utilizzo, considerare il tipo di processore necessario per leggere o scrivere sulla risorsa tra le opzioni seguenti.
Resource Usage | Può essere aggiornato da | Frequenza di aggiornamento |
---|---|---|
Predefiniti | GPU | raramente |
Dinamico | CPU | usato di frequente |
Staging | GPU | n/d |
non modificabile | CPU (solo all'ora di creazione della risorsa) | n/d |
L'utilizzo predefinito deve essere riservato a una risorsa che si prevede venga aggiornata raramente dalla CPU (meno di una volta per frame). Idealmente, la CPU non scriverebbe mai direttamente su una risorsa con utilizzo predefinito in modo da evitare potenziali cali di prestazioni.
L'utilizzo dinamico deve essere riservato a una risorsa che la CPU aggiorna relativamente frequentemente (una o più volte per frame). Uno scenario tipico per una risorsa dinamica consiste nel creare index buffer e buffer dei vertici dinamici che vengono riempiti al runtime con dati sulla geometria visibile dal punto di vista dell'utente per ogni frame. Questi buffer vengono usati per eseguire il rendering della sola geometria visibile all'utente per quel frame.
L'utilizzo della gestione temporanea deve essere usato per copiare dati da e verso altre risorse. Uno scenario tipico consiste nel copiare dati in una risorsa con utilizzo predefinito (a cui la CPU non può accedere) a una risorsa con utilizzo della gestione temporanea (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.
Come l'applicazione usa la risorsa | Resource Usage |
---|---|
Caricare una volta e non aggiornare mai | Non modificabile o predefinito |
L'applicazione riempie ripetutamente la risorsa | Dinamico |
Render to texture | Predefiniti |
Accesso della CPU ai dati della GPU | Staging |
Se non si è certi dell'utilizzo da scegliere, iniziare con l'utilizzo predefinito perché è previsto che sia il caso più comune. Uno shader-buffer costante è il tipo di risorsa che deve avere sempre l'utilizzo predefinito.
Associazione di risorse alle fasi della pipeline
Una risorsa può essere associata a più fasi della pipeline contemporaneamente, purché vengano soddisfatte le restrizioni specificate al momento della creazione della risorsa. Queste restrizioni vengono specificate come flag di utilizzo, flag di associazione o flag di accesso CPU. In particolare, una risorsa può essere associata come input e 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 un singolo scopo (non usano più flag di utilizzo, associazione e CPU) produrranno probabilmente prestazioni migliori.
Si consideri, ad esempio, il caso di una destinazione di rendering usata più volte come texture. Disporre di due risorse potrebbe essere più veloce: una destinazione di rendering e una texture usata come risorsa shader. Ogni risorsa usa un solo flag di associazione, che indica "destinazione di rendering" o "risorsa shader". I dati verranno copiati dalla texture della destinazione di rendering alla texture dello shader.
La tecnica in questo esempio può migliorare le prestazioni isolando la scrittura nella destinazione di rendering dalla lettura della texture del shader. L'unico modo è implementare entrambi gli approcci e misurare la differenza nelle prestazioni nell'applicazione specifica.
Argomenti correlati