Ich habe eine Sammlung von 2D-Objekten mit Transparenz. Jedes Objekt hat einen Tiefenwert zur Bestimmung der Zeichenreihenfolge und ein Material. Ich versuche, sie optimal zu stapeln, um Draw Calls zu minimieren. Angenommen, Objekte mit demselben Material können in einem einzigen Zeichnungsaufruf zusammengefasst werden.
Eine naive Art der Stapelverarbeitung besteht darin, zuerst alle Objekte nach Tiefe zu sortieren und dann nach Material zu sortieren, wenn die Tiefenwerte gleich sind. Betrachten Sie den folgenden Satz von Objekten, wobei 'z' die Tiefe und die Farbe des Objekts das Material darstellt. Im rechten Satz wurden blaue Objekte entlang x verschoben, sodass sie sich nicht mit Rot überlappen.
Das Sortieren nach [Tiefe, Material] führt zur sortierten Objektliste: {Rot, Blau, Rot, Blau} für den linken und rechten Objektsatz. Entweder links oder rechts würde zu 4 Zeichnungsaufrufen führen (Objekte desselben Materials müssen in der sortierten Liste nebeneinander liegen, um gestapelt zu werden).
Wenn Sie sich jedoch die Objekte auf der rechten Seite ansehen, können Sie zwei Zeichenaufrufe verwenden, da es keine Überlappung gibt. Die Reihenfolge basierend auf der Tiefe spielt keine Rolle, wenn sich die blauen und roten Objekte nicht zwischen den Tiefenbereichen eines bestimmten Stapels überlappen. Dies würde auch gelten, wenn Sie ein rotes Objekt mit (z> 4) oder (z <2) irgendwo in der richtigen Menge hätten.
Angenommen, jedes Objekt verfügt über ein Material, das verglichen werden kann, einen Tiefenwert und einen Begrenzungsrahmen (sagen wir, jedes Objekt ist ein achsenausgerichtetes Quad). Dies ist eine effiziente Methode, um eine Liste von Zeichenobjekten mit der richtigen Reihenfolge zu erhalten für Transparenz und optimale Gruppierung nach Material?
Außerdem habe ich keine Instanzunterstützung, daher ist dies hier keine Option.
Antworten:
Wenn das Stapeln ein Engpass ist, möchten Sie sie möglicherweise nach Tiefe und Material sortieren und eine Begrenzungsprüfung durchführen, um festzustellen, ob sie sich überschneiden. Aber Sie werden wahrscheinlich viel mehr Zeit mit dem Sortieren und Überprüfen verbringen als nur mit dem einfachen Sortieren und einer weniger performanten Stapelverarbeitung.
Ich denke, Ihr Kilometerstand kann variieren, aber wenn Sie einen generischen Batcher schreiben, würde ich mich an die einfache Sortierung halten und die Grenzüberprüfung ignorieren.
quelle