Die praktischen Kosten für den Austausch von Effekten

16

Ich verwende XNA für meine Projekte und in diesen Foren sehe ich manchmal Hinweise auf die Tatsache, dass das Austauschen eines Effekts gegen ein Netz mit relativ hohen Kosten verbunden ist, was mich überrascht, da ich dachte, dass das Austauschen eines Effekts lediglich das Kopieren des Ersatz-Shader-Programms war auf die GPU zusammen mit entsprechenden Parametern.

Ich habe mich gefragt, ob jemand genau erklären kann, was an diesem Prozess kostspielig ist. Und wenn möglich "relativ" in den Kontext stellen?

Angenommen, ich möchte einen kurzen Shader verwenden, um beim Kommissionieren zu helfen, dann würde ich:

  1. Ändern Sie den Effekt auf jedes Objekt, indem Sie eine eindeutige Farbe berechnen, um es zu identifizieren und dem Shader bereitzustellen.
  2. Zeichnen Sie alle Objekte auf ein Renderziel im Speicher.
  3. Rufen Sie die Farbe vom Ziel ab und verwenden Sie sie, um das ausgewählte Objekt nachzuschlagen.

Welchen Teil der Gesamtzeit, die benötigt wird, um diesen Prozess abzuschließen, würden Sie für den Austausch der Shader verwenden? Mein Instinkt würde sagen, dass das erneute Rendern der Szene, egal wie einfach der Shader ist, eine Größenordnung langsamer ist als jeder andere Teil des Prozesses. Warum also die Sorge um die Effekte?

sebf
quelle

Antworten:

21

Das Problem, das Sie beschreiben, ist kein "spezielles" Problem. Es ist nicht besonders langsam, die Auswirkungen auf die GPU zu ändern. Das Problem beim Ändern von Effekten, Effektparametern (einschließlich Transformationen), Texturen, verschiedenen Renderzuständen und beim einfachen Senden mehrerer Zeichenbefehle besteht darin, dass ein weiterer Stapel an die GPU gesendet werden muss .

Batches sind CPU- gebunden und Sie erhalten nur einige Tausend * pro Frame .

Es hängt von der CPU und den anderen Aufgaben ab, die Sie ausführen. Nehmen wir jedoch an, Sie erhalten ungefähr 1000 Stapel pro Frame. Wenn Sie ein Objekt pro Stapel rendern, können Sie ungefähr 1000 Objekte auf dem Bildschirm zeichnen, bevor Sie auf Probleme stoßen.

Wenn Sie plötzlich eine Kommissionierung hinzufügen und alle Objekte zweimal rendern müssen, können Sie nur 500 Objekte zeichnen.

(Also, wenn Sie nur eine kleine Anzahl von Objekten haben, dann machen Sie sich keine Sorgen!)

Um die Anzahl der von Ihnen verwendeten Chargen zu verringern, müssen Sie im Grunde "schlau" sein. Die prototypische Methode hierfür besteht darin, mehrere Objekte auf clevere Weise zu einer einzigen Charge zu kombinieren. Suchen Sie insbesondere nach " instancing ". Vielleicht können Sie die Instanznummer verwenden, um jedem Objekt in Ihrem Shader eine eindeutige Farbe zuzuweisen.

Eine andere Technik, die besonders zum Auswählen geeignet ist, besteht darin, die gerenderten Objekte in der Software auszusortieren , damit Sie nichts rendern, von dem Sie wissen, dass es Ihr ausgewähltes Pixel nicht berührt.

Hier ist ein ganzes Präsentationsfoliendeck von NVidia mit dem Titel "Batch, Batch, Batch: Was bedeutet das wirklich?" (PDF) mit schönen Grafiken und Erklärungen. Außerdem werden einige Techniken zur Reduzierung der Stapelanzahl aufgeführt.

Andrew Russell
quelle
Einverstanden! Vielen Dank für die Erklärung und die Vorschläge. Was ich lese, ist jetzt viel sinnvoller. Vielen Dank auch für die NVidia-Präsentation. Ich lese sie gerade und sie ist sehr hilfreich.
14.
1
Aktualisierter Link zum Papier "Batch, Batch, Batch": ce.u-sys.org/Veranstaltungen/…
Marton
1
Vielen Dank Marton, ich habe den neuen Link in den Beitrag bearbeitet :)
Andrew Russell