2011-09-14 6 views
6

Sto scrivendo un'applicazione WebGL che genera algoritmicamente la geometria. La geometria sarà composta da 4-150 oggetti, ciascuno composto da qualche parte tra 16 e 2048 punti, disegnato come TRIANGLE_STRIP tramite drawElements. La geometria sarà statica per la maggior parte dei fotogrammi, ma dovrà essere animata in risposta all'input dell'utente. In questi frame quando la geometria viene aggiornata, points/tris può essere aggiunto o rimosso. Gli oggetti dovranno anche essere aggiunti/rimossi nel corso della vita del programma.Allocazione VBO efficiente in WebGL

Qual è il modo più efficiente di allocare/aggiornare VBO in questo contesto? Sono abbastanza sicuro che dovrei usare DYNAMIC_DRAW e bufferSubData per aggiornare ogni oggetto, ma voglio sovra-allocare alcuni enormi VBO (assumendo il caso peggiore in termini di punti per oggetto) e definire ogni oggetto come un offset (numero oggetto * dimensione massima per oggetto) e quindi molta memoria VBO non utilizzata allocata nel migliore dei casi? O c'è un altro approccio che dovrei provare? O è abbastanza piccolo in termini di impronta di memoria che sto pensando troppo?

risposta

8

Qual è il modo più efficiente di allocare/aggiornare VBO in questo contesto? Sono abbastanza sicuro che dovrei usare DYNAMIC_DRAW e bufferSubData per aggiornare ogni oggetto.

Questa è davvero la strada da percorrere. In realtà si desidera utilizzare il doppio o anche il triplo buffering per i propri oggetti, ovvero avere un VBO vincolato per il disegno, mentre si aggiornano i contenuti dell'altro con i nuovi dati. Dopo glMapBuffer è possibile accedere alla mappa della memoria da tutti i thread del processo, in modo che sia possibile avere un thread di lavoro che aggiorna il buffer del vertice "indietro", mentre il thread di rendering è occupato nel disegnare il frame corrente.

O è abbastanza piccolo in termini di impronta di memoria che sto pensando troppo?

Hai valutato la peggiore impronta di memoria che hai a che fare? Dati i tuoi numeri, scommetto che sarà inferiore a 16MiB (150 oggetti * 2048 punti * 3 galleggianti a doppia precisione per punto * 8 byte per doppio = 7.4 MiB, solo 3.7MiB se vengono utilizzati galleggianti a precisione singola). Confronta questo con le diverse centinaia di schede grafiche moderne di MiB di RAM (la mia GeForce 8800GTX 2006 ha 768MiB RAM e la mia Radeon HD6570 ha 1024MiB (= 1GiB).