Einführung
Wenn wir Spiele machen, übersehen wir oft einen der wichtigsten Aspekte der Spieleentwicklung - die Optimierung. Infolgedessen erhalten wir Verzögerungen und niedrige FPS (manchmal sogar auf High-End-Geräten, wenn wirklich alles läuft). Die meisten Leute werden die Spieloptimierung immer als letzten Schritt betrachten, und dies ist der erste Fehler - es sollte immer der erste Punkt auf der Liste sein.
Es ist unmöglich, die Gewohnheit bei jedem Build zu überschätzen. Wenn Sie Ihren Spielen jeden Tag eine neue Mechanik oder ein neues Beleuchtungssetup oder ein anderes physikbasiertes System hinzufügen, überprüfen Sie immer den Build, um festzustellen, ob aufgrund dieser Probleme Leistungsprobleme auftreten Veränderung ist eine gute Praxis für die Spieleentwicklung.
Wenn Sie sich nicht gleich zu Beginn des Projekts die Zeit nehmen, die Leistung zu optimieren, kann dies in der Endphase zu Problemen für Sie und Ihr Spiel führen. Hier möchte ich einige Gedanken und Tipps teilen, wie Sie die Leistung Ihres Spiels verbessern können, basierend auf einigen praktischen Lektionen, die ich aus meinen Fehlern in den letzten 5 Jahren gelernt habe.
Profiliere dein Spiel
Der Profiler ist der erste auf der Liste und eines meiner Lieblingswerkzeuge in Unity zur Überwachung der Spieleleistung, um herauszufinden, was wirklich Leistungsprobleme verursacht. Dies ist sehr nützlich, um ein detailliertes Verständnis dafür zu erhalten, wie Ihr Spiel auf verschiedene Änderungen im Editor reagiert.
Sie finden den Profiler unter Fenster-> Analyse-> Profiler.
Er zeigt Kategorien wie CPU- und GPU-Auslastung, Rendering, Physik, Audio und mehr an. Wir können uns nicht auf die Profilerstellung im Editor verlassen (Editor-Profilerstellung), da der Editor die Leistung des Projekts während des Testens beeinflusst und dies die Gültigkeit der Profilerstellungsinformationen beeinträchtigen kann. Es ist am besten, einen separaten Build zu erstellen, um genaue Profildaten zu erhalten.
Remote-Profilerstellung
Damit es funktioniert, müssen Sie das Android SDK installieren und das JDK- und USB-Debugging verbinden. Denken Sie daran, es ist immer eine gute Idee, die Leistung Ihres Spiels zu testen, wenn es um Mechanik, Skalierung der Benutzeroberfläche usw. geht. Ganz zu schweigen vom Testen der tatsächlichen Spielleistung zusammen mit den oben genannten. Um die tatsächliche Leistung des Spiels zu testen, müssen Sie einen benutzerdefinierten Profiling-Build erstellen.
Um Remote Profiler zu verbinden, gehen Sie zu Bearbeiten> Projekteinstellungen> Editor und wählen Sie unter Gerät die Option Beliebiges Android-Gerät aus.
Profilerstellung erstellen
Um sicherzustellen, dass Unity Zugriff auf Ihr Build hat, das profiliert werden kann, müssen Sie vor dem Erstellen in den Build-Einstellungen "Development Build oder Deep Profiling Support" und "Auto-Connect Profiler" aktivieren . Dadurch kann der Unity-Editor Ihren Build automatisch verknüpfen.
Wenn Ihr Gebot fertig ist, öffnen Sie Ihr Spiel, ohne das Unity Profiler-Fenster zu schließen. Unity zeigt jetzt automatisch Leistungsdaten für den aktuellen Build des Spiels im Profiler-Fenster an.
Mehr über den Profiler erfahren Sie hier .
Batching von GameObjects
Das Stapeln ist eine sehr gute Technik, um die Leistung zu verbessern, indem die Anzahl der Draw-Aufrufe verringert wird. Dabei wird das Rendern mehrerer ähnlicher GameObjects in einem einzigen Draw-Aufruf zusammengefasst. Es gibt zwei Arten von Stapelmethoden: statische und dynamische. Es gibt einige Einschränkungen beim Stapeln - wir können enthäutete Netze, Stoffe und einige Rendering-Komponenten nicht stapelweise verarbeiten.
Statische Dosierung
Statische Stapelverarbeitung wird immer dann verwendet, wenn GameObjects statisch sind. Solche statischen GameObjects dürfen sich nicht bewegen, skalieren oder drehen und müssen für alle statischen GameObjects dasselbe Material verwenden, damit die Stapelverarbeitung funktioniert.
Wenn Ihre GameObjects nicht mit Ihrem Player interagieren oder wenn Sie Transform nicht ändern, ist es am besten, statische Stapelverarbeitung für die meisten Umgebungen in Ihrem Spiel zu verwenden, z. B. Gebäude, Straßen usw.
Dynamisches Batching
Dynamic Batching ähnelt statisch, da GameObjects dieselben Materialien verwenden müssen, aber bewegte Objekte gruppieren können, ohne sie statisch machen zu müssen. Grundsätzlich kann Unity GameObjects automatisch in denselben Draw-Aufruf laden, wenn sie dasselbe Material verwenden, aber laut Unity gelten einige der Einschränkungen für dynamische Stapelverarbeitung:
- Das Stapeln dynamischer GameObjects hat einen bestimmten Overhead pro Scheitelpunkt, sodass das Stapeln nur auf Netze mit nicht mehr als 300 Scheitelpunkten und nicht mehr als 900 Scheitelpunktattributen angewendet wird.
- Shader Vertex Position, Normal UV, 300 , Shader Vertex Position, Normal, UV0, UV1 Tangent, 180 .
- : .
- GameObject- , transform (, GameObject A +1 GameObject B –1 ).
- Material , GameObject- , . Shadow Caster.
- : / . , GameObject- .
- Multi-pass .
- Unity , . « » .
- Legacy Deferred ( ) , GameObject .
Dynamisches Batching funktioniert für Partikelsysteme, Renderlinien und Trail-Rendering anders als für Netze.
- Für jeden kompatiblen Renderertyp sammelt Unity den gesamten Stapelinhalt in einem großen Vertex-Puffer.
- Der Renderer legt den Status des Chargenmaterials fest.
- Unity bindet den Vertex-Puffer an das Grafikgerät.
- Für jeden Renderer im Stapel aktualisiert Unity den Offset im Vertex-Puffer und sendet dann einen neuen Draw-Aufruf.
Es gibt andere Möglichkeiten, die Stapelverarbeitung mithilfe einiger Assets aus dem Assetstore zu verbessern, z. B. Simple Mesh Combine, Bakery, oder wir können auch
Mesh.CombineMeshesmehrere Meshes zu einem kombinieren, was ideal für die Leistungsoptimierung ist.
Backen Sie Ihre Beleuchtung
Grob gesagt gibt es drei Beleuchtungsmodi: Echtzeit, Gebacken und Gemischt.
Echtzeit ist das Beste, ABER Sie müssen dafür mit Leistung bezahlen. Es bringt direktes Licht in die Szene und aktualisiert jedes Bild, wenn sich Lichter und Spielobjekte innerhalb der Szene bewegen, wodurch die Beleuchtung sofort aktualisiert wird.
Wenn Sie die Möglichkeit haben, Beleuchtung auf der Bühne zu backen, sollten Sie sie verwenden, da sie sich ideal für Produktivitätssteigerungen eignet, insbesondere wenn Sie auf mobile Geräte abzielen. Es ist immer am besten, auf der Bühne wenig Licht zu verwenden, um den gewünschten Look zu erzielen.
Auf diese Weise werden alle Ihre Lichter offline in einem Prozess namens Lightmap Baking vorberechnet. Wenn Sie das statische GameObject Lightmap-Flag setzen, backt Unity Informationen zu GameObject Light, Schatten, spiegelndem Licht und weichen Schatten in Texturen, die Ihre Szene berühren. Lightmaps weist jedoch einige Einschränkungen auf. Die Beleuchtung kann für die Objekte, die Sie mit dem statischen Lightmap-Flag auswählen, nicht dynamisch aktualisiert werden.
Ich habe vor einigen Monaten in meiner Freizeit eine SCIFI-Szene gemacht und ich denke, dies ist das beste Beispiel dafür, wie gebackene Beleuchtung funktioniert. Natürlich habe ich Emission verwendet.
Wenn jemand an einem Überblick darüber interessiert ist, wie diese SCIFI-Szene entstanden ist und wie ich diesen Look erzielt habe, lassen Sie es mich wissen, vielleicht könnte ich diesem Thema einen eigenen Artikel widmen.
, !
Dies ist eine sehr gute Möglichkeit, die Leistung Ihres Spiels mit Unity Occlusion zu verbessern. Im Allgemeinen bedeutet Occlusion Culling, dass Unity keine GameObjects anzeigt, die von anderen GameObjects aus der Perspektive der Kamera vollständig verborgen (verdeckt) werden.
Um das Okklusionsfenster zu öffnen, gehen Sie zu Fenster-> Rendern-> Okklusions-Culling.
Wenn jemand daran interessiert ist, wie ich diesen Look in der Mystery Forest-Szene erzielt habe, lassen Sie es mich wissen, vielleicht könnte ich einen separaten Artikel darüber schreiben.
Hier ist ein Video, wenn Sie interessiert sind!
twitter.com/i/status/1096336962259021824
Standardmäßig wendet Unity Frustum Culling an. Dies bedeutet, dass nur die Sichtlinie der Kamera und alle Objekte angezeigt werden. Wenn die Kamera beispielsweise auf eine Wand schaut, werden auch alle Objekte hinter dieser Wand gerendert. Wir brauchen das überhaupt nicht, also müssen wir unserer Szene Occlusion Culling hinzufügen.
Aus diesem Grund müssen wir Occlusion Culling verwenden, was bedeutet, dass die Kamera nur die Wand ohne Objekte dahinter rendert.
Weiterlesen: