Risposta breve:
Usa glMapBufferRange e aggiornare solo il subrange che necessita di una modifica.
Risposta lunga:
Il trucco è quello di mappare il buffer già esistente con glMapBufferRange, e quindi mappare solo l'intervallo si ha bisogno. Alla luce di questi presupposti:
- la geometria utilizza per-vertex animation morphing
- Il conteggio dei vertici per i modelli è costante durante l'animazione.
quindi è possibile utilizzare glMapBufferRange per aggiornare solo le parti che cambiano, e lasciare il resto dei dati da soli. Caricamenti completi utilizzando glBufferData sono lenti come una tartaruga, perché eliminano il vecchio archivio di memoria e ne assegnano uno nuovo. Questo è oltre al caricamento dei nuovi dati. glMapBufferRange consente solo di leggere/scrivere dati esistenti, non ha alcuna allocazione o deallocazione.
Tuttavia, se si utilizza l'animazione dello scheletro, piuttosto passare le trasformazioni del vertice come matrici 4x4 per-vertice allo shader del vertice e fare i calcoli lì. I dati per vertice sono ovviamente specificati con glVertexAttribPointer.
Inoltre, si ricorda che è possibile leggere i dati di trama nel vertex shader e che OpenGL 3.1 ha introdotto alcune nuove chiamate di richiamo dell'istanza; glDrawArraysInstanced e glDrawElementsInstanced. Quelli combinati possono essere usati per ricerche specifiche dell'istanza. È possibile eseguire istanze per disegnare chiamate con gli stessi dati geometrici rilegati, ma inviare posizioni o qualsiasi dato per-vertice di cui avete bisogno come trame o array di texture. Questo può farti risparmiare dal mixare e abbinare diversi set di dati di array di vertici.
Immaginate se volete eseguire il rendering di 100 istanze dello stesso modello, ma con posizioni o combinazioni di colori differenti. O persino mappe di texture.
fonte
2009-11-14 00:31:45
+1 per riconoscere il batching come il più grande problema con la codifica grafica in questi giorni. 1 richiamo per Mhz mi sembra ottimistico dopo qualche codifica di OpenGL ES per iPhone - Ho trovato che sono limitato a 30-40 lotti per mantenere un framerate decente! – tsalter
Ok, avrei dovuto aggiungere che questa regola potrebbe non essere applicabile direttamente ai dispositivi mobili. L'ho visto per la prima volta su alcune diapositive GDC alcuni anni fa e mi è servito molto bene sui PC Windows. –
Btw, ho appena trovato le diapositive qui: http://ati.amd.com/developer/gdc/D3DTutorial3_Pipeline_Performance.pdf (principalmente D3D9, OpenGL a pagina 28) –