Budget dei modelli 3D. Ciò che conta più numero di triangoli o vertici


12

Quando realizzo un modello per un gioco 3D, cosa devo prendere come misura nei miei poligoni (triangoli) o vertici del mio budget? Ho fatto un esperimento con due set di 40000 cubi uno con 8 vertici e 12 triangoli, un altro con 24 vertici e 12 triangoli. Tutto è stato fatto in Unity ed entrambi sono stati generati proceduralmente. Con mia sorpresa, entrambi i set si sono comportati quasi allo stesso modo, c'era una differenza molto piccola tra loro.

Vuol dire che non dovrei preoccuparmi del conteggio dei vertici e guardare solo il conteggio dei triangoli?

EDIT: ho fatto un altro esperimento, ho creato un piano con 19602 triangoli e 10000 vertici e un altro con lo stesso ammontare di tirangles ma 39204 vertici. Ho generato 4000 di entrambi. Ora meno vertici hanno vinto da 14 fps a 19 fps. Quindi immagino che generalmente meno sia meglio, ma solo in grandi differenze.


9
Scrivi il tuo gioco e risolvi i problemi non appena si presentano. Questo tipo di problema potrebbe non sorgere mai e stai sprecando il tuo tempo: P
Vaillancourt

Risposte:


16

Immaginiamo una grande griglia, come quella che potremmo usare per il terreno. Ne tratteremo i ntriangoli, coprendo per esempio metà del nostro schermo a 1080p, in una singola chiamata di disegno.

Se saldiamo tutti i nostri vertici e non abbiamo cuciture di smussatura / texturizzazione, ogni triangolo ha 3 vertici e ogni vertice è condiviso da 6 triangoli, quindi abbiamo n/2vertici.

Per renderlo dobbiamo:

  • Esegui lo shader di vertice almeno n/2volte

    ("almeno" perché la nostra cache per i risultati dei vertici è solo così grande. A volte finiremo per sfrattare un vertice che abbiamo già trasformato, quindi ne avremo bisogno di nuovo per un triangolo successivo che lo condivide e quindi rieseguire lo shader di vertice su di esso Quindi non otteniamo molti risparmi come sembra sulla carta)

  • nTriangoli con clip e taglio .

  • Rasterizza e interpola su almeno 1920x1080 / 2 o circa 1 milione di pixel del frame buffer (poiché abbiamo detto che il nostro terreno copre circa metà dello schermo).

    ("almeno" a causa del modo in cui le GPU funzionano su quadretti di pixel , alcuni frammenti appena fuori dai bordi dei poligoni vengono comunque rasterizzati ma poi mascherati, il che significa che elaboriamo i frammenti due volte. Per una mesh irregolare, inoltre, dovremo sovraccaricare ovunque la mesh si occlude, se non siamo abbastanza fortunati da disegnare prima il poligono più in alto nel buffer di profondità)

  • Esegui lo shader di frammenti per tutti quei> = 1 milione di frammenti.

  • Miscela ~ 1 milione di risultati nei frame e buffer di profondità.

Bene, ora sleghiamo tutti i nostri vertici, quindi ora abbiamo i 3nvertici da renderizzare, sei volte più di prima! I nostri passi sono ...

  • Eseguire i 3ntempi di shader vertici .

    (Nessun asterisco a causa della memorizzazione nella cache poiché ogni vertice viene utilizzato solo una volta, anche se ciò significa che la cache non può salvarci in qualsiasi momento)

  • nTriangoli con clip e taglio .

  • Rasterizza e interpola su almeno 1920x1080 / 2 o circa 1 milione di pixel del frame buffer.

  • Esegui lo shader di frammenti per tutti quei> = 1 milione di frammenti.

  • Miscela ~ 1 milione di risultati nei frame e buffer di profondità.

... aspetta, ogni passo tranne il primo è lo stesso! Quindi la maggior parte del lavoro svolto dalla GPU in una tipica chiamata di disegno non è direttamente correlato al numero di vertici utilizzati. La quantità di copertura dello schermo, il sovraccarico e il conteggio totale dei triangoli rappresentano molto di più del costo.

Ciò non significa che i vertici siano completamente gratuiti. Se condividi vertici quando puoi puoi ottenere alcuni modesti risparmi dalla cache, specialmente se i tuoi shader di vertici sono complicati o la pipeline di vertici del tuo hardware è debole (come nel caso di alcune console meno recenti). Ma dato che le tracce di conteggio dei vertici proporzionali al conteggio dei triangoli più o meno un fattore costante, di solito non è così interessante una metrica del costo complessivo della mesh.


Che dire del costo di invio di quei vertici alla memoria?
Michał Leszczyński,

7
A meno che non modifichi il buffer dei vertici ogni frame, paghi una volta il costo di caricamento. Le trame e il frame buffer sono probabilmente i porci più grandi della memoria video e della larghezza di banda all'interno di un determinato frame. Significa comunque che i vertici non sono certamente gratuiti, ed è meglio condividerli quando è pratico, ma i vertici non condivisi raramente saranno la ragione per cui un gioco si comporta male.
DMGregory

Aggiungerò a questo, mentre sto facendo foreste ecc. Nel mio gioco. Quando ho iniziato, inizialmente utilizzavo le chiamate di disegno (utilizzo il mio motore, questo potrebbe non allinearsi completamente con la tua domanda) per disegnare solo modelli con verts, questo di per sé era ok, le prestazioni andavano bene. Ma quando ho iniziato a utilizzare l'indicizzazione, ho ottenuto un miglioramento delle prestazioni perché alcuni verts erano condivisi e così memorizzati nella cache, quindi alcuni calcoli non sono stati eseguiti due volte. Qual è la linea di fondo, che il test grezzo dei soli verts non è il miglior indicatore verts vs tri count. La tua pipeline può essere influenzata da troppi di entrambi. Come altre risposte alludono a.
ErnieDingo,

2

Né.

A meno che tu non stia parlando di un numero davvero enorme di tris (milioni), quello che ti interessa è:

  • Numero di pixel renderizzati
  • Costo dello shader di frammenti
  • Numero di chiamate di pareggio (con il limite fortemente dipendente dal dispositivo).

24 vertici per 4000 cubi dà 96'000 vertici.

640x380 pixel fornisce frammenti di 243'200 e la maggior parte dei dispositivi supporta risoluzioni considerevolmente più grandi.

Puoi rieseguire l'esperimento con 1'000'000 cubi, raggruppati per evitare il collo di bottiglia della chiamata di disegno (1 modello singolo per 1'000 cubi).


2
Questo dipende molto dalla scena e da come stai eseguendo il rendering. Se si dispone di una scena che presenta un relativamente piccolo sovraccarico, l'elaborazione dei vertici può sicuramente dominare la tua performance. Inoltre, il numero di chiamate di estrazione non è il problema (per alcune API) tanto quanto lo stato cambia tra le chiamate di estrazione.
Nicol Bolas,

1

Vale la pena notare che se si sta eseguendo un'applicazione WebGL, il conteggio dei vertici diventa rapidamente un collo di bottiglia in termini di dimensioni del file che gli utenti possono scaricare. Stesso numero di triangoli ma spesso 2-3 volte più vertici di quanto mostrato nel software DCC. Una migliore scartatura può aiutare molto in questo caso avendo meno cuciture.

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.