Hero background image
Tipps zur mobilen Optimierung für technische Künstler Teil II

Was Sie auf dieser Seite finden: Teil II unserer Sammlung hilfreicher Tipps für die Optimierung Ihrer Kunstwerke für Ihr Handyspiel. Teil I ist hier zu finden .

Viele weitere Tipps zur mobilen Optimierung finden Sie in diesem umfassenden E-Book und diesem Unity Learn-Kurs über 3D-Art-Optimierung für mobile Anwendungen.

Beleuchtungseinstellungen im Unity-Editor
ORGANISIEREN SIE IHRE SPIELOBJEKTE SO, DASS SIE DIE VORTEILE DIESER STAPELVERARBEITUNGSTECHNIKEN NUTZEN KÖNNEN.
Beleuchtung

Dieselben physikalisch basierten Beleuchtungen und Materialien von Konsolen und PCs können mit der Universal Render Pipeline (URP) auch auf Ihr Handy oder Tablet übertragen werden.

Stapeln Sie Ihre Ziehungsaufrufe

Bei jedem Frame bestimmt Unity die Objekte, die gerendert werden müssen, und erstellt dann Zeichenaufrufe. Ein Zeichenaufruf ist ein Aufruf an die Grafik-API, um Objekte zu zeichnen (z. B. ein Dreieck), während ein Stapel eine Gruppe von Zeichenaufrufen ist, die zusammen ausgeführt werden. Die Zusammenfassung von Objekten, die zusammen gezeichnet werden sollen, minimiert die Zustandsänderungen, die erforderlich sind, um jedes Objekt in einem Stapel zu zeichnen. Dies führt zu einer verbesserten Leistung, da die CPU-Kosten für das Rendern von Objekten reduziert werden.

  • Dynamische Dosierung: Bei kleinen Meshes kann Unity Scheitelpunkte auf der CPU gruppieren und transformieren und sie dann in einem Durchgang zeichnen. Hinweis Benutzen Sie dies nur, wenn Sie genügend Low-Poly-Meshes haben (weniger als 900 Vertex-Attribute und nicht mehr als 300 Scheitelpunkte). Der Dynamic Batcher verarbeitet keine Meshes, die größer sind als dieser Wert, so dass bei seiner Aktivierung CPU-Zeit für die Suche nach kleinen Meshes verschwendet wird, die in jedem Frame verarbeitet werden.
  • Statische Dosierung: Bei nicht bewegter Geometrie kann Unity Zeichnungsaufrufe für Meshes, die das gleiche Material verwenden, reduzieren. Sie ist zwar effizienter als die dynamische Stapelverarbeitung, verbraucht aber mehr Speicher.
  • GPU-Instanzierung: Wenn Sie eine große Anzahl identischer Objekte haben, können Sie sie mit dieser Technik durch den Einsatz von Grafikhardware effizienter zusammenfassen.

SRP Batching: Aktivieren Sie den SRP Batcher in Ihrem URP-Asset unter Erweitert. Dies kann die CPU-Renderingzeiten je nach Szene erheblich beschleunigen.

Vermeiden Sie zu viele dynamische Lichter

Es ist wichtig, dass Sie Ihrer mobilen Anwendung nicht zu viele dynamische Lichter hinzufügen. Erwägen Sie Alternativen wie benutzerdefinierte Shader-Effekte und Lichtsonden für dynamische Meshes sowie gebackene Beleuchtung für statische Meshes.

In dieser Vergleichstabelle finden Sie die spezifischen Grenzen von URP und Built-In Render Pipeline Echtzeit-Lichtern.

Schatten deaktivieren

Schattenwurf kann pro MeshRenderer und Licht deaktiviert werden. Deaktivieren Sie Schatten, wann immer es möglich ist, um die Anzahl der Zeichenaufrufe zu verringern.

Sie können auch falsche Schatten erzeugen, indem Sie eine unscharfe Textur auf ein einfaches Mesh oder ein Quad unter Ihren Figuren anwenden. Ansonsten können Sie Blob-Schatten mit benutzerdefinierten Shadern erstellen.

Unity Lightmap Diagramm
DEAKTIVIEREN SIE DEN SCHATTENWURF, UM DRAW CALLS ZU REDUZIEREN.
Backen Sie Ihre Beleuchtung in Lightmaps

Fügen Sie Ihrer statischen Geometrie mit Global Illumination (GI) eine dramatische Beleuchtung hinzu. Markieren Sie Objekte mit Contribute GI, damit Sie hochwertige Beleuchtungen in Form von Lichtkarten speichern können.

Die gebackenen Schatten und Beleuchtungen können dann ohne Leistungseinbußen zur Laufzeit gerendert werden. Der Progressive CPU und GPU Lightmapper kann das Backen von Global Illumination beschleunigen.

Folgen Sie dem Handbuch und diesem Artikel über Lichtoptimierung, um mit Lightmapping in Unity zu beginnen.

