2010-11-03 9 views
14

Ho molte particelle con i vertici che cambiano ogni fotogramma. I vertici sono attualmente disegnati usando un array di vertici nella memoria "client". Quali caratteristiche di prestazione posso aspettarmi se utilizzo un oggetto buffer vertice?L'utilizzo di Vertex Buffer Object per dati molto dinamici è una buona idea per quanto riguarda le prestazioni?

Dal momento che devo usare un numero di glBuffersubData per aggiornare i vertici delle particelle, sto quindi trasferendo i vertici alla memoria video ogni fotogramma in ogni caso a destra (come vorrei se usassi un normale array di vertici)? C'è qualche vantaggio per VBO in questo caso?

Questo è per dispositivi iOS. La vera chiamata di disegno: glDrawElements (GL_POINTS, num_particles, GL_UNSIGNED_SHORT, pindices);

Devo usare GL_STREAM_DRAW o GL_DYNAMIC_DRAW?

risposta

1

Impostando VBO in modo corretto, si utilizza il modo ottimale di trasferire i dati sulla GPU. In tal modo, è possibile saltare l'elaborazione del driver. L'unico modo per vedere quanto ottieni di miglioramento è misurare. È diverso da una carta all'altra.

Per VBO how-to, vedere questo: VBO tutorial

EDIT dimenticato di rispondere alla domanda: sì, è una buona idea. Ma prima misura.

+0

Non penso sia vero che i VBO siano sempre ottimali, il sovraccarico causato da numerosi BufferSubDatas o ancor peggio mapBuffer (perché deve copiare il buffer sul client) potrebbe essere peggio del sovraccarico degli array di vertici. E 'vero che merita davvero un test approfondito per videocard per sapere con certezza, sto solo vedendo se riesco a trarre dalla conoscenza delle folle ... dal momento che non vale la pena di test nel mio caso a questo punto. –

4

Apple's documentation sembra raccomandare VBO in tutte le situazioni. Se si utilizza ES 2.x, il tipo di buffer vertice GL_STREAM_DRAW è esplicitamente per "quando l'applicazione deve creare una geometria temporanea che viene sottoposta a rendering un numero limitato di volte e quindi scartata. Ciò è particolarmente utile quando l'applicazione deve cambiare dinamicamente il vertice dati ogni fotogramma in un modo che non può essere eseguito in un vertex shader. " L'uso di glBufferSubData viene quindi sostenuto direttamente.

Logicamente, suppongo che l'unica differenza tra fornire i dati completamente di nuovo e inviarli a un GL_STREAM_DRAW o GL_DYNAMIC_DRAW esistente è che il tuo spazio nella mappa di memoria (GPU o CPU, a seconda del chip - MBX in realtà non i VBO ma Apple li supporta per altri motivi di prestazioni) possono essere allocati una volta anziché allocati e rilasciati ogni frame.

L'utilizzo dei suggerimenti di allineamento e imballaggio forniti in tale documento è in grado di fornire un miglioramento migliore rispetto a un passaggio a VBO, poiché altrimenti la CPU deve solo decomprimere e riordinare i dati su glDrawElements. Anche se molto probabilmente lo sapete già, e apprezzo che non faccia direttamente parte della domanda - la prendo principalmente come ipotesi comparativa sui benefici delle prestazioni.

+0

Ciò che la CPU deve fare dipende dal chip grafico e dal driver. L'allineamento non ha nulla a che fare con le esibizioni. Il tipo di dati non funziona, ed è il driver che esegue il repacking. Il punto è utilizzare i tipi che i tipi di dati interni nel chip grafico, e quindi il driver non ha nulla da fare. –

+0

Al contrario, la documentazione di Apple, come collegata alla mia risposta, afferma esplicitamente "I dati non allineati richiedono un'elaborazione significativamente maggiore, in particolare quando l'applicazione utilizza i buffer dei vertici". Vedi l'ultima frase. Supponendo che tu sia un membro di ADC, vedi anche ad es. https://devforums.apple.com/message/320610#320610, che è un dipendente Apple che spiega nuovamente i vantaggi di velocità dell'allineamento.I controller di memoria spesso leggono valori non allineati leggendo due valori vicini e combinando i risultati, quindi una lettura costa due recuperi di memoria anziché uno. – Tommy

+0

Ok, non ho idea di iphone e non ero a conoscenza della domanda. La mia risposta è generale per opengl (per PC). –

Problemi correlati