2013-07-07 15 views
8

Per il mese scorso ho lavorato con WebGL e ho scoperto che se creo e disegna un buffer di vertici di grandi dimensioni, questo provoca un FPS basso. Qualcuno sa se è lo stesso se ho usato OpenGL con C++?Prestazioni di WebGL e OpenGL

È un collo di bottiglia con la lingua utilizzata (JavaScript nel caso di WebGL) o la GPU?

WebGL examples like this mostra che è possibile disegnare 150.000 cubi utilizzando un buffer con buone prestazioni, ma qualsiasi cosa di più, ottengo gocce di FPS. Sarebbe lo stesso con OpenGL, o sarebbe in grado di gestire un buffer più grande?

Fondamentalmente, devo prendere una decisione per continuare a utilizzare WebGL e provare a ottimizzare tramite codice o - se mi dici che OpenGL potrebbe funzionare meglio ed è un collo di bottiglia di velocità linguistica, passa a C++ e usa OpenGL.

+0

I fatti qui si siano evoluti. Solo per aggiungere colore alla risposta principale, le operazioni in virgola mobile in Javascript sono 4-10 volte più lente del C++. Tuttavia, dopo aver caricato cose sulla scheda video, WebGL e OpenGL dovrebbero funzionare allo stesso modo. Chrome sembra confermarlo, altri browser sono più lenti. – Atifm

risposta

8

Se si dispone di una sola chiamata drawArrays, non ci dovrebbe essere molta differenza tra OpenGL e WebGL per la chiamata stessa. Tuttavia, la configurazione dei dati in Javascript potrebbe essere molto più lenta, quindi dipende molto dal tuo problema. Se la maggior parte dei tuoi dati è statica (orizzontale, stanze), WebGL potrebbe funzionare bene per te. In caso contrario, la configurazione dei dati in JS potrebbe essere troppo lenta per il tuo scopo. Dipende davvero dal tuo problema.

p.s. Se includi più dettagli di ciò che stai cercando di fare, probabilmente otterrai risposte più dettagliate/specifiche.

0

OpenGL è più flessibile e più ottimizzato grazie alle versioni più recenti dell'API utilizzato. È vero se si dice che OpenGL è più veloce e più capace, ma dipende anche dalle proprie esigenze.

Se è necessaria una mesh cubo con texture, webGL sarebbe sufficiente. Tuttavia, se intendete realizzare progetti su larga scala con molti vertici, effetti di post-elaborazione e diverse tecniche di rendering (e tipo di spostamento, mappatura della parallasse, per-vertice o forse tassellatura) allora OpenGL potrebbe essere una scelta migliore e più saggia.

Ottimizzazione dei buffer per una singola chiamata, l'ottimizzazione dell'aggiornamento di quelli può essere eseguita, ma ha i suoi limiti, ovviamente, e sì, OpenGL avrebbe molto probabilmente un rendimento migliore comunque.

a rispondere, ma non è un linguaggio collo di bottiglia , ma un api-versione-usato uno. WebGL è basato su OpenGL ES, che ha alcuni pro ma anche un po 'più lento e ha più livelli di astrazione per la gestione del codice di OpenGL puro, e questo è il motivo per abbassare le prestazioni - è necessario valutare più codice.

Se il progetto non richiede una soluzione basata sul Web e non si cura dei dispositivi supportati, OpenGL sarebbe una scelta migliore e più intelligente.

Spero che questo aiuti.

+5

Dato che * WebGL * è basato su * OpenGL ES 2.0 * e quindi utilizza già l'API moderna (e presumibilmente più efficiente) utilizzata anche dalle versioni desktop moderne * OpenGL *, direi piuttosto che è l'esatto opposto del API diverse per prestazioni. È molto più probabile che * Javascript * non sia l'opzione migliore per i calcoli in tempo reale. –

+0

In realtà _javascript_ è piuttosto veloce con la matematica e vicino a un codice C compilato. Ho un motore 3D costruito sia in WebGL/OpenGL e devo ancora trovare una differenza notevole. Ho testato una colossale griglia del terreno di circa 256x256 (terreno hfz) sia nelle prestazioni di caricamento/rendering che tra il desktop OpenGL/ES e non c'era davvero alcuna differenza. –

+0

Il problema con javascript è il sovraccarico della chiamata di funzione e lo spostamento dei dati nei buffer (più veloce con matrici tipate/native ma non viene utilizzato abbastanza spesso in js) è MOLTO più elevato in C, quindi il numero di richiami deve essere ridotto al minimo. Una singola mesh è grande, 1000 oggetti vanno bene in C ma non così js. – user1496062

1

Aneddoticamente, ho scritto un gioco basato su tile nei primi anni 2000 utilizzando la vecchia API di stile glVertex() che funzionava perfettamente senza intoppi. Recentemente ho iniziato a portarlo su WebGL e glDrawArrays() e ora sul mio PC moderno che è almeno 10 volte più veloce ottiene prestazioni terribili.

Il motivo sembra essere che stavo fingendo una chiamata glBegin(GL_QUADS); glVertex()*4; glEnd(); utilizzando glDrawArrays(). L'utilizzo di glDrawArrays() per disegnare un poligono è molto più in WebGL rispetto a fare lo stesso con glVertex() in C++.

Non so perché questo sia. Forse è perché javascript è cane lento. Forse è a causa di alcuni problemi di cambio di contesto in javascript. Comunque posso fare solo circa 500 chiamate a un poligono glDrawArray() mentre ancora ottengo 60 FPS.

Ognuno sembra aggirare il problema facendo quanto più possibile sulla GPU e facendo il minor numero possibile di chiamate glDrawArray() per frame. Se puoi farlo dipende da ciò che stai cercando di disegnare. Nell'esempio dei cubi che hai collegato loro possono fare di tutto il sulla GPU, incluso lo spostamento dei cubi, motivo per cui è veloce. Essenzialmente hanno imbrogliato - in genere le app WebGL non saranno così.

Google ha avuto un colloquio in cui hanno spiegato questa tecnica (anche irrealisticamente calcolano il movimento oggetto sulla GPU): https://www.youtube.com/watch?v=rfQ8rKGTVlg

+0

Ciao, il motivo per cui vedi è perché glDrawArray è MOLTO più complicato di glBegin. Devi pagare una somma statica ogni volta che la chiami, il che è piuttosto alto. Quello che dovresti fare è di bufferizzare tutti i poligoni in un unico VAO in modo da poter usare solo un glDrawArray. Più poligoni si hanno, maggiore è la distanza di velocità tra glDraArray e il vecchio gl immediate, e in una scena tipica composta da milioni di poligoni, si vedranno aumenti esponenziali di velocità. – user3427457

+0

Sì, questo è quello che ho fatto. Sfortunatamente lo streaming su un VBO è anche piuttosto lento - almeno sembra più lento di quanto mi ricordi dell'essere 'glBegin()'. Se puoi evitare lo streaming, è molto veloce, ma dipende dall'applicazione. – Timmmm