Mehrere Lichtebenen im Unity-Editor
EBENEN KÖNNEN DEN EINFLUSS IHRES LICHTS AUF EINE BESTIMMTE CULLING MASK BESCHRÄNKEN.
Leichte Schichten verwenden

Bei komplexen Szenen mit mehreren Lichtern trennen Sie Ihre Objekte mit Hilfe von Ebenen und beschränken dann den Einfluss jedes Lichts auf eine bestimmte Ausblendmaske.

Lichtsonden im Unity-Editor
Lichtsonden für bewegte Objekte verwenden

Light Probes speichern gebackene Beleuchtungsinformationen über den leeren Raum in Ihrer Szene und bieten gleichzeitig eine hochwertige Beleuchtung (sowohl direkt als auch indirekt). Sie verwenden Spherical Harmonics, die im Vergleich zu dynamischen Lichtern schnell berechnet werden.

Reflektierende Kugel, die einen Würfel schneidet
Reflektionssonden minimieren

Eine Reflexionssonde kann realistische Reflexionen erzeugen, ist aber sehr kostspielig, was die Stückzahlen angeht. Verwenden Sie Cubemaps mit niedriger Auflösung, Culling-Masken und Texturkompression, um die Laufzeitleistung zu verbessern.

Transparente Materialien im Unity-Editor
VISUALISIERUNGSMODUS "ÜBERZEICHNEN" IN DER SZENENANSICHT
Achten Sie auf transparente Materialien

Das Rendern eines transparenten Objekts verbraucht immer mehr GPU-Ressourcen als das Rendern eines undurchsichtigen Objekts, vor allem, wenn transparente Objekte mehrfach übereinander gerendert werden, ein Prozess, der als Overdraw bekannt ist. Es ist eine gute Praxis, wann immer möglich ein undurchsichtiges Material zu verwenden, insbesondere für mobile Plattformen. Sie können die Überzeichnung mit dem RenderDoc-Grafikdebugger überprüfen.

Shader einfach halten

Verwenden Sie einen möglichst einfachen Shader (z. B. einen unbeleuchteten Shader) und vermeiden Sie die Verwendung unnötiger Funktionen. Verwenden Sie die vorgefertigten Shader von Unity, die speziell für Systeme wie Partikel entwickelt wurden. URP enthält mehrere leichtgewichtige Lit- und Unlit-Shader, die bereits für mobile Plattformen optimiert sind. Um die Überzeichnung zu minimieren, reduzieren Sie die Anzahl und/oder Größe der Partikel in Ihrem Spiel.

Um die Leistung zu steigern, sollten Sie, wenn möglich, unbeleuchtete undurchsichtige Materialien mit halber Präzision verwenden und auf komplexe Operationen in den Knoten achten. Weitere Tipps finden Sie in dieser Sitzung zu Shader Graph.

Lit vs. Unbeleuchtete Shader

Wenn Sie einen Shader erstellen, können Sie entscheiden, wie das Material auf Licht reagieren soll. Die meisten Shader werden entweder als beleuchtet oder unbeleuchtet eingestuft. Ein unbeleuchteter Shader ist das schnellste und rechnerisch günstigste Schattierungsmodell. Verwenden Sie es, wenn Sie ein Gerät der unteren Preisklasse anvisieren.

Zu den wichtigsten Punkten, die zu berücksichtigen sind, gehören:

  • Die Beleuchtung wirkt sich nicht auf ein unbeleuchtetes Schattierungsmodell aus. Dies bedeutet, dass viele Berechnungen, wie z. B. die Berechnung des Glanzes, nicht erforderlich sind. Das Ergebnis ist entweder billigeres oder schnelleres Rendering.
  • Eine stilisierte Art Direction, die an einen Zeichentrickfilm erinnert, funktioniert gut mit unbeleuchteten Schattierungen. Dieser Stil ist eine Überlegung wert, wenn Sie Spiele für mobile Plattformen entwickeln.
Shader-Grafik im Unity-Editor
SCHEITELPUNKTVERSCHIEBUNG IM SHADER-GRAPHEN
Mathematische Operationen im Vertex-Shader

Vertex-Shader arbeiten auf jedem Vertex, während Pixel- (oder Fragment-) Shader auf jedem Pixel ausgeführt werden. Normalerweise werden mehr Pixel gerendert als Scheitelpunkte auf dem Bildschirm vorhanden sind. Das bedeutet, dass der Pixel-Shader häufiger läuft als der Vertex-Shader. Aus diesem Grund empfehlen wir, die Berechnungen vom Pixel-Shader in den Vertex-Shader zu verlagern, wann immer dies möglich ist. Wie üblich müssen Sie nach der Arbeit an den Optimierungen ein weiteres Profiling durchführen, um die beste Lösung für Ihre spezielle Situation zu ermitteln.

