Il rendering di una trama dettagliata richiede più tempo?


22

Diciamo che voglio rendere un quadrato; la sua trama è "square.png".

Il rendering del computer è più semplice se la trama è solo di un colore normale?

E che dire se è molto rumoroso trama con colori completamente casuali qua e là?

O cosa succede se quella trama è rumorosa nel senso che ogni pixel in essa è diverso l'uno dall'altro, ma solo di un po '?

Risposte:


39

Come la maggior parte delle cose nello sviluppo del gioco, e specialmente nella grafica del gioco, la risposta è "dipende"

Dimensione della trama

La risoluzione della trama può avere un impatto sulla velocità di rendering. Maggiore è il numero di pixel che contiene, maggiore è il numero di dati non elaborati da caricare sulla GPU e minore è la trama che possiamo inserire nella cache alla volta, quindi lo shader potrebbe fare più pause mentre attende la parte giusta della trama per essere trascinato nella cache.

L'uso del mipmapping può ridurre l'impatto di questo. Con le mipmap, memorizziamo una catena di versioni ridotte della trama, che all'inizio suona come ancora più memoria per schivare. Ma ci permette di leggere dalle versioni più piccole quando la trama viene visualizzata su una piccola dimensione sullo schermo (come un oggetto distante in prospettiva), quindi i nostri campioni fanno un uso migliore della cache delle trame, piuttosto che saltare dappertutto. Ciò riduce anche l'aliasing.

Dettaglio della trama

Il contenuto delle trame non ha alcun impatto sul rendimento dell'efficienza per la maggior parte del tempo.

Un colore è solo un mucchio di numeri per quanto riguarda la GPU, quindi non importa molto quali siano quei numeri, ma li incanala attraverso la sua matematica allo stesso modo. Non fa nulla di speciale come ricordare "Oh, ho già visto un pixel in questo verde prima, riuserò semplicemente lo stesso output che ho calcolato l'ultima volta che ho visto questo input", quindi se la tua texture è tutta di un colore o scintillii casuali, la tua GPU sta facendo lo stesso lavoro.

A differenza dei formati come PNG e JPG, che si comprimono in modo più efficiente in aree prevedibili dell'immagine e consumano più bit in regioni complesse, i formati di trama GPU come BTC, ETC, PVRTC o persino RGBA grezzo utilizzano un numero fisso di bit per blocco di pixel. Quindi rendere la tua trama più o meno dettagliata mantenendo lo stesso formato di compressione non cambierà la sua dimensione dei dati o influenzerà il trasferimento dei dati e l'efficienza relativa alla cache.

Ma se usi un particolare tipo di dettaglio che la tua compressione precedente non conserva bene, potresti essere costretto a cambiare l'intera immagine per usare un formato diverso, che potrebbe cambiare di nuovo la sua dimensione dei dati.

Shader Branching & Indirection

Ecco l'asterisco più grande della situazione: potresti usare questo input di colore per prendere decisioni, come un if()ramo. Qui, i dettagli contano per la velocità.

Le unità di shading GPU funzionano su blocchi di pixel in batch, eseguendo le stesse istruzioni in parallelo su più flussi di dati. Quindi quando alcuni pixel nel blocco prendono un ramo ifdell'altro pixel e l'altro prende l'altro, l'intero batch deve passare attraverso entrambi i rami (mascherando i risultati che non si applicano a un set di pixel o all'altro)

Se l'input cambia in modo uniforme / prevedibile, probabilmente avrai molti blocchi che devono solo prendere un singolo ramo e questi casi di entrambi i rami saranno limitati a bande strette attorno al bordo di transizione. Ma se il tuo input è casuale, ci aspetteremmo che molti blocchi prendano entrambi i rami e rallentino il rendering.

Questo può accadere anche se stai usando una trama per controllare le ricerche in una seconda trama, come una distorsione o una mappa indice. Se la prima trama salta casualmente, campioneremo da punti sparsi e casuali della seconda trama, facendo un uso meno coerente della nostra cache delle trame e aspettando più a lungo per ottenere i dati di cui abbiamo bisogno, in media.


Quindi, nel complesso: no, il contenuto della trama non ha molto impatto sulla velocità di rendering, ad eccezione dei casi in cui lo fa. ;)


