Il costo pratico degli effetti di scambio


16

Uso XNA per i miei progetti e su quei forum a volte vedo riferimenti al fatto che lo scambio di un effetto per una mesh ha un costo relativamente elevato, il che mi sorprende poiché pensavo di scambiare un effetto era semplicemente un caso di copia del programma shader sostitutivo alla GPU insieme ai parametri appropriati.

Mi chiedevo se qualcuno potesse spiegare esattamente ciò che è costoso in questo processo? E, se possibile, mettere "relativamente" nel contesto?

Ad esempio, dire che volevo usare uno shader corto per aiutare nella raccolta, vorrei:

  1. Cambia l'effetto su ogni oggetto, calcolando un colore unico per identificarlo e fornendolo allo shader.
  2. Disegna tutti gli oggetti su una destinazione di rendering in memoria.
  3. Ottieni il colore dal bersaglio e usalo per cercare l'oggetto selezionato.

Quale parte del tempo totale impiegato per completare tale processo sarebbe trascorso scambiando gli shader? Il mio istinto direbbe che rendere di nuovo la scena, non importa quanto semplice sia lo shader, sarebbe un ordine di grandezza più lento di qualsiasi altra parte del processo, quindi perché tutte le preoccupazioni sugli effetti?

Risposte:


21

Il problema che stai descrivendo non è un problema "speciale". Non c'è nulla di particolarmente lento nel cambiare gli effetti sulla GPU. Il problema con la modifica di effetti, parametri di effetti (comprese trasformazioni), trame, vari stati di rendering e semplicemente invio di più comandi di disegno è che è necessario che un altro batch debba essere inviato alla GPU .

I batch sono associati alla CPU e si ottengono solo poche migliaia * per frame da utilizzare.

Dipende dalla CPU e dall'altro lavoro che stai facendo, ma supponiamo che tu ottenga circa 1000 batch per frame. Se si esegue il rendering di un oggetto per batch, è possibile disegnare circa 1000 oggetti sullo schermo prima di riscontrare problemi.

Se aggiungi improvvisamente il picking e devi renderizzare tutti i tuoi oggetti due volte, allora sei limitato a disegnare solo 500 oggetti.

(Quindi se hai solo un piccolo numero di oggetti, non preoccuparti!)

Per ridurre il numero di batch che stai utilizzando, devi fondamentalmente "essere intelligente" al riguardo. Il metodo prototipico per fare questo è combinare abilmente più oggetti in un singolo batch. In particolare, cercare " instancing ". Forse puoi usare il numero di istanza per assegnare un colore univoco a ciascun oggetto all'interno del tuo shader.

Un'altra tecnica, particolarmente adatta per la raccolta, è quella di abbattere gli oggetti renderizzati nel software in modo da non renderizzare tutto ciò che sai non toccare il pixel selezionato.

Ecco un intero mazzo di diapositive di presentazione di NVidia intitolato "Batch, Batch, Batch: che cosa significa veramente?" (PDF) che ha dei bei grafici e cose che lo spiegano. Elenca anche alcune tecniche per ridurre il conteggio dei lotti.


Concordato! Grazie per la spiegazione e i suggerimenti, ciò che ho letto ha molto più senso ora. Grazie anche per la presentazione NVidia, sto solo leggendo ora ed è molto utile.
sebf,

1
Link aggiornato al documento "Batch, Batch, Batch": ce.u-sys.org/Veranstaltungen/…
Marton

1
Grazie Marton, ho modificato il nuovo link nel post :)
Andrew Russell,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.