Dies wurde wahrscheinlich gefragt, immer und immer wieder, aber ich konnte nichts Brauchbares finden so ist es hier wieder geht ...Tuning OpenGL-Performance für Geometrie Durchsatz
In meiner Anwendung brauche ich eine ziemlich große Masche zu machen (a ein paar Millionen Dreiecke oder mehr) und ich habe einige Probleme damit, brauchbare Bildraten zu bekommen. Die CPU ist ziemlich leer, also bin ich definitiv GPU-gebunden. Das Ändern der Auflösung wirkt sich nicht auf die Leistung aus und ist daher nicht fragment- oder rastergebunden.
Das Netz ist dynamisch (aber lokal statisch), so dass ich das Ganze nicht in der Videokarte speichern und mit einem Anruf rendern kann. Aus anwendungsspezifischen Gründen werden die Daten als Octree mit Voxeln in den Blättern gespeichert, mit Mitteln, die ich grundsätzlich kostenlos kupieren lasse. Die Vertex-Daten bestehen aus Koordinaten, Normalen und Farben - es werden keine Texturen oder Shader verwendet.
Mein erster Ansatz war, nur alles aus dem Speicher mit einem großen STREAM_DRAW
VBO zu rendern, was sich als zu langsam herausstellte. Mein erster Gedanke war, dass ich den Bus vielleicht überforderte (~ 150 MiB pro Frame), also implementierte ich ein Caching-Schema, das Geometrie speichert, die kürzlich verwendet wurde, um das Objekt in statischen VBOs auf der Grafikkarte zu rendern 100 KiB zu ein paar MiB Daten (mehr pro VBO zu speichern gibt mehr Cache-Thrashing, also gibt es hier einen Kompromiss). Das Bild unten ist ein Beispiel dafür, wie die Daten aussehen, wobei alles, was rot gefärbt ist, aus zwischengespeicherten VBOs gezogen wird.
Example of the rendered data http://gimaker.users.sourceforge.net/0010.png
Wie die Zahlen unten zeigen, ich habe nicht eine spektakuläre Leistungssteigerung sehen, wenn Sie den Cache verwenden. Für ein vollständig statisches Netz von etwa 1 Million Dreiecken ich die folgenden Bildwiederholraten erhalten:
- Ohne Caching: 1,95 Hz
- Caching unter Verwendung von Vertex Arrays: 2,0 Hz (> 75% des Netzes ist gecached)
- Caching mit
STATIC_DRAW
VBOs: 2,4 Hz
Also meine Frage ist, wie kann ich das beschleunigen? Ie .:
- Was ist das empfohlene Vertex-Format, um anständige Leistung zu erhalten? Ich verwende Interleaved-Speicher mit Positionen und Normalen wie
GL_FLOAT
undGL_UNSIGNED_BYTE
für Farben, mit einem Füll-Byte, um 4-Byte-Ausrichtung zu erhalten (28 Bytes/Eckpunkt insgesamt). - Ob die Verwendung der gleichen Puffer für Normalen für alle meine Boxen könnte helfen (alle Boxen sind Achse ausgerichtet, so dass ich einen normalen Puffer die Größe des größten Cache-Eintrag zuweisen und für sie alle verwenden).
- Woher weiß ich, welcher Teil der Pipeline der Flaschenhals ist? Ich habe nicht eine spektakuläre Grafikkarte (Intel GM965 mit Open-Source-Linux-Treiber), so ist es möglich, dass ich seine Grenze erreicht. Wie viel Durchsatz kann ich von einer typischen Hardware (2-3 Jahre alte integrierte Grafik, moderne integrierte Grafik, moderne diskrete Grafik) erwarten?
- Alle anderen Tipps, wie Sie dies angehen würde, Fallen etc.
Ich bin nicht daran interessiert, Antworten darauf hindeutet, LOD (ich dies bereits getestet), herstellerspezifische Tipps oder mit OpenGL-Funktionen von etwas später als 1,5.
Besteht Ihre Primitive nur in Achsen-ausgerichteten Boxen? – Stringer
@Stringer Bell: Ja (aber nicht unbedingt mit den Weltachsen ausgerichtet). – Staffan
Ich bin mir nicht sicher, aber ich denke, Sie haben das Limit der Grafikkarte erreicht. Ich habe ein bisschen gegoogelt und es scheint, dass Intel GM965 eine ziemlich niedrige Leistung hat, besonders für Spiele. (Ihr ist kein Spiel, scheint aber ziemlich "schwer" zu rendern). Nvidia hat eine Liste, wie viele Dreiecke ihre Karten wiedergeben können/Sekunde - vielleicht kannst du deine Karte mit dieser Liste kategorisieren, um das "theoretische" Limit herauszufinden. – InsertNickHere