Warum verbessern Vertex-Pufferobjekte die Leistung?


10

Nach meinem Grundverständnis funktioniert ein Vertex-Pufferobjekt ungefähr so ​​(Pseudocode):

Wenn man sagen möchte, ein Quadrat zu zeichnen, kann man normalerweise Strichzeichnungsbefehle ausgeben.

line (0, 0) -> (1, 0)
line (1, 0) -> (1, 1)
line (1, 1) -> (0, 1)
line (0, 1) -> (0, 0)

Wenn ich ein VBO verwende, werden die Scheitelpunkte, wenn ich das richtig verstehe, in ein VBO geladen.

define VBO
load (0,0) -> VBO
load (1,0) -> VBO
load (1,1) -> VBO
load (0,1) -> VBO
load (0,0) -> VBO

Dann können Sie einen Zeichenbefehl ausgeben.

draw VBO vertices

Obwohl ich verstehe, wie VBOs funktionieren, weiß ich nicht, warum sie die Leistung verbessern.

Wie verbessern sie die Leistung?

Antworten:


11

Wenn Sie ein Objekt in einem Sofortmodus rendern, z. B. durch Zeichnen von Strichzeichnungsbefehlen, erstellen Sie im Allgemeinen eine Reihe von Befehlen, die Sie zum Zeichnen an die Grafikkarte senden. Wenn Sie viele Daten zeichnen oder sehr häufig zeichnen, können Sie viel Zeit damit verschwenden, diese Daten immer wieder zu senden.

Mit einem Scheitelpunktpuffer können Sie ein einzelnes Objekt erstellen, das Sie einmal an die Grafikkarte senden. Wenn Sie Ihre Geometrie nicht ändern müssen, können Sie sie auf der Grafikkarte belassen und der Grafikkarte einfach eine Anfrage zum Zeichnen dieses Objekts senden. Da die Kopie bei jedem Zeichnen vermieden wird, ist der Aufwand für jedes Zeichnen viel geringer.

Beachten Sie, dass die Verwendung eines Scheitelpunktpufferobjekts nicht immer eine sehr signifikante Beschleunigung bietet. Wenn Sie das Objekt nur einmal pro Frame zeichnen und die Geometrie zwischen den einzelnen Frames ersetzen, erhalten Sie nicht die Vorteile, die Kopie jedes Frames zu vermeiden.

Der größte Teil meiner Erfahrung stammt aus dem Schreiben von Programmen mit Grafik-APIs wie OpenGL. Daher kann jemand, der mit dem Backend eines Grafiktreibers zu tun hat, wahrscheinlich eine detailliertere Antwort geben, aber ich hoffe, dies macht die Dinge etwas klarer.


10

Es gibt zwei Schritte, die den VBO effizienter machen als den Sofortmodus.

  1. Der Sofortmodus ( glBegin / glEnd , glVertex * usw.) bedeutet, dass Sie bei jedem Frame die Scheitelpunkte, Attribut pro Attribut (Position, Normal, Farbe usw.), dem Treiber zuführen, der sie dann neu formatiert und schließlich sendet das gesamte Paket als Befehl an die GPU. Das viele Funktionsaufrufe pro Scheitelpunkt in jedem Frame.
    (Beachten Sie, dass der Sofortmodus seit OpenGL 3.0 veraltet ist und vollständig aus 3.2 entfernt wurde .)

  2. Durch die Verwendung von Vertex-Arrays (siehe glDrawArrays , glDrawElements , glVertexPointer usw.) können Sie dem Treiber das Ganze auf einmal geben und ihm die Last der Neuformatierung der Vertices ersparen. Sie ersetzen effektiv mehrere Funktionsaufrufe pro Scheitelpunkt durch nur eine Handvoll Aufrufe für das gesamte Netz. Aber das müssen Sie noch einmal pro Frame tun.

  3. Vertex Buffer Object oder VBO (siehe glGenBuffers , glBindBuffer usw.) gehen noch einen Schritt weiter und speichern die Daten auf der GPU-Seite: Sie senden sie nur einmal und verweisen dann nur mit einem Handle darauf. Sie sparen Bandbreite, indem Sie nicht bei jedem Frame immer wieder dieselben Daten senden.


6

Durch die Verwendung einer Sofortmodus-Schnittstelle (z. B. OpenGL glBegin () / glEnd () / glVertex () im alten Stil) können Sie dem Treiber Daten einzeln einzeln zuführen. Es muss dann dieses einzelne Datenelement aufnehmen, neu formatieren und an die Hardware weitergeben (was heutzutage bedeutet, dass es in einen Befehlspuffer gestellt wird).

Durch die Verwendung eines Scheitelpunktpufferobjekts stellen Sie dem Treiber einen (hoffentlich) großen Datenblock zur Verfügung, bevor er verwendet werden muss. Es kann eine Reihe von Optimierungen durchführen (Neuformatierung, Platzierung im Videospeicher) und muss die GPU nicht stückweise versorgen.

In der Praxis macht es wahrscheinlich keinen großen Unterschied, wenn Sie nur eine kleine Anzahl von Grundelementen zeichnen. Wenn Sie jedoch ein Dreiecksnetz mit mehreren Millionen zeichnen, sind VBOs im Videospeicher der richtige Weg.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.