Budget für 3D-Modelle. Was zählt mehr Anzahl von Dreiecken oder Eckpunkten

12

Wenn ich ein Modell für ein 3D-Spiel erstelle, was sollte ich in meinen Budget-Polygonen (Dreiecken) oder Eckpunkten als Maß nehmen? Ich habe ein Experiment mit zwei Mengen von 40000 Würfeln durchgeführt, eine mit 8 Eckpunkten und 12 Dreiecken, eine andere mit 24 Eckpunkten und 12 Dreiecken. Alles wurde in Unity durchgeführt und beide wurden prozedural generiert. Zu meiner Überraschung schnitten beide Sets fast gleich ab, es gab einen sehr kleinen Unterschied zwischen ihnen.

Bedeutet das, dass ich mich nicht um die Anzahl der Scheitelpunkte kümmern und nur die Anzahl der Dreiecke betrachten sollte?

BEARBEITEN: Ich habe ein weiteres Experiment durchgeführt. Ich habe eine Ebene mit 19602 Dreiecken und 10000 Eckpunkten und eine andere mit der gleichen Anzahl von Dreiecken, aber 39204 Eckpunkten erstellt. Ich habe 4000 von beiden erzeugt. Jetzt gewannen weniger Vertices 14 fps bis 19 fps. Ich denke also, im Allgemeinen ist weniger besser, aber nur in großen Unterschieden.

Michał Leszczyński
quelle
9
Schreiben Sie Ihr Spiel und beheben Sie auftretende Probleme. Diese Art von Problem taucht möglicherweise nie auf und Sie verschwenden Ihre Zeit: P
Vaillancourt

Antworten:

16

Stellen wir uns ein großes Gitternetz vor, wie wir es für das Gelände verwenden könnten. Wir rendern davon nDreiecke, die etwa die Hälfte unseres 1080p-Bildschirms abdecken, in einem einzigen Draw-Aufruf.

Wenn wir alle unsere Scheitelpunkte schweißen und keine Glättungs- / Texturierungsnähte haben, hat jedes Dreieck 3 Scheitelpunkte und jeder Scheitelpunkt wird von 6 Dreiecken geteilt, sodass wir n/2Scheitelpunkte haben.

