Hero background image

Leistungsoptimierung von 2D-Spielen mit Unity Tilemap

Holen Sie sich Tipps zur Verbesserung der Leistung Ihrer 2D-Spiele und mobilen Apps mit Unity Tilemap. Die hier behandelten Themen umfassen Szenengröße, Serialisierung, Renderer-Overhead und Batching.
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.

Diese Tipps sind am besten für Benutzer geeignet, die bereits über einige Erfahrungen mit dem 2D-Toolset von Unity verfügen. Eine weitere großartige Ressource für professionelle Entwickler, die kommerzielle 2D-Spiele mit Unity entwickeln, ist unser E-Book, 2D-Spielkunst, Beleuchtung und Animation.

Wenn Sie neu in der Entwicklung von 2D-Spielen mit Unity sind, beginnen Sie mit dem 2D-Leitfaden für neue Benutzer.

Screenshot von Unity Editor
EIN BILD AUS DEM UNITY 2D-PROJEKT LOST CRYPT

Allgemeine Leistungstipps

Hier sind einige allgemeine Leistungstipps, die Sie berücksichtigen sollten:

  • Denken Sie von Anfang an an die Leistung Ihrer Assets (der Daten). Wenn diese Elemente nicht leistungsfähig sind, können Sie später wenig tun, um Ihren Code zu optimieren.
  • Profil auf deinem niedrigsten verfügbaren Zielgerät. Verwende den Unity Profiler während der gesamten Projektentwicklung, zusammen mit plattformspezifischen Profiling-Tools wie Xcode für iOS-Geräte.
  • Verwende nicht mehr als ein Drittel des verfügbaren RAMs auf deinem niedrigsten Zielgerät. Dies stellt sicher, dass dein Inhalt auf einer Vielzahl von mobilen Geräten gut läuft (preiswerte Android-Handys sind nach wie vor die beliebtesten auf den mobilen Märkten).

Für weitere Tipps zur 2D-Optimierung siehe diese Ressourcen:

Unity – 2D-Level mit Tilemap schnell erstellen
TILEMAP BEISPIEL

Eine kurze Einführung in Tilemap

Die Tilemap-Komponente ermöglicht es dir, 2D-Level effizient mit Kacheln auf einem Raster-Overlay zu erstellen. Sie besteht aus einer Reihe von Elementen, darunter:

Du kannst 2D-Level mit einer Kombination aus Sprites und GameObjects erstellen und Eigenschaften wie Sortierungsebenen, Tilemap-Collider und animierte Kacheln steuern, unter anderem. Du kannst auch Quadratische, Hexagonale und Isometrische Sprites malen.

Male deine Level mit Tilemap, sodass die Tilemap Collider 2D-Komponente automatisch einen Collider um die Kacheln (basierend auf der Collider-Typ-Einstellung der Kachel) generiert, wenn sie auf ein Tilemap GameObject angewendet wird.

Lassen Sie uns die Leistungsgewinne betrachten, von denen Sie mit Tilemap im Vergleich zu Szenen, die mit Sprites erstellt wurden, profitieren.

Tilemap mit weniger Objekten
TILEMAP IN DER UNITY 2D-DEMO DRAGON CRASHERS

Weniger GameObjects

Die Verwendung von Tilemap reduziert die Ladezeiten sowie den Speicher- und CPU-Verbrauch.

Wenn Sie zuvor 2D-Spiele und -Apps entwickelt haben, wissen Sie, dass Sie am Ende eine hohe Anzahl von Sprites in Ihrem Spiel haben können, die alle als separate GameObjects vorliegen. Auf jedem dieser Sprite-GameObjects befinden sich Komponenten, einschließlich eines Transforms und eines Renderers, die alle Speicherplatz beanspruchen. Andere Komponenten, wie Collider, verursachen CPU-Overhead.

Im Vergleich dazu verwendet eine Tilemap einen Renderer für die gesamte Karte und all ihre Kacheln. Dies führt zu weniger Overhead, da sie nur ihre eigenen Datenstrukturen verwaltet, im Vergleich zu mehreren Datenstrukturen im Speicher.

