2011-07-13 14 views
5

Sto realizzando un gioco per iOS e Android. Ho visto in molti luoghi che disegnare usando gli indici è più efficiente del semplice disegno di triangoli.glDrawElements vs efficienza glDrawArray

Il fatto è che utilizzo vertici compressi con perdita (come il formato file di md2) e richiede meno degli indici da solo: Array: N * 3 (xyz) * 1 (uchar) + translate (12 byte) + scala (12 byte). Elemento: N * 3 (xyz) * 4 (uint) + Array/~ 10

Sembra che l'array sia una scelta ancora migliore dell'elemento indicizzato e compresso, anche se lo strumento profilatore OpenGL di Apple dice che dovrei usare glDrawElements ..

L'implementazione di OpenGL preferisce l'array indicizzato? o perché l'array indicizzato contiene meno dati rispetto all'array normale non compresso?

p.s. Sto usando OpenGL es 2.0 e il vertex shader è quello che decomprime i vertici.

risposta

1

L'utilizzo di glDrawElements() consente di risparmiare una notevole quantità di memoria ed è possibile specificare gli elementi dell'array in qualsiasi ordine.

Utilizzando glDrawArrays(), tuttavia, l'unica opzione è quella di scorrere in sequenza l'elenco.

Si si deve provare.

3

Si sta utilizzando array Vertex o oggetti Vertex Buffer? Se si utilizzano i Vertex Arrays, è possibile prendere in considerazione l'ipotesi di esaminare glDrawRangeElements anziché glDrawElements.

A meno che tutti i poligoni hanno vertici distinti (abbastanza improbabile), glDrawElements sarà più veloce di glDrawArray perché glDrawElements sarà approfittare del fatto che i ripetuti vertici verranno caricati nella cache gpu, e non dovrà essere caricato di più di una volta per ogni poli di cui quel vertice fa parte. Tuttavia, con glDrawArray, itererà attraverso l'array e non sarà in grado di associare i vertici simili, quindi dovrà caricarli più volte.

Tuttavia, dipende sempre dalla situazione specifica. Prova ad usare un profiler o ottenere un framerate usando ognuno di questi metodi. Non dovrebbe essere troppo difficile passare da uno all'altro. Se uno è chiaramente migliore, usa quello. Se nessuno dei due è straordinariamente migliore, probabilmente non importa troppo.

Ricordate, l'ottimizzazione prematura è la radice di tutto il male. In bocca al lupo! :)