OpenGL immediate mode vs VertexArrays
Übersicht

PhillipKBetreff: OpenGL immediate mode vs VertexArrays |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Heyho!
Ich musste grade mit erschrecken feststellen, das mein immedate mode enorm schneller ist, wie ein VertexArray. Hierzu hege ich die vermutung, das vertexarrays / vbos sich erst ab einer gewissen anzahl an vertices lohnen. Kann mir da jemand etwas konkreter auf die sprünge helfen? Hier mal die beiden gemessenen zeiten: Zirka 1000 Quads: immediate : 160fps DrawArray : 100fps 0 Quads: immediate : 400fps + DrawArray : 100fps Es sei angemerkt, das meine immediate version immer dann eintritt, wenn eine änderung stattfand (oder ich den entsprechenden debugknopf drücke), dieser stellt direkt diverse werte ein, baut sogar noch die arrays. Trotzdem, immens schneller. Habe ich einfach nur irgendwo mist gebaut, oder ist das ein "normales" verhalten, bei so geringen Quad-zahlen? Ps: die 1000 quads sind auf etwa 10 unterarrays aufgeteilt, die ich einzeln zeichne. |
||
![]() |
BtbN |
![]() Antworten mit Zitat ![]() |
---|---|---|
Auf 100 FPS begrenzt vllt.?
Oder die arrays jeden frame neu erstellt und befüllt? |
||
PhillipK |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Nein, die fps grenze liegt debugmäßig bei 200. Solange ich die annähern kann, ist das map zeichnen in ordnung *g*
Das mit dem neu erstellen und füllen isses ja: Beim bwegen etc wird ein Array update aufgerufen. Das ganze kann ich per KEY_SPACE erzwingen, dh folgendes: Alle kacheln abgehen Sichtbarkeit überprüfen (2ter array) Alle sichtbaren kacheln sammeln und zeichnen --- Alle gesammelten kacheln als array generieren "update" auf 0 setzen. -> Wenn update =0, wird der vertex array gezeichnet. update = 1 oder KEY_SPACE = oben beschriebener vorgang Update=0 fall: 100fps Update=1 fall: schwankend, 120 bis 170fps. Hab testweise das ganze rausgenommen und nur den glBegin-krams drin -> es ist einfach schneller. Ich verstehe das nicht wirklich - wie kann das sein ![]() (nagut, dochnochmal das arrayzeichnen durchforsten - wenn ich da irgendwo waitTimer - warum auch immer - eingebaut habe, begehe ich selbstmord -.-) edit: Nein, keinerlei begrenzung. Hier mal das DrawArray-stückel: BlitzMax: [AUSKLAPPEN] Method RenderArray(map:TLandscape) RecieveGLError ist eine kleine debugfunktion, die mir den entsprechenden Error mit zusatz printet, damit ich ewaigte fehler besser nachvollziehen kann. Alles in allem sind das ingsamt grademal ein tausendenstel der pointerzugriffe auf gleiche arrays etc, wie beim anderen modus. Also muss es in irgendeiner form am glDrawArrays liegen :/ |
||
![]() |
Noobody |
![]() Antworten mit Zitat ![]() |
---|---|---|
Nun, du hast bei jedem Quad einen Aufruf an glBindTexture, glVertexPointer, glTexCoordPointer und glDrawArrays drin, d.h. wenn du deine 1000 Quads zeichnest, machst du tatsächlich 1000 Zeichenaufrufe plus State-Changes. Das heisst, dein Array enthält 4 Vertices und du zeichnest 1000 Stück davon.
Kannst du verstehen, warum das langsam ist? ![]() Was du tun solltest, ist, alle deine 1000 Quads in ein VertexArray mit Platz für 4000 Vertices zu schreiben, und mit einem Zeichenaufruf zu zeichnen. Wenn du mehrere Texturen benötigst, machst du für jede Textur ein neues Array mit separatem Zeichenaufruf (oder aber, da wir von einer Tilemap sprechen, packst du die einzelnen kleinen Texturen auf eine grosse und änderst stattdessen die Texturkoordinaten entsprechend). Es ist wahr, dass VertexArrays erst ab einer gewissen Anzahl Vertices einen Geschwindigkeitsvorteil haben, und mit 4 Vertices auf ein paar tausend Zeichenaufrufe ist halt der Overhead grösser. |
||
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun |
PhillipK |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hm ne nicht ganz so einfach ![]() Meine map ist momentan unterteilt: Pro Y ebene ein unterarray, pro Textur ein unterarray. Im normalfall fallen da pro y ebene etwa 150 quads pro ebene an, welche sich auf blöcke beziehen, und ein paar (vllt 15 quads) für andere Texturen. Momentchen, es war dumm einfach den code zu pasten. Ich kommentiere mal ein wenig :/ BlitzMax: [AUSKLAPPEN] Method RenderArray(map:TLandscape) Hierzu nocheinmal das array erstellen, damit du mir glaubst ![]() BlitzMax: [AUSKLAPPEN] Method buildArray(blocks:TDRawTest[][][]) Nungut, entweder bin ich nun völlig bescheuert, oder noo hat sich zum ersten mal geirrt! *feier* (aber das ist leider meine schuld, weil der code schwer zu lesen ist (i, j, wer weiß schon was das ist? *g*)) Genau sagen, wieviele Vertices pro höhenstufe und Texturzeugs vorhanden sind, kann ich leider nicht. Ich weiß nur vom Direkten zeichnen, das immer etwa 1000 quads gezeichnet werden. Nun, dann mal eben anders gefragt: wie kann ich bestimmen, wieviel overhead bei was zustande kommt? Die bedeutung kann ich mir nur vage übersetzen. Allerdings: Ausgehend davon, ab wieviel vertices lohnt ein Vertexarray? Gibts da eine pi*auge zahl oder ist das reine glückssache, vom ganzen krams drumrum? |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group