Soll ich jedem Charakter ein eigenes VBO geben oder sie zu einem einzigen VBO zusammenfassen?


10

Ich mache ein 3D-Ego-Spiel. Soll ich jedem Charakter einen eigenen VBO geben oder alle Charaktere zu einem einzigen VBO zusammenfassen? Was sind die Vor- / Nachteile?


Dies ist eine doppelte Frage. Ich bin mir nicht sicher, aber es ist ein Betrug.
DeadMG

Es ist ähnlich wie diese , aber ich glaube nicht , dass es ein Duplikat per-se, für einen Start, ist dieser Open-GL (Ich bin nicht sicher , ob es irgendwelche Unterschiede sind), während die andere Frage über deformables ist in DirectX11 (also vermutlich mit Tessellation, was die Dinge verändert).
Thomas Russell

Antworten:


11

Dies ist wirklich eine Wahl zwischen Leistung und Flexibilität, aber ich werde meine Meinungen dazu auflisten.

Ein einziger VBO

Die positiven Seiten sind:

  • Nur ein Draw Call, um Ihre Szene zu zeichnen. Dies erhöht die Leistung. Obwohl für Ihre Anwendung möglicherweise mehrere Zeichnungsaufrufe erforderlich sind, können Sie dennoch einen einzelnen VBO haben und die Anzahl und den Versatz über Ihre Zeichnung entscheiden lassen.
  • Keine Statusänderungen zwischen Ihren Objekten erforderlich. Dies erhöht die Leistung.

und die negativen Seiten sind:

  • Schwer zu verwalten, obwohl dies davon abhängt, wie Sie Ihren Code schreiben, ob er richtig gestaltet ist usw.
  • Mit " schwer zu verwalten" meine ich Dinge wie das Aktualisieren des VBO, das Einstellen des richtigen Versatzes für jedes Objekt usw.

Einzelne VBO: s

Die positiven Seiten sind:

  • Einfach zu implementieren.
  • Von Anfang an einfacher zu handhaben.

und die negativen Seiten sind:

  • Viele Zustandsänderungen. Dies verringert die Leistung.
  • Viele Draw Calls. Dies verringert die Leistung.

Zusammenfassung

Ich würde Ihnen empfehlen, Ihre Bewerbung zu profilieren. Holen Sie sich Ihren echten Engpass bei Daten, die Sie sehen können. Eine vorzeitige Optimierung kann (in diesem Fall) als unnötig angezeigt werden. Wenn Sie jedoch angesichts des individuellen VBO- Szenarios einen echten Leistungsverlust in Ihrer Anwendung feststellen , können Sie mit der Implementierung eines einzelnen VBO beginnen.

Solange es nicht benötigt wird (die Anzahl der Objekte ist gering, insgesamt nicht viele Statusänderungen usw.), würde ich empfehlen, einzelne VBOs zu verwenden, es sei denn, Sie sehen, dass dies nicht funktioniert.

Bearbeiten

Ich habe vergessen zu erwähnen, dass es mit mehreren Draw Calls in Ordnung wäre. Das Wichtigste in leistungskritischen Zeiten ist, die Statusänderungen auf ein Minimum zu beschränken. Sie können einfach die Anzahl der zu verarbeitenden Indizes und einen Offset für jeden Draw-Aufruf festlegen. Dies ist in Ordnung. Aber halten Sie die Statusänderungen so gering wie möglich und tätigen Sie so wenig Draw Calls wie möglich. Das ist das große Hallo dieser Antwort, oder zumindest das, was ich versucht habe zu sagen.


Wenn Sie nur 1 Draw Call ausführen, werden Sie für Statusänderungen pro Netz (nicht pro Scheitelpunkt) (Uniformen usw.) verarscht. Erzwingt auch ein Alles oder Nichts, um alles zu zeichnen. Sicher können Sie es aufschlüsseln, so dass es nur 1 VBO-Aufrufe mit mehreren Ziehungen gibt, aber was ist, wenn Sie ein neues Netz hinzufügen möchten?
Verlangsamte

1
@ Daniel: Ein neues Netz sollte einfach aktualisiert / zum VBO hinzugefügt werden. Ich habe vergessen zu erwähnen, dass es mit mehreren Draw Calls in Ordnung wäre. Das Wichtigste in leistungskritischen Zeiten ist, die Statusänderungen auf ein Minimum zu beschränken. Sie können einfach die Anzahl der zu verarbeitenden Indizes und einen Offset für jeden Draw-Aufruf festlegen. Dies ist in Ordnung. Aber halten Sie die Statusänderungen so gering wie möglich und tätigen Sie so wenig Draw Calls wie möglich. Das ist das große Hallo dieser Antwort, oder zumindest das, was ich versucht habe zu sagen. :-)
Wroclai

Batch, Batch, Batch im Jahr 2005 kam zu dem Schluss, dass Sie sich zwischen 10.000 und 25.000 Batches auf einer 1-GHz-CPU leisten können, bevor Sie vollständig an die CPU gebunden sind, indem Sie nur die Draw-Aufrufe verarbeiten. Da dies zu einigen hundert Stapeln pro 60-Hz-Frame führt, ist es nicht unbedingt erforderlich, alles in einen einzelnen VB zu integrieren, aber es ist sicher hilfreich, wenn Sie Geometrie mit ähnlichen Eigenschaften (Lebensdauer, Aktualisierungsrate, Attribute) in demselben VB bündeln.
Lars Viklund

1
Ich denke, Sie sollten auch das Keulen von Kegelstümpfen berücksichtigen.
Tara
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.