Ist die Indexzeichnung schneller als die Nicht-Indexzeichnung?

8

Ich muss viele Polygone zeichnen, die aus 6 Eckpunkten (zwei Dreiecken) bestehen.

Ohne Texturkoordinaten, Normalen usw. ergeben beide Ansätze 72 Bytes. In Zukunft würde ich definitiv auch Texturkoordinaten und Normalen benötigen, wodurch das Zeichnen von Indizes weniger Speicher verbraucht. Nicht viel.

Meine Frage lautet also: Welcher Ansatz ist bei VAOs mit wenigen Scheitelpunktüberlappungen schneller? Ich kümmere mich nicht um den zusätzlichen Speicher, der durch das Zeichnen ohne Index verbraucht wird, sondern nur um die Geschwindigkeit.

Bearbeiten: Um es klar zu machen.

Nicht-Index-Ansatz:

float[18] vertices = {
//Triangle 1
1,1,0,
1,0,0,
0,0,0,

//Triangle 2
1,0,0,
0,1,0,
0,0,0,
};

Indexansatz:

float[12] vertices = {
1,1,0,
1,0,0,
0,0,0,
0,1,0,
};

int[6] indices = {
//Triangle 1
0,1,2,

//Triangle 2
0,3,2
};
KaareZ
quelle
1
... warum nicht einfach beide Ansätze für Ihre spezifische Anwendung auf Ihrer Zielhardware messen und abschließend herausfinden?
Sean Middleditch

Antworten:

4

Ich versuche die Frage zu beantworten. Ich denke, dass Sie aus mehreren Gründen mit Indizes gehen sollten:

1) In jedem Fall ist die Indizierung auf der GPU-Seite ein freier Betrieb, Sie werden dort nicht bestraft. (hinzugefügt) Natürlich sind Indizes Direktzugriffsvorgänge und können die Leistung des GPU-Speichercaches beeinträchtigen.

2) Durch die Indizierung kann der GPU-Vertex-Cache möglicherweise die wenigen Optimierungen für überlappende Vertices vornehmen.

3) Ein um ein Vielfaches geringerer Speicherbedarf auf der GPU-Seite bedeutet eine bessere Leistung, da die Speicherbandbreite einer der Engpässe ist und das mehrfache Extrahieren von Vorgängen (z. B. 10_10_10_2 -> 4 x Float) keine Kosten verursacht.

Der Geschwindigkeitsunterschied ist wahrscheinlich nicht erkennbar, wenn es nicht viele überlappende Scheitelpunkte gibt, an denen Sie möglicherweise eine Geschwindigkeitsverbesserung erzielen. Aber ich habe wirklich keine harten Fakten, um meine Meinung zu stützen (passend zu Indizes).


Schauen Sie auch das:

/programming/17503787/buffers-indexed-or-direct-interlaced-or-separate

MaKo
quelle
1
Zu 1) Wie sieht es mit der Optimierung der Indexreihenfolge für die Cache-Leistung aus? Es gibt sogar Algorithmen dafür. wie K-Cache Neuordnung. Zu 3) Was ist mit dem Overhead des Indexpuffers selbst? Manchmal führt das Tri-Stripping dazu, dass weniger Daten hochgeladen werden müssen ... obwohl dies nicht der übliche Fall ist.
Jheriko
1

Wenn die Positionen immer gleich sind, können Sie sogar auf Puffer verzichten, indem Sie das Array im Shader speichern und gl_VertexIDden Scheitelpunkt im Scheitelpunkt-Shader auswählen.

#version 330 core

const vec3 data[4] = vec3[]
(
//Triangle 1
vec3(1,1,0),
vec3(1,0,0),
vec3(0,0,0),

//Triangle 2
vec3(1,0,0),
vec3(0,1,0),
vec3(0,0,0)
);

void main()
{
  gl_Position = vec4( data[ gl_VertexID ], 1.0);
}
Ratschenfreak
quelle
Und wenn Sie mit Instanz gerendert werden, können Sie einen Punkt, eine Drehung und eine Skalierung pro Instanz festlegen.
Lasse
@ratchet freak Die Positionen sind nicht immer die gleichen, da dies für das Gelände gilt (und ich kann triangle_strips nicht verwenden, da dies sehr schwer richtig zu implementieren wäre, da es voxelbasiert ist). Ich muss nur wissen, ob ich Index- oder Nicht-Indexzeichnungen verwenden soll. Oder sogar die alten Anzeigelisten, wenn das schneller wäre.
KaareZ
@KaareZ Sie können weiterhin Uniformen verwenden, um die Position zu ändern. Oder verwenden Sie die Instanzierung, um Daten pro Gesicht zu übergeben.
Ratschenfreak
0

Wie bei allen Performance-Dingen, raten Sie nicht, profilieren Sie es, um es herauszufinden.

Dies hängt von der Hardware und sehr vielen komplizierten Faktoren ab. Wenn Sie es durch Profilerstellung messen, werden all diese Dinge automatisch für Sie berücksichtigt, ohne dass Sie etwas darüber wissen müssen.

Jheriko
quelle
-1

Ich gehe davon aus, dass die Indizierung für Scheitelpunkte langsamer ist.

Ich habe die ursprüngliche Frage falsch verstanden, aber hier ist die Antwort für die Farbindizierung. Ich vermute, dass die gleichen Regeln für die Vertex-Indizierung gelten würden (ohne Genauigkeitsverlust), aber das ist nur eine Vermutung.

Aber...

  • In der Regel empfehle ich die Indizierung.
  • Die Indizierung ist langsamer.
  • Nicht indizieren ist schneller.
  • Die Indizierung ist speichereffizienter.
  • Nicht indizieren ist weniger speichereffizient.
  • Die Indizierung verliert an Farbgenauigkeit.
  • Wenn Sie nicht indizieren, verliert die Farbgenauigkeit nicht.

72 Bytes sind so klein, dass es wahrscheinlich speichereffizienter wäre, sie nicht zu indizieren.

Einige Faustregeln: Indizierung ist speichereffizienter. Die Indizierung verliert an Farbgenauigkeit. Nicht indizieren ist schneller.

Dies kann dazu führen, dass Sie niemals die Indizierung verwenden möchten, aber der Speicherkompromiss ist für Bilder mit angemessener Größe ziemlich bedeutend. Die Farbgenauigkeit ist nicht wahrnehmbar.

Die Indizierung funktioniert so, dass beim Zeichnen eines Pixels ein Index angegeben wird und die Farbe in einer Tabelle mit einer vorgegebenen Größe nachgeschlagen werden muss. (Nehmen wir 256 Bytes an, Sie sind also auf 256 Farben beschränkt.) Dann zeichnet es dieses Pixel. Keine Indizierung speichert die Pixeldaten direkt, daher gibt es keine Farbbeschränkungen für 256. In einem 100x100-Bild beträgt Ihr 400-Byte-Bild jetzt 10000 Byte.

Haftungsausschluss, ich ziehe diese Zahlen aus meinem Hut.

Evorlor
quelle
Ich habe nicht nach Farbkomprimierung gefragt.
KaareZ
Super kurze Antwort: Die Indizierung ist immer langsamer. Ich habe meine Antwort dort vergraben, sie aber in die erste Zeile eingefügt, jetzt ging ich zur Farbkomprimierung über, denn das ist die Indizierung.
Evorlor
Ich spreche von der Indizierung von Vertices, nicht von der Texturkomprimierung. Wie zum Beispiel haben Sie v0, v1, v2 und v, 3. Um zwei Dreiecke zu zeichnen, geben Sie die folgenden Indizes an: 0, 2, 3, 0, 2, 4
KaareZ
Oh mein Fehler. In diesem Fall weiß ich es nicht, aber ich gehe davon aus, dass die gleichen Faustregeln gelten würden (abzüglich des Auflösungsverlusts)
Evorlor