Um dies zu rendern, müssen wir:

  • Führen Sie den Vertex-Shader mindestens n/2einmal aus

    ("Zumindest", weil unser Cache für Vertex-Ergebnisse nur so groß ist. Manchmal wird ein bereits transformierter Vertex entfernt und für ein späteres Dreieck, das ihn gemeinsam nutzt, erneut benötigt, und der Vertex-Shader wird darauf erneut ausgeführt Wir sparen also nicht so viel, wie es auf dem Papier aussieht.

  • Clip & Cull nDreiecke.

  • Rasterisieren und interpolieren Sie über mindestens 1920 x 1080/2 oder über 1 Million Pixel des Bildpuffers (da wir sagten, dass unser Terrain ungefähr die Hälfte des Bildschirms abdeckt).

    ("Zumindest", weil GPUs mit vier Pixeln arbeiten , werden einige Fragmente außerhalb der Kanten von Polygonen immer noch gerastert, aber dann maskiert, was bedeutet, dass wir Fragmente zweimal verarbeiten. Für ein holpriges Netz werden wir auch überall überzeichnet verschließt sich, wenn wir nicht das Glück haben, das vorderste Polygon zuerst in den Tiefenpuffer zu ziehen)

  • Führen Sie den Fragment-Shader für alle diese> = 1 Million Fragmente aus.

  • ~ 1 Million Ergebnisse in die Rahmen- und Tiefenpuffer mischen.

Okay, jetzt wollen wir alle unsere Scheitelpunkte lösen, damit wir jetzt sechsmal mehr3n Scheitelpunkte rendern können als zuvor! Unsere Schritte sind ...

  • Führen Sie die Vertex-Shader- 3nZeiten aus.

    (Keine Sternchen aufgrund von Caching, da jeder Scheitelpunkt nur einmal verwendet wird. Dies bedeutet jedoch, dass der Cache uns keine Zeit ersparen kann.)

  • Clip & Cull nDreiecke.

  • Rasterisieren und interpolieren Sie über mindestens 1920 x 1080/2 oder über 1 Million Pixel des Bildpuffers.

  • Führen Sie den Fragment-Shader für alle diese> = 1 Million Fragmente aus.

  • ~ 1 Million Ergebnisse in die Rahmen- und Tiefenpuffer mischen.

... warte, jeder Schritt außer dem ersten ist der gleiche! Die meiste Arbeit, die die GPU in einem typischen Zeichenaufruf leistet, hängt also nicht direkt mit der Anzahl der verwendeten Scheitelpunkte zusammen. Die Höhe der Bildschirmabdeckung, Überzeichnung und die Gesamtzahl der Dreiecke machen viel mehr der Kosten aus.

Das bedeutet nicht, dass Scheitelpunkte völlig frei sind. Wenn Sie Eckpunkte gemeinsam nutzen, können Sie durch das Caching geringfügige Einsparungen erzielen, insbesondere wenn Ihre Vertex-Shader kompliziert sind oder die Vertex-Pipeline Ihrer Hardware schwach ist (wie dies bei einigen älteren Konsolen der Fall war). Angesichts der Tatsache, dass die Anzahl der Scheitelpunkte proportional zur Anzahl der Dreiecke plus oder minus eines konstanten Faktors ist, ist es in der Regel nicht so interessant, die Gesamtnetzkosten zu messen.

DMGregory
quelle
Was ist mit den Kosten für das Senden dieser Eckpunkte in den Speicher?
Michał Leszczyński
7
Sofern Sie Ihren Vertex-Puffer nicht bei jedem Frame ändern, zahlen Sie die Upload-Kosten einmal. Ihre Texturen und der Framebuffer sind wahrscheinlich der größte Teil des Videospeichers und der Bandbreite innerhalb eines bestimmten Frames. Es bedeutet immer noch, dass Scheitelpunkte sicherlich nicht frei sind, und es ist besser, sie zu teilen, wenn es praktisch ist, aber ungeteilte Scheitelpunkte sind selten der Grund, warum ein Spiel schlecht abschneidet.
DMGregory
Dazu kommt, dass ich in meinem Spiel Wälder usw. mache. Als ich anfing, benutzte ich anfänglich Draw Calls (ich benutze meine eigene Engine, die möglicherweise nicht vollständig mit Ihrer Frage übereinstimmt), um nur Modelle mit verts zu zeichnen. Das an sich war in Ordnung, die Leistung war in Ordnung. Als ich mit der Indizierung begann, wurde die Leistung verbessert, da einige Verts gemeinsam genutzt und so zwischengespeichert wurden, dass einige Berechnungen nicht zweimal durchgeführt wurden. Was das Endergebnis ist, ist dieser rohe Test von Verts allein nicht der beste Indikator für Verts gegen Tri-Count. Ihre Pipeline kann von zu vielen von beiden betroffen sein. Als andere Antworten anspielen.
ErnieDingo
2

Weder.

Es sei denn, Sie sprechen von einer wirklich massiven Anzahl von Tris (Millionen), ist Ihnen Folgendes wichtig:

  • Anzahl der gerenderten Pixel
  • Kosten für Fragment Shader
  • Anzahl der Draw Calls (wobei das Limit stark vom Gerät abhängt).

24 Eckpunkte mal 4000 Würfel ergeben 96'000 Eckpunkte.

640x380 Pixel ergeben 243'200 Fragmente, und die meisten Geräte unterstützen erheblich größere Auflösungen.

Sie können Ihr Experiment mit 1'000'000 Würfeln wiederholen, um den Draw Call-Engpass zu vermeiden (1 einzelnes Modell für 1'000 Würfel).

Peter
quelle
2
Dies hängt stark von der Szene und dem Rendering ab. Wenn Sie eine Szene haben, die von Natur aus relativ wenig Überzeichnung aufweist, kann die Vertex-Verarbeitung sicherlich Ihre Leistung dominieren. Auch die Anzahl der Draw-Aufrufe ist nicht das Problem (für einige APIs), sondern es ändert sich der Status zwischen den Draw-Aufrufen.
Nicol Bolas
1

Wenn Sie eine WebGL-Anwendung ausführen, wird die Anzahl der Scheitelpunkte schnell zu einem Engpass in Bezug auf die Dateigröße, die Benutzer herunterladen können. Gleiche Anzahl von Dreiecken, aber häufig 2-3 mal mehr Eckpunkte als in der DCC-Software angezeigt. Ein besseres Auspacken kann in diesem Fall sehr hilfreich sein, da weniger Nähte vorhanden sind.

Francisco Toledo
quelle