Registriert: Di Apr 29, 2008 18:56 Beiträge: 1213
Programmiersprache: Delphi/FPC
HI,
ich hab mir gestern ne kleine Engine geschrieben, mit der ich Objekte laden kann. Und um diese Objekte dann zu Zeichnen benutz ich GL_TRIANGLES. Im einem Tutorial stand aber mal das man auf Performance-Gründen bei einem Viereck lieber GL_QUADS nehmen soll. Deshalb wollt ich ma fragen wie groß der Performance-Verlust ist und ob es sich vlt. lohnt irgendwie zu überprüfen, ob es ein Quad oder einene Triangle ist?
Registriert: Mo Jan 31, 2005 11:02 Beiträge: 432 Wohnort: Rheinlandpfalz
Da Quads intern eh in Dreiecke unterteilt werden, kannst du ruhig nur Triangles verwenden.
Außerdem wird es für deine Engine leichter, wenn du dich nur um Triangles kümmern musst.
Das mit den Performance Gründen bei einem Viereck GL_QUADS zu verwenden, kann ich mir nur dadurch erklären,
dass bei GL_TRIANGLES mehr Vertices und evtl. Normalen etc. übertragen (an die GraKa gesendet) werden müssen.
Solange du einen Indexbuffer verwendest dürfte der Unterschied recht klein sein. Ich nehme Quads hauptsächlich für Billboards, Partikelsysteme etc. Für einen Mesh würde ich immer indexbuffer+vertexbuffer+GL_TRIANGLES nehmen.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Benutzt du überhaupt so etwas wie ein VertexBufferObject? Denn das was the-winner gesagt hatte bezieht sich darauf.
Im imediate Modus liegt der Unterschied zwischen quad und triangle aber dort, da du bei einem Quad 4 Vertices übertragen musst und bei 2 Dreiecken 6 übertragen musst. Und bei den 6 sind 2 vermutlich sogar doppelt. Und dann sollte man das ganze mal auf CPU Ebene betrachten. Bei glVertex3f hast du 3 Single Werte die übertragen werden müssen. Diese müssen auf den Stack gepackt werden und von OpenGL wieder vom Stack gelesen werden. Wenn du 50% Aufrufe mehr hast dauert das schlicht länger. Dafür gibt es auch glVertex3fv. Dort wird nur ein Pointer auf ein "array[0..2] of single" übergeben. Das spart Zeit bei der Übergabe. Aber auch nur, wenn du das Array nicht jedes mal erst zusammenbauen musst.
Bei einem VBO hingegen fällt noch ein anderer Ansatz mit rein. Du hast einen Buffer wo deine Vertices abgelegt sind und einen mit Indizes. Die geben dann an in welcher Reihenfolge die Vertices benutzt werden sollen. Grafikkarte haben intern wohl einen kleinen Cache für die letzten Vertices. Wenn du jetzt also mit einem VBO (inklusive index) arbeitest und den vertex2 3x benötigst, dann kann es sein, dass der noch in dem Cache ist und somit die GPU nicht noch einmal auf Speicher zugreifen muss. Der Cache ist allerdings nicht so wirklich groß. Glaube nur so was um die letzten 20 Vertices.
Aber um mein ganzes geschriebenes etwas überflüssig zu machen. Wenn du reichlich Vertices hast, dann kommst du um ein VBO sowieso kaum umher und da denke ich macht es kaum einen Unterschied (das weiß ich aber nicht 100%ig). Aber selbst im imediate mode. Wenn du nur so ein paar hundert Flächen hast, dann spielt das vermutlich keine wirklich ausschlaggebende Rolle. Ich denke da werden dann andere Stellen weit mehr bremsen.
Registriert: Di Apr 29, 2008 18:56 Beiträge: 1213
Programmiersprache: Delphi/FPC
Ah, danke für die Antworten.
Ich hab die Triangles und Vertecs ja sowieso in im Speicher abgelegt, jetzt muss ich bloß mien record zum array umbauen, dann kann ich glech das array übergeben. Sowas wie Frame Buffer Objekte hab ich noch nich eingebaut. Erstma alles nur so...zum Test.
Mitglieder in diesem Forum: 0 Mitglieder und 5 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.