Leistungsoptimierung von 2D-Spielen mit Unity Tilemap
Diese Tipps eignen sich am besten für Benutzer, die bereits einige Erfahrung mit dem 2D-Toolset von Unity haben. Eine weitere großartige Ressource für professionelle Entwickler von kommerziellen 2D-Spielen mit Unity ist unser E-Book, 2D-Spielkunst, Beleuchtung und Animation.
Wenn Sie neu in der Entwicklung von 2D-Spielen mit Unity sind, beginnen Sie mit der 2D-Anleitung für neue Benutzer.
Im Folgenden finden Sie einige allgemeine Tipps zur Leistung:
- Denken Sie von Anfang an an die Leistung Ihres Vermögens (die Daten). Wenn diese Elemente nicht leistungsfähig sind, können Sie später nur wenig tun, um Ihren Code zu optimieren.
- Profil auf Ihrem niedrigsten verfügbaren Zielgerät. Verwenden Sie den Unity Profiler während der gesamten Projektentwicklung zusammen mit plattformspezifischen Profiling-Tools, wie z. B. Xcode für iOS-Geräte.
- Verwenden Sie nicht mehr als ein Drittel des verfügbaren Arbeitsspeichers auf Ihrem kleinsten Zielgerät. Dadurch wird sichergestellt, dass Ihre Inhalte auf einer Vielzahl von Mobilgeräten gut funktionieren (preiswerte Android-Telefone sind nach wie vor die beliebtesten auf den Mobilfunkmärkten).
Weitere Tipps zur 2D-Optimierung finden Sie in diesen Ressourcen:
Die Tilemap-Komponente ermöglicht die effiziente Erstellung von 2D-Levels mit Hilfe von Kacheln auf einem Gitter-Overlay. Sie umfasst eine Reihe von Elementen, darunter:
Sie können 2D-Levels mit einer Kombination aus Sprites und GameObjects erstellen und Eigenschaften wie Sorting Layers, Tilemap Colliders und Animated Tiles steuern. Sie können auch quadratische, sechseckige und isometrische Sprites malen.
Malen Sie Ihre Levels mit Tilemap, so dass die 2D-Komponente Tilemap Collider automatisch einen Collider um die Kacheln herum erzeugt (basierend auf der Einstellung Collider Type der Kachel), wenn sie auf ein Tilemap-GameObject angewendet wird.
Schauen wir uns die Leistungsvorteile an, von denen Sie mit Tilemap im Vergleich zu mit Sprites erstellten Szenen profitieren.
Die Verwendung von Tilemap reduziert die Ladezeiten sowie den Speicher- und CPU-Verbrauch.
Wenn Sie schon einmal 2D-Spiele und -Anwendungen entwickelt haben, dann wissen Sie, dass Sie in Ihrem Spiel eine große Anzahl von Sprites haben können, die alle als separate GameObjects vorliegen. Für jedes dieser Sprite-GameObjects gibt es Komponenten, darunter ein Transform und ein Renderer, die alle Speicherplatz belegen. Andere Komponenten, wie z. B. Collider, sind mit CPU-Overhead verbunden.
Im Vergleich dazu verwendet eine Tilemap einen Renderer für die gesamte Karte und alle ihre Kacheln. Dies führt zu einem geringeren Overhead, da nur die eigenen Datenstrukturen bearbeitet werden, im Vergleich zu mehreren Datenstrukturen im gesamten Speicher.
Eine geringere Anzahl von Spielobjekten führt zu einer übersichtlicheren Hierarchie, d. h. Sie müssen nicht durch eine komplexe Liste blättern, um das zu finden, was Sie brauchen.
Unity Tilemap reduziert die Größe der Szene. 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 zweiteiliger Prozess: Zunächst 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 der Umwandlung von Daten von einem Format in ein anderes. Im Wesentlichen werden dabei Daten und Objekte aus einem gespeicherten Zustand wiederhergestellt. Unity führt die Serialisierung intern durch, so dass beim Laden einer Szenendatei im Editor und zur Laufzeit die gespeicherten Dateien in Unity-Objekte umgewandelt werden.
In der obigen Abbildung sehen Sie einen Vergleich zwischen zwei serialisierten Szenendateien, von denen eine Tilemaps verwendet und die andere mit Sprites neu erstellt wurde. Vielen Dank an Pixel Reign für diese Szene aus ihrem Spiel Robbie Swifthand.
Rechts ist ein Ausschnitt aus einer serialisierten Tilemap zu sehen, die aus vier Kacheln besteht. Die Regeln für alle Kacheln, einschließlich der Art der verwendeten Kacheln, werden am oberen Rand der Tilemap festgelegt. Jede der weiterführenden Kacheln gibt Eigenschaften wie die verwendete Kachel und ihre Position an.
Auf der linken Seite befindet sich ein Sprite mit den Komponenten Transform und Sprite Renderer.
Aus diesem Vergleich wird deutlich, wie viel Arbeit die Sprite-Serialisierung zu leisten hat. 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 anzeigen möchten, gehen Sie in Ihre Editor-Einstellungen, aktivieren Sie den Modus Asset-Serialisierung, klicken Sie auf Text erzwingen und öffnen Sie die .unity-Szenendatei im Texteditor.
Sie können den Tilemap Collider 2D mit dem Composite Collider kombinieren. Dadurch wird nicht nur die Anzahl der Collider und Sprites reduziert, sondern auch die Effizienz Ihrer Produktion erhöht, da Sie nicht bei jeder Änderung komplexe Collision Shapes neu erstellen müssen. Der Composite Collider übernimmt diese Aufgabe.
Wie bereits erwähnt, hat jedes Sprite eine Sprite-Renderer-Komponente, und mehr Renderer erfordern mehr Arbeit für die CPU, einschließlich Zeit für die Vorbereitung des Cullings und die Bereinigung für das Rendern. Durch die Verwendung von Tilemaps haben Sie weniger Renderer-Komponenten, wodurch die CPUs entlastet werden.
Mehr als eine Kamera in Ihrer Szene bedeutet mehr Renderer. Dies erhöht die Kosten für die Keulung.
In der Kameraview gibt es Kosten pro Renderer und pro Kamera für das Culling. Jede Kamera muss Culling-Prüfungen für jede Renderer-Komponente in der Szene durchführen. Wenn Sie also ein Multi-Kamera-Setup für Ihr Spiel haben, hilft Ihnen die Verwendung von Tilemaps, diese Kosten zu reduzieren.
Beim Batching wird die gesamte Geometrie gesammelt, die gezeichnet werden kann, ohne dass ein weiterer SetPass-Aufruf erfolgt. Der Tilemap-Renderer stapelt die Geometrie der Sprites auf der Grundlage ihrer Position. Das Ergebnis ist, dass der Tilemap-Renderer weniger Meshes mit mehr Geometrie an die Render-Pipeline sendet, verglichen mit dem 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 die Stapelung überprüfen, indem Sie sich das Statistikfeld in Ihrer Spielansicht ansehen. Sie können auch den Frame-Debugger verwenden, um herauszufinden, warum die Elemente nicht dosiert werden.
Um 60 fps zu erreichen, kann jedes Bild 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 der Sprite-basierten Szene bei 1,1 GB, was beispielsweise für Low-End-Android-Handys zu viel ist. Die Tilemap-basierte Szene benötigte nur 21 MB RAM, so dass sie auf einer größeren Anzahl von mobilen Geräten ausgeführt werden kann.
Der obige Vergleich zeigt den deutlichen Leistungsunterschied zwischen den beiden Szenen.
Sprite Atlas ist das Editor-Tool, mit dem Sie Ihre Sprites in Texturen packen können, um die Speichernutzung und die Zeichenaufrufe zu optimieren. Erstellen Sie ein Sprite-Atlas-Asset, das alle in Ihrer Tilemap verwendeten Sprites enthält, damit sie vom Tilemap-Renderer in nur einem Zeichenaufruf zusammengefasst werden können (solange alle Sprites in eine einzige Textur passen).
Verbessern Sie Ihre 2D-Fähigkeiten Unsere Blog-Leseliste enthält hilfreiche Tipps für die Entwicklung von 2D-Spielen.
2D-Spielegrafiken, Animation und Beleuchtung für Grafiker Dieses kostenlose E-Book enthält Best Practices für die optimale Nutzung des 2D-Toolset von Unity.
Überblick über 2D-Werkzeuge: Hier finden Sie einen praktischen Überblick darüber, was Unity 2D-Entwicklern zu bieten hat.
Prozedurale Muster mit Tilemaps - Teil I und Teil II: Bringen Sie mit prozeduraler Generierung mehr Vielfalt in Ihr Spiel. Diese Beiträge erklären einige der Algorithmen, die Sie mit Tilemap und RuleTile verwenden können.