Wie Toca Boca ein leistungsstarkes, skalierbares Rendering-Backend entwickelt hat.

BERTRAND GUAY-PAQUET / TOCA BOCASenior Graphics Engineer
Mar 20, 2026
Toca Boca
Diese Website wurde aus praktischen Gründen für Sie maschinell übersetzt. Die Richtigkeit und Zuverlässigkeit des übersetzten Inhalts kann von uns nicht gewährleistet werden. Sollten Sie Zweifel an der Richtigkeit des übersetzten Inhalts haben, schauen Sie sich bitte die offizielle englische Version der Website an.

Um die Leistungsanforderungen unseres ehrgeizigen mobilen 3D-Multiplayer-Spiels, Toca Boca Days – insbesondere auf Geräten mit niedrigerer Leistung – zu erfüllen, mussten wir innovativ sein. Das Spiel (derzeit pausiert) bot weitläufige Levels und unterstützte bis zu 32 Spieler mit hochgradig anpassbaren Avataren.

Ende 2022 haben wir unser Batch Renderer-Backend-System eingeführt, das auf Unitys BatchRendererGroupAPI basiert. Dieses neue System lieferte erhebliche Leistungsgewinne, die wir weiterhin verfeinern.

In diesem Artikel werde ich Einblicke in die Architektur des Systems geben, während wir uns darauf vorbereiten, es in unserem kommenden Spiel zu verwenden.

Überblick über die Datenarchitektur

Auf hoher Ebene unterteilt unser System die Daten für ein GameObject und seine Renderer-Komponente in drei Schichten.

Schichtete Datenarchitektur
Schichtete Datenarchitektur

In der ersten Schicht entspricht jede Renderer-Komponente einer einzelnen Culling-Instanz. Diese Schicht enthält alle Daten, die erforderlich sind, um die Sichtbarkeit basierend auf den Culling-Ebenen der Kamera, der Layer-Maske und jeder übergeordneten LOD-Gruppe zu bestimmen.

Die zweite Schicht repräsentiert die Materialien jedes Renderers, wobei jedes Renderer-Material-Paar eine Draw-Instanz bildet. Draw-Instanzen speichern renderbezogene Daten, wie das Mesh und das Material.

Die dritte Schicht besteht aus BatchRendererGroup Batches (daher der Name Batch Renderer) und ihren Instanzen. Jeder Batch hat seinen eigenen GraphicsBuffer, der integrierte pro-Instanz-Eigenschaften enthält, wie die ObjectToWorld Matrix, zusammen mit einem optionalen Satz von pro-Instanz-Materialeigenschaften.

Ein Satz von pro-Instanz-Materialeigenschaften eines Renderers bestimmt seinen Batch-Typ.

Toca Boca Days | Toca Boca
Viele Bücher mit Werten für pro-Instanz-Materialeigenschaften

Unser System speichert alle CPU-seitigen Daten in einer kompakten, datenzentrierten Struktur von Arrays (SoA) Layout. Es basiert, wo immer möglich, auf blitbaren Typen innerhalb nativer Container, was die Verwendung von hochleistungsfähigen Burst-Jobs für Aufgaben wie Instanz-Culling und Draw-Befehlsgenerierung ermöglicht. Diese Architektur ermöglicht es dem System, eine große Anzahl von Instanzen effizient zu verwalten.

Materialeigenschaften pro Instanz

Um Materialeigenschaften pro Instanz einem Renderer zuzuweisen, fügen wir eine Komponente hinzu, die auf ein „Eigenschaftsset“ScriptableObject-Asset verweist. Eigenschaftssets sollten in der Anzahl begrenzt sein, da jedes einen separaten Batch-Typ definiert – Instanzen aus verschiedenen Batches werden nicht zusammen gerendert.

Für einfacheres Erstellen bieten wir eine Komponente an, um anfängliche instanzierte Eigenschaftswerte festzulegen, zusammen mit einem benutzerdefinierten Inspector-Fenster. Ohne Eigenschaften pro Instanz müssten diese Werte auf einzigartigen Materialien festgelegt werden, was die Batch-Effizienz verringert.

Inspector für Materialeigenschaften pro Instanz
Inspector für Materialeigenschaften pro Instanz

Skinning und Skelette

In Toca Boca Days verfügten Avatare über umfangreiche Anpassungsmöglichkeiten. Um unterschiedliche Kleidung und Accessoires zu unterstützen, teilen wir die gesichteten Teile des Meshs jedes Avatars in 17 Skinned Mesh Renderer-Komponenten (z. B. linker Oberarm) auf. Die meisten Kleidungsstücke fügen zusätzliche gesichtete Renderer-Komponenten hinzu, die schnell ansteigen können, wenn die Spielerzahlen zunehmen.

Toca Boca Days | Toca Boca
Avatare aus Toca Boca Days

Da unsere Avatare komplex sind, vermeiden wir es, sie für Schattenkarten zu verwenden, da dies teuer wäre. Stattdessen verwenden wir blobartige Schatten, und in den meisten Fällen werden Avatare nur einmal pro Frame gerendert. Das bedeutet, dass wir die integrierten Kosten für das Vertex-Skinning von Unity nicht über mehrere Draw-Befehle für ein einzelnes Mesh amortisieren können.

Stattdessen behandeln wir das Skinning direkt im Vertex-Shader. Alle Skinning-Matrizen werden in einem einzigen globalen GraphicsBuffer gespeichert, und jeder Renderer erhält einen Offset in diesen Puffer, um die pro-Vertex-Knochenindizes anzupassen und die entsprechenden Skinning-Matrizen abzurufen.

Der Skelett-Offset wird als BatchRendererGroup Instanzdaten gespeichert, was es uns ermöglicht, Draw-Calls über Charaktere zu batchen, die dasselbe Mesh teilen (z. B. alle rechten Oberarme zusammen), was die Leistung verbessert.

Die Berechnung der Skinning-Matrizen erfordert normalerweise Rendereranzahl × durchschnittliche Knochenanzahl pro Renderer Berechnungen. Um dies zu reduzieren, kombinieren wir zwei Strategien:

Stellen Sie sicher, dass alle skinned Renderer-Komponenten in einem Avatar konsistente Knochenindizes verwenden – zum Beispiel bezieht sich der Knochenindex 2 immer auf die Brust, selbst für einen Renderer des rechten Fußes, der darauf nicht verweist.

Verarbeiten Sie die Netze vor, um einzigartige Mengen von Knochenindizes und Bindepose-Matrizen zu identifizieren, idealerweise mit dem Ergebnis eines einzelnen Sets pro Avatar.

Komponente des Skeleton-Rig-Vorverarbeiters
Komponente des Skeleton-Rig-Vorverarbeiters

Mit diesem Ansatz können wir das Skinning aller Skinned Mesh Renderer-Komponenten eines Avatars in ein einzelnes "Animationsskelett" und "Rendererskelett"-Paar konsolidieren.

Animations- und Rendererskelette (zwei Rendererskelette zeigen)
Animations- und Rendererskelette (zwei Rendererskelette zeigen)

In jedem Frame führt unser Skelett-Manager die folgenden Schritte aus:

Animationsextraktion: Animationsjobs ziehen die aktuellen Knochen-Transformationen aus dem Animationsskelett über die PlayablesAPI (Mecanim).

Pose-Berechnung: Burst-Jobs erzeugen animierte Pose-Matrizen aus der Knochenhierarchie und extrahierten Transformationen.

Zusammenstellung der Skinning-Matrix: Burst-Jobs kombinieren animierte Pose- und Bindepose-Matrizen zu Skinning-Matrizen.

GPU-Upload: Die neuen Skinning-Matrizen werden mit einem Compute-Shader in den globalen GraphicsBuffer hochgeladen.

Dieser Prozess ist komplex, aber äußerst effizient und reduziert die Skinning-Matrizen um den Faktor zwei für einen nackten Avatar und um den Faktor vier oder mehr, wenn Kleidung angelegt wird.

Blick nach vorn

Die Entwicklung eines benutzerdefinierten Rendering-Backends für Toca Boca Days und die anschließende Modernisierung für Unity 6.3 haben sich als lohnenswert erwiesen. Das Upgrade von Unity 2022.3 verlief reibungslos, und unser Batch-Renderer-System liefert weiterhin eine starke Leistung für Spiele mit umfangreicher Charakteranpassung und materialbezogenen Eigenschaften pro Instanz.

Die vollständige Kontrolle über die Generierung von Zeichenbefehlen über die BatchRendererGroup API ermöglicht maßgeschneiderte Culling-Strategien – wie Sichtportale und benutzerdefiniertes Occlusion Culling – sowie Animationsoptimierungen, wie das Drosseln von Skinning-Matrix-Updates basierend auf der Nähe zur Kamera und deren Wichtigkeit.

Die Erweiterbarkeit von Unity, kombiniert mit leistungsstarken, sofort einsatzbereiten Lösungen wie dem Universal Render Pipeline (URP) und dem GPU Resident Drawer (mit Quellzugriff), ermöglichte es uns, unsere Leistungsziele zu erreichen und gleichzeitig eine hochoptimierte, benutzerdefinierte Rendering-Pipeline aufrechtzuerhalten.

Toca Boca Days | Toca Boca
Der Batch-Renderer wird zurückkehren.

Toca Boca entwickelt ein noch nicht angekündigtes Spiel; folgen Sie dem Studio auf Instagram, TikTok und YouTube für Updates. Entdecken Sie weitere Geschichten von mobilen Unity-Entwicklern auf unserer Seite für mobile Lösungen und unserem Ressourcen-Hub.