2013-02-14 15 views
11

Lavoro con OpenGL4.X. Recentemente ho letto this Apple OpenGLES2 doc dove si afferma che l'utilizzo di array di attributi interleaved migliora le prestazioni sui dispositivi mobili IOS ed è il modo consigliato (invece di usando blocchi di attributi).Guadagno di prestazioni usando array di attributi interleaved in OpenGL4.0

Per coloro che non hanno capito quello che voglio dire qui è un esempio:

blocco di attributi in una sola matrice di attributi:

float vertices[]{ 
//Triangle vertices: 

    v0x , v0y , v0z , 
    v1x , v1y , v1z , 
    v2x , v2y , v2z , 

    //Triangle UVs: 

    uv0s , uv0t , 
    uv1s , uv1t , 
    uv2s , uv2t , 

    //Triangle Normals: 
    n0x , n0y , n0z , 
    n1x , n1y , n1z , 
    n2x , n2y , n2z 

} 

Interleaved attributo matrice:

float vertices[]{ 


    v0x , v0y , v0z , 
    uv0s , uv0t ,   ////vertex 1 attributes 
    n0x , n0y , n0z , 

    v1x , v1y , v1z , 
    uv1s , uv1t ,   ///vertex 2 attributes 
    n1x , n1y , n1z , 

    v2x , v2y , v2z , 
    uv2s , uv2t ,   ///vertex 3 attributes 
    n2x , n2y , n2z 

} 

Quindi la mia domanda è: è vero anche per OpenGL in esecuzione su des GPU ktop? Se sì, allora quanto può essere teoricamente il guadagno in termini di prestazioni?

+0

possibile duplicato di [In che modo l'invio di vertici interleaved aiuta le prestazioni?] (Http://stackoverflow.com/questions/14535413/how-does-interleaved-vertex-submission-help-performance) – legends2k

risposta

6

È anche vero per OpenGL in esecuzione su GPU desktop?

Da Vertex specification wiki page:

Come regola generale, è consigliabile utilizzare gli attributi interlacciati, ove possibile. Ovviamente se hai bisogno di cambiare determinati attributi e non altri, interleaving quelli che cambiano con quelli che non lo sono non è una buona idea.


quanto grande sia il guadagno di prestazioni può essere teoricamente?

Non posso davvero rispondere, ma non mi aspetto grandi miglioramenti. L'unico modo sicuro è misurare.

+0

+1 per il Wiki ref. Mi dimentico sempre della sua esistenza! –

4

Il vantaggio degli array di attributi interlacciati è la località di memoria. Ciò significa che tutti i dati dei vertici necessari sono collocati l'uno accanto all'altro e potrebbero essere recuperati in modo più efficiente rispetto ai dati presenti in più buffer.

Avere grande numero di vertici con molti attributi potrebbe manifestarsi la differenza in termini di prestazioni. I valori di big e molti devono essere stabiliti mediante il profiling.

+0

Questo è quello che ho letto anch'io ma quanto aggiunge alla performance nella realtà? Questa è la domanda. –

+0

@MichaelIV * "In realtà" *? - Dipende da un milione di cose diverse. Che hardware? Quale autista? Quanti attributi? Quanti vertici? Devi modificare determinati attributi in modo dinamico? Se sì, come pesare le penalità nell'aggiornamento contro le penalità nel rendering? Cos'altro stai facendo nella tua pipeline, è anche legato alla larghezza di banda? - Davvero, vuoi sentire i numeri o cosa? –

+0

Penso che potresti aggiungere qualcosa di simile come risposta :) –

4

Affinché qualsiasi ottimizzazione per essere un guadagno di prestazioni, occorre anzitutto ottimizzare qualcosa che è una performance collo di bottiglia. A meno che non sia attualmente un collo di bottiglia, fare qualcosa al riguardo non migliorerà necessariamente le prestazioni.

Non c'è modo di rispondere alla tua domanda perché qualsiasi guadagno di prestazioni dipende prima se si è colto il collo di bottiglia dalle prestazioni di trasferimento dei vertici (cioè: cosa ottimizza). A meno che non stiate spingendo la vostra scheda grafica così forte che il vertex shader, il framment shader ei problemi della CPU non diventano colli di bottiglia, questo non avrà importanza.

E non c'è modo di sapere quanto di un guadagno che è, perché l'hardware diverso risponderà in modo diverso. Diverse situazioni risponderanno in modo diverso in base alla gravità del collo di bottiglia.

Basta intercalare i tuoi attributi. Non ti costa nulla, richiede un tempo o uno sforzo minimo e può essere di valore non banale in termini di prestazioni.

+0

Sì, capisco, ma il fatto che si continui a suggerire di utilizzare l'interleaving di default probabilmente significa che è l'opzione migliore nella maggior parte dei casi. –

1

Potrei sbagliarmi, ma la mia percezione è che la GPU ha bisogno dei dati (vertici, normali e mappe UV) quando il rendering dire un vertice di un triangolo e se il buffer per i vertici, normali, e uvmaps è grande per un oggetto es una grande sfera (reso con glVertex non glsphere) ...

La GPU deve andare avanti e indietro per i vertici, normali, e uvmaps durante il rendering di un piccolo rettangolo, perché non in grado di memorizzare tutti coloro che in un buffer interno si.

Comunicazione tramite bus è generalmente inferiore alla velocità del processore.

Ora, in questo caso array interfogliati sono un ottimo un guadagno e ridurre comunicazione bus e la GPU può facilmente elaborare campi intercalati e avranno tutti i dati disponibili per un insieme particuler di vertici essendo resi.

Problemi correlati