Le trame a bassa risoluzione (pensa Minecraft) avrebbero maggiori probabilità di caricare texel per pixel adiacenti nella cache quando un texel particolare viene caricato nella cache, giusto?
user253751

6
@immibis Minecraft ha trame minuscole . Il valore predefinito è solo 16x16, che si adatta così facilmente alla cache delle trame di ciascun core che non è nemmeno divertente: D E sì, la maggior parte dei campioni di trame sarà nello stesso texel, a meno che tu non sia molto lontano dal blocco. Ciò è particolarmente vero se si prende in considerazione la suddivisione dello schermo - se si è ragionevolmente vicini, l'intero batch per un dato core potrebbe essere mappato allo stesso texel: DA GPU più semplice probabilmente funzionerebbe meglio per una trama così a bassa definizione - Sospetto molto sforzo viene sprecato in ottimizzazioni che non aiutano nulla per Minecraft.
Luaan,

1
Nota a margine: "utilizza lo stesso numero di byte per pixel" è in realtà la chiave per alcuni degli hack di velocità che utilizza il codice grafico. Se dovessi provare a usare PNG internamente, o anche qualcosa come UTF-8 con una dimensione di pixel variabile, per arrivare al nth pixel, dovresti passare attraverso ogni singolo pixel prima di esso. Con una larghezza in pixel di byte costante, è solo start_of_buffer + width * n, che è molto più veloce, soprattutto per le grandi n.
Finanzia la causa di Monica il

@Luaan intendo che anche quando sei lontano dal blocco, quando recupera un texel (qualunque sia il primo) dovrebbe anche trascinare alcuni adiacenti nella cache.
user253751

4
È il caso di cui parlo sopra con il mipmapping. Per evitare che i nostri campioni saltino tutto intorno alla trama lasciando grandi spazi vuoti con un riutilizzo della cache minimo o nullo, memorizziamo una versione 512x512 e una versione 256x256 e .... fino a 1x1 a volte. Quindi, quando si disegna la trama 1024x1024 a 16x16, la maggior parte dei giochi leggerà effettivamente dal mip 16x16, e si comporta in modo simile al caso Minecraft 16x16 in termini di efficienza della cache. Ciò riduce anche gli artefatti scintillanti di aliasing dal downsampling.
DMGregory

1

Insieme a DMGregory's all'eccellente risposta di sopra, c'è forse un caso in cui la complessità di una "trama" può influire sulle prestazioni di rendering ed è qui che i risultati di un rendering precedente sono usati come sorgente in una successiva, ad esempio mappe d'ombra / riflessioni / mappe ambientali.

Alcuni hardware moderni possono applicare una compressione senza perdita di dati a questi buffer: ad esempio PowerVR ha PVRIC , AMD, Delta Color Compression e ARM ha qualcosa di simile. Lo scopo di queste tecniche di compressione è ridurre la larghezza di banda complessiva che, a sua volta, può migliorare le prestazioni di rendering.

Più i dati sono semplici, siano essi profondità o colore (intero o virgola mobile), meglio funzioneranno questi schemi. Naturalmente, non suggerirei di semplificare deliberatamente l'output di rendering solo per farli funzionare meglio, ma evitare l'utilizzo di dati rumorosi potrebbe aiutare in alcune circostanze.

Inoltre, fare un campionamento sparso dei buffer di frame / profondità che usano questi schemi, nel vano tentativo di ridurre la larghezza di banda, non aiuterà perché sono molto probabilmente basati su blocchi.

Inoltre potresti trovare queste due domande SE Computer Graphics e le risposte di interesse:

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.