Weniger GameObjects führen zu einer saubereren Hierarchie, was bedeutet, dass Sie nicht durch eine komplexe Liste scrollen müssen, um das zu finden, was Sie benötigen.

Unity – Kleinere Szenengröße mit Tilemap
EIN VERGLEICH ZWISCHEN ZWEI SERIALISIERTEN DATEIEN, EINE MIT SPRITES (LINKS) UND DIE ANDERE MIT TILEMAPS (RECHTS)

Kleinere Szenengröße

Unity Tilemap reduziert die Szenengröße. Weniger GameObjects und Komponenten bedeuten weniger Objekte, die von der Festplatte geladen, deserialisiert und zur Laufzeit im Speicher gehalten werden müssen.

Das Laden von Szenen in Unity ist ein zweistufiger Prozess: Zuerst werden die Daten von der Festplatte gelesen. Dies ist der Prozess, der oft die meiste Zeit in Ihrem Spiel in Anspruch nimmt, insbesondere auf Android-Geräten. Dann werden die Daten deserialisiert. Deserialisierung ist der Prozess, bei dem Daten von einem Format in ein anderes umgewandelt werden. Im Wesentlichen stellt es Daten und Objekte aus einem gespeicherten Zustand wieder her. Unity führt die Serialisierung intern durch, sodass es jedes Mal, wenn es eine Szenendatei im Editor und zur Laufzeit lädt, diese gespeicherten Dateien nimmt und in Unity-Objekte umwandelt.

Im obigen Bild sehen Sie einen Vergleich zwischen zwei serialisierten Szenendateien, einer, die Tilemaps verwendet, und einer, die mit Sprites neu erstellt wurde. Danke an Pixel Reign für diese Szene aus ihrem Spiel Robbie Swifthand.

Rechts ist ein Abschnitt aus einer serialisierten Tilemap, die aus vier Kacheln besteht. Die Regeln für alle Kacheln, einschließlich der verwendeten Kacheltypen, sind oben in der Tilemap festgelegt. Jede der folgenden Kacheln gibt Eigenschaften wie die verwendete Kachel und ihre Position an.

Links ist ein Sprite mit Transform- und Sprite-Renderer-Komponenten.

Aus diesem Vergleich wird deutlich, wie viel Arbeit die Sprite-Serialisierung leisten muss. Insbesondere hat die Szene mit Sprites 370.000 Zeilen in ihrer Datei, während die Szene mit Tilemaps 30.000 Zeilen hat. Kleinere Projekt- und Repo-Größen führen zu schnelleren Iterationszeiten und reibungsloseren Arbeitsabläufen.

Wenn Sie Ihre eigenen Szenen als Textdatei ansehen möchten, gehen Sie in Ihre Editor-Einstellungen, aktivieren Sie den Asset-Serialisierungsmodus, klicken Sie auf Force Text und öffnen Sie die .unity-Szenendatei in Texteditor.

Unity – Weniger Collider mit Tilemap
TILEMAP COLLIDER 2D KOMBINIERT MIT COMPOSITE COLLIDER 2D

Weniger Collider

Sie können den Tilemap Collider 2D mit dem Composite Collider kombinieren. Dies reduziert nicht nur die Anzahl der Collider und Sprites, sondern bringt auch mehr Effizienz in Ihre Produktion, da es nicht notwendig ist, komplexe Kollisionsformen jedes Mal neu zu erstellen, wenn Sie eine Änderung vornehmen. Der Composite Collider kümmert sich darum.

Anwendungsfälle für Tilemaps
EIN ANWENDUNGSFALL FÜR EINZELNE GAMEOBJECTS MIT IHREM SPRITE RENDERER IM VERGLEICH ZU EINER TILEMAP

Reduzierter Rendering-Overhead

Wie bereits erwähnt, hat jedes Sprite eine Sprite Renderer-Komponente, und mehr Renderer erfordern mehr Arbeit von der CPU, einschließlich Zeit für Culling-Vorbereitung und -Bereinigung für das Rendering. Durch die Verwendung von Tilemaps haben Sie weniger Renderer-Komponenten, wodurch die CPU entlastet wird.

Reduzierte Culling-Kosten

Mehr als eine Kamera in Ihrer Szene bedeutet mehr Renderer. Dies erhöht die Culling-Kosten.

Im Kamerablick gibt es Kosten für das Culling pro Renderer und pro Kamera. Jede Kamera muss Culling-Überprüfungen für jede Renderer-Komponente in der Szene durchführen, sodass die Verwendung von Tilemaps Ihnen hilft, diese Kosten zu senken, wenn Sie ein Multi-Kamera-Setup für Ihr Spiel haben.

weniger Batch-Aufrufe
DER FRAME DEBUGGER

Weniger Batch-Aufrufe

Batching bedeutet, alle Geometrien zu sammeln, die gezeichnet werden können, ohne einen weiteren SetPass-Aufruf zu tätigen. Der Tilemap-Renderer bündelt die Geometrie der Sprites basierend auf ihrer Position. Das Ergebnis ist, dass der Tilemap-Renderer weniger Meshes mit mehr Geometrie an die Render-Pipeline sendet, im Vergleich zum Sprite-Renderer, der mehr Meshes mit weniger Geometrie sendet. Wie die Tabelle im folgenden Abschnitt zeigt, hat die tilemap-basierte Szene deutlich weniger Batches.

Sie können das Batching überprüfen, indem Sie das Statistik-Panel in Ihrer Spielansicht ansehen. Sie können auch den Frame Debugger verwenden, um zu bestimmen, warum Elemente nicht gebatcht werden.

Szenen mit Sprite- und Tilemaps-Tabelle

Eine schnellere Bildrate

Um 60 fps zu erreichen, kann jeder Frame maximal 16 ms zum Rendern benötigen. Als die Beispielszene auf einem alten iPhone 7 profiliert wurde, hatte die sprite-basierte Version 244 ms pro Frame, während die Tilemap-Version 13 ms pro Frame hatte.

Schließlich lag der RAM-Verbrauch bei 1,1 GB mit der sprite-basierten Szene, was für Low-End-Android-Handys zu viel ist. Die tilemap-basierte Szene verwendete nur 21 MB RAM, was sie geeignet macht, um auf einer breiteren Palette von mobilen Geräten zu laufen.

Der obige Vergleich zeigt den klaren Leistungsunterschied zwischen den beiden Szenen.

Sprite Atlas-Demo
VERWENDUNG VON SPRITE ATLAS IN DRAGON CRASHERS

Sprites mit Sprite Atlas packen

Sprite Atlas ist das Editor-Tool, mit dem Sie Ihre Sprites in Texturen packen können, um den Speicherverbrauch und die Draw Calls zu optimieren. Erstellen Sie ein Sprite Atlas-Asset, das alle Sprites enthält, die in Ihrer Tilemap verwendet werden, damit sie vom Tilemap-Renderer in nur einem Draw Call gebatcht werden können (sofern alle Sprites in eine einzige Textur passen).

Mehr Ressourcen für 2D-Spieleschöpfer

Verbessern Sie Ihre 2D-Fähigkeiten: Unsere Blog-Leseempfehlungen bieten hilfreiche Tipps für die 2D-Spielentwicklung.

2D-Spielegrafiken, Animation und Beleuchtung für Grafiker: Dieses kostenlose E-Book bietet bewährte Verfahren, um das Beste aus Unitys 2D-Toolset herauszuholen.

Übersicht über 2D-Tools: Schauen Sie sich unsere praktische Übersicht an, was Unity 2D-Entwicklern zu bieten hat.

Prozedurale Muster mit Tilemaps – Teil I und Teil II: Fügen Sie Ihrem Spiel Vielfalt mit prozeduraler Generierung hinzu. Diese Beiträge erklären einige der Algorithmen, die Sie mit Tilemap und RuleTile verwenden können.

Leistungsoptimierung von 2D-Spielen mit Unity Tilemap