OpenGL ist es besser, batch ziehen oder statische VBOs
Was vorzuziehen ist, von einer effiency point of view (oder einer anderen Sicht, wenn es wichtig ist) ?
Situation
Eine OpenGL-Anwendung, zieht viele Linien an verschiedenen Positionen jedes frame (60 fps). Sagen wir es gibt 10 Zeilen. Oder 100 000 Zeilen. Wäre die Antwort anders sein?
- #1 ein statisches VBO, die sich nie ändert, mit 2 vertices einer Linie
Jedem Bild hätte man glDrawArrays Anruf pro Linie zu zeichnen, und dazwischen gäbe es matrix-Transformationen, die unsere position eine Zeile
- #2 Update der VBO mit den Daten für alle Linien alle Rahmen
Jedem Bild einen einzigen draw call
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zweiten ist unglaublich effizienter.
Ändern der Mitgliedstaaten, insbesondere die transformation und Matrizen, neigt dazu, die Neuberechnung von anderen Staaten und im Allgemeinen mehr Mathematik.
Aktualisierung der geometrie, jedoch ganz einfach durch überschreiben eines Puffers.
Mit modernen video-hardware auf ziemlich massive Bandbreite Busse, senden ein paar schwebt über trivial ist. Sie sind entworfen für das bewegen Tonnen von Daten schnell, es ist ein Nebeneffekt der Arbeit. Aktualisierung der vertex-buffer ist genau das, was Sie tun, oft und schnell. Wenn wir assum Punkte von 32 bytes, die jede (float4 position und Farbe), 100000-line-Segmente, die weniger als 6 MB und PCIe-2.0-x16-ist etwa 8 GB/s, glaube ich.
In einigen Fällen, je nachdem, wie der Treiber oder die Karte, die Griffe verwandelt, die änderung kann dazu führen, dass einige matrix-Multiplikation und neu berechnen der anderen Werte, einschließlich Transformationen, culling und clipping-Ebenen, etc. Dies ist nicht ein problem, wenn Sie den Zustand ändern, ziehen Sie ein paar tausend polys, und wiederholen Sie, aber wenn sich der Zustand ändert sich oft, Sie haben erhebliche Kosten.
Ein gutes Beispiel dafür ist vorher gelöst, ist das Konzept der Dosierung, die Minimierung der Zustand ändert, so dass mehr geometrie gezeichnet werden können, zwischen Ihnen. Diese wird verwendet, um effizienter zu ziehen große Mengen von geometrie.
Als ein sehr deutliches Beispiel, betrachten Sie im besten Fall für #1: transformationssatz löst keine zusätzliche Berechnung und die Treiber-Puffer eifrig und perfekt. Zeichnen 100000 Zeilen, die Sie brauchen:
Den Funktionsaufruf-overhead allein wird töten Leistung.
Auf der anderen Seite, die Dosierung betrifft:
Tun Sie kopieren Daten mehr, aber es gibt eine gute chance, den VBO Inhalte sind noch nicht so teuer wie das kopieren der matrix-Daten. Plus, Sie sparen eine große Menge an CPU-Zeit in function calls (200000 runter auf 2). Dies vereinfacht das Leben für Sie, der Fahrer (die Puffer und alles überprüfen, für redundante Aufrufe und optimieren und Griff Download) und wahrscheinlich auch die Grafikkarte (die hatte vielleicht neu zu berechnen). Um es wirklich klar, visualisieren einfache code für Sie:
1:
(jetzt Auspacken, dass)
2: