Com2uS nutzt Vulkan für bessere Grafiken

Screenshot des Logos des Spieltitels aus Com2uS Chronicles

In Summoners War: Chronicles US(WW) und KR von Com2uS wird ausschließlich Vulkan für das Rendering auf Android verwendet. Dadurch konnte die Leistung um bis zu 30 % gesteigert werden.

Vulkan ist eine moderne, plattformübergreifende 3D-Grafik-API, die die Abstraktion zwischen der Grafikhardware des Geräts und Ihrem Spiel minimiert. Vulkan hat einen geringeren CPU-Overhead als OpenGL ES und bietet eine größere Auswahl an Funktionen.

Abbildung 1 Screenshot aus dem Spiel.
Abbildung 2 In-Game-Video

Rendering-Funktionen

Com2uS hat erweiterte Rendering-Funktionen für Summoners War: Chronicles entwickelt, darunter:

  • Benutzerdefiniertes Deferred-Rendering-System mit Pre-Render-Lichtkaschierung und bis zu 16 aktiven Lichtern im Sichtfrustum gleichzeitig
  • Methode zur indirekten Rendering-Instanziierung (Clay), um viele Shader, Materialien und Texturen gleichzeitig zu zeichnen
  • Ausgeklügelte Verwendung von Compute Shadern für Pre-Rendering-Aufgaben
  • Dynamische Anpassung des aktiven Schattenrenderings und der Nachbearbeitungseffekte anhand von Kamerabewegungen, Grafikoptionen und Laufzeitleistung

Anpassungen für Mobilgeräte

Summoners War: Chronicles verwendet denselben Renderer für Android-Geräte, Computer und spezielle Spielekonsolen. Um eine optimale Leistung auf mobiler Hardware zu erzielen, hat Com2uS die Rendering-Einstellungen wie die Zeichnungstiefe und ‑dichte optimiert. Um bestimmte Geräte mit Android 11 (API-Level 30) und niedriger zu unterstützen, hat Com2uS alternative Versionen einiger Shader erstellt und die Anzahl der Instanzen reduziert. Summoners War: Chronicles nutzt außerdem adaptive Leistungsfunktionen unter Android, um die Grafikoptionen dynamisch an die thermischen Bedingungen des Geräts anzupassen.

Begründung für die Beschränkung auf Vulkan

Com2uS hat Vulkan aus mehreren Gründen ausschließlich für Summoners War: Chronicles verwendet:

  • Die Mindestanforderungen an Geräte schließen ältere, weniger leistungsstarke Geräte aus, die keine Vulkan-Unterstützung haben.
  • Anpassung der Unity-Engine an die Anforderungen der integrierten Renderpipeline (BiRP), die nur im Vulkan-Backend des Spiels verfügbar sind
  • Die Implementierung von Renderingfunktionen mit Compute-Shader-Ausgabe und Shader Storage Buffer Objects (SSBOs) ist in Vulkan, aber nicht in OpenGL ES möglich.

Computing-Arbeitslasten

In Summoners War: Chronicles werden umfangreiche Compute Shader-Arbeiten ausgeführt, um Daten für das Rendering zu generieren. Compute Shader werden für Folgendes verwendet:

  • Objektausblendung
  • Kollisionsprüfung
  • Animationsaufgaben
  • Generierung von Daten für indirektes Rendering

Die resultierenden Berechnungsdaten werden in RWBuffer-Objekte der Unity-Engine geschrieben. Für eine optimale Leistung führt Summoners War: Chronicles alle Compute-Jobs mit einer einzigen Auslieferung aus. Dazu müssen mehrere RWBuffers gleichzeitig verwendet werden. Dieser Ansatz war nur mit Vulkan möglich, da das Unity BiRP OpenGL ES-Back-End nur die Verwendung eines einzelnen RWBuffers gleichzeitig unterstützt.

Die für das Rendering generierten Datensätze sind oft größer als die Gerätegrenzwerte für einheitliche Pufferobjekte (UBOs). In Summoners War: Chronicles werden stattdessen Shader Storage Buffer Objects (SSBOs) verwendet, die eine größere Kapazität haben. Für die Bindung von SSBOs an Vorgänge der Vertex-Phase ist jedoch schreibgeschützte SSBO-Unterstützung erforderlich. OpenGL ES unterstützt nur SSBOs vom Typ „Lesen/Schreiben“, während SSBOs in Vulkan als „Schreibgeschützt“ markiert werden können.

Indirektes instanziertes Rendering mit Clay

Für Summoners War: Chronicles hat Com2uS eine Methode entwickelt, mit der mehrere Materialien, ‑meshes und ‑texturen in einem einzigen Draw-Aufruf zusammengefasst werden. Com2uS bezeichnet dieses System als Clay. Clay verbessert die Spielleistung um 30 %, da die Anzahl der Draw-Aufrufe deutlich reduziert wird.

Clay beginnt während der Culling- und Kollisionsphase mit dem Erstellen einer Liste kompatibler sichtbarer renderbarer Objekte. Clay generiert dann Rendering-Informationen für jedes erkannte Objekt in SSBOs. Dieser Vorgang wird mit Compute-Shadern ausgeführt, die das indirekte instanziierte Rendering mit der Unity-Renderer-Funktion DrawMeshInstancedIndirect ermöglichen. Beim indirekten Rendering werden die Instanzinformationen und die Parameter für die Instanzanzahl direkt auf der GPU generiert. Beim Zeichnen von Objekten bindet Clay anstelle eines herkömmlichen Objekt-Mesh ein Kegeldraht-Mesh, wie in der Abbildung dargestellt:

Abbildung 3: Ein Kegeldrahtnetz.

Clay transformiert dann das Kegeldraht im Vertex-Shader mithilfe eines gebundenen SSBO mit Vertex-Transformationsdaten, die von den Compute-Shadern generiert wurden. Für die Bindung von SSBOs an die Vertex-Phase ist Vulkan erforderlich. Clay kann mehrere transformierte Kegel verwenden, um ein einzelnes Objekt zu rendern. Die Komplexität des Objekts bestimmt die Anzahl der Kegeln.

Abbildung 4: So wird ein Kegeldrahtmodell in einen Baum umgewandelt.

Materialdaten für Objekte werden in einem anderen Buffer zusammengefasst, der von den Compute-Shadern generiert wird. Der Buffer ist an den Fragment-Shader gebunden. Texturen für die gezeichneten Objekte werden in einem Textur-Array konfiguriert. Die Arrayindizes für die Texturen eines Objekts sind in den Materialdaten des Objekts enthalten. Unter idealen Bedingungen kann Clay mit maximal sieben Draw-Aufrufen gerendert werden:

  • Statische Objekte
  • Animierte Objekte
  • Schatten (vier Iterationen)
  • Stimmungsprotokoll

Unity und Vulkan

Summoners War: Chronicles zeigt, dass Entwickler mit der leistungsstarken Kombination aus der Unity-Game-Engine und der Vulkan-Grafik-API fortschrittliche Grafiken in Konsolenqualität auf Android-Geräte bringen können.