Grundlegende Operationen wie Addition und Multiplikation sind schneller zu verarbeiten. Am besten ist es, die Zahl der langsameren Rechenoperationen so gering wie möglich zu halten. Bei älteren Geräten, die z. B. GLES 2.0 verwenden, muss die Menge an komplizierter Mathematik geringer gehalten werden.

SRP-Batcher

Wenn Sie den SRP Batcher einschalten, beobachten Sie das Statistikfenster und das Vertikaldiagramm der Rendering-Sektion in der Profiler-Ansicht. Abgesehen von einem Anstieg der FPS sinkt die Anzahl der zu verarbeitenden Dreiecke und Scheitelpunkte drastisch. Da unsere Objekte einen mit URP kompatiblen Shader verwenden, stapelt die Render-Pipeline automatisch alle relevanten Geometriedaten, um die Menge der verarbeiteten Daten zu reduzieren.

Charakter-Animation

Standardmäßig importiert Unity animierte Modelle mit dem Generic Rig, obwohl Entwickler oft zum Humanoid Rig wechseln, wenn sie einen Charakter animieren. Ein Humanoid-Rig verbraucht 30-50% mehr CPU-Zeit als ein entsprechendes generisches Rig, da es bei jedem Frame die inverse Kinematik und das Retargeting der Animation berechnet.

Das Rendern von Meshes mit Skins ist teuer. Stellen Sie sicher, dass jedes Objekt, das einen SkinnedMeshRenderer verwendet, diesen benötigt. Wenn ein GameObject nur zeitweise animiert werden muss, verwenden Sie die Funktion BakeMesh, um das gehäutete Mesh in einer statischen Pose einzufrieren, und wechseln Sie dann zur Laufzeit zu einem einfacheren MeshRenderer.

Das Mecanim-System von Unity, das in erster Linie für humanoide Charaktere gedacht ist, ist ziemlich ausgeklügelt, wird aber häufig zur Animation einzelner Werte (z. B. des Alphakanals eines UI-Elements) verwendet. Vermeiden Sie den übermäßigen Einsatz von Animatoren. Insbesondere in Verbindung mit UI-Elementen sollten Sie Tweening-Funktionen erstellen oder eine Bibliothek eines Drittanbieters für einfache Animationen verwenden (z. B. DOTween oder LeanTween).

Innenbeleuchtungsszene im Unity-Editor
DIE ZEICHENAUFRUFE, DIE STAPELVERARBEITUNG UND JEDEN SCHRITT DES RENDERING-ZYKLUS MIT DEM FRAME-DEBUGGER-TOOL ÜBERPRÜFEN
Weitere Tipps

Arbeit mit einem bestimmten Zeitbudget pro Rahmen

Jedes Bild hat ein Zeitbudget, das sich nach den angestrebten Bildern pro Sekunde (fps) richtet. Im Idealfall lässt eine Anwendung, die mit 30 Bildern pro Sekunde läuft, etwa 33,33 ms pro Bild zu (1000 ms / 30 Bilder pro Sekunde). Bei einem Zielwert von 60 Bildern pro Sekunde bleiben 16,66 ms pro Bild.

Geräte können dieses Budget für kurze Zeit (z. B. für Zwischensequenzen oder Ladesequenzen) überschreiten, aber nicht für längere Zeit.

Voreinstellungen

Verlassen Sie sich nicht auf die Standardeinstellungen. Verwenden Sie die plattformspezifische Override-Registerkarte, um Assets wie Texturen und Mesh-Geometrie zu optimieren. Falsche Einstellungen können zu größeren Builds, längeren Buildzeiten und schlechter Speichernutzung führen. Verwenden Sie die Funktion Voreinstellungen, um die Grundeinstellungen für ein bestimmtes Projekt anzupassen.

Beschränkung der Verwendung von Kameras

Jede Kamera verursacht einen gewissen Overhead, unabhängig davon, ob sie sinnvolle Arbeit leistet oder nicht. Verwenden Sie nur Kamerakomponenten, die für das Rendering erforderlich sind. Auf weniger leistungsfähigen mobilen Plattformen kann jede Kamera bis zu 1 ms CPU-Zeit in Anspruch nehmen.

Vermeiden Sie Vollbild-Effekte

Vollbild Nachbearbeitungseffekte, wie z. B. Glühen, können die Leistung drastisch verringern. Verwenden Sie sie mit Bedacht in der künstlerischen Gestaltung Ihres Titels.

Seien Sie vorsichtig mit Renderer.material

Der Zugriff auf Renderer.material in Skripten dupliziert das Material und gibt einen Verweis auf die neue Kopie zurück. Dadurch wird eine bestehende Charge, die das Material bereits enthält, unterbrochen. Wenn Sie auf das Material des gepackten Objekts zugreifen möchten, verwenden Sie stattdessen Renderer.sharedMaterial.

Haben Ihnen diese Inhalte gefallen?