Optimale Stapelung für 2D-Objekte mit Transparenz

7

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.

Geben Sie hier die Bildbeschreibung ein

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.

Pris
quelle
Können Sie ein Beispiel geben, wie Sie ineffizient finden, und erklären, warum Sie es ineffizient finden?
Andreas
Eine schnelle Antwort wäre, dass Sie möglicherweise vorzeitig optimieren. Versuchen Sie immer, den Engpass zu profilieren und zu identifizieren. Nehmen wir nun an, dies ist in der Tat das Problem ... es ist ein Sortierproblem, das die Datenbank seit Ewigkeiten zu lösen versucht. Sie möchten, dass Ihre Objekte nach bestimmten Attributen (Tiefe oder Materialtypen) gruppiert werden, die Attribute jedoch möglicherweise in Konflikt stehen. Es scheint, als ob der Hauptunterschied zwischen den beiden gezeigten Bildern darin besteht, dass auf der linken Seite Dinge übereinander liegen, auf der rechten Seite nicht. Wenn sie sich also nicht überlappen, sortieren Sie sie nach Material?
ChaoSXDemon
Letztendlich müssen transparente Objekte von hinten nach vorne gerendert werden. Das Beste, was Sie tun können, ist, nach Tiefe zu sortieren. Sie können möglicherweise mehr Leistung
einschränken,

Antworten:

1

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.

Valerio Santinelli
quelle