
Tipps zur mobilen Optimierung für technische Künstler Teil II
Was Sie von dieser Seite erhalten: Teil II unserer Sammlung hilfreicher Tipps zur Optimierung Ihrer Kunstressourcen für Ihr mobiles Spiel. Teil I ist hier.
Sie finden viele weitere Tipps zur mobilen Optimierung in diesem umfassenden E-Book und diesem Unity Learn-Kurs über 3D-Kunstoptimierung für mobile Anwendungen.

Beleuchtung
Die gleiche physikalisch basierte Beleuchtung und Materialien von Konsolen und PCs können auch auf Ihr Telefon oder Tablet mit dem Universal Render Pipeline (URP) skaliert werden.
Batchen Sie Ihre Draw-Calls
Mit jedem Frame bestimmt Unity die Objekte, die gerendert werden müssen, und erstellt dann Draw-Calls. Ein Draw-Call ist ein Aufruf an die Grafik-API, um Objekte (z. B. ein Dreieck) zu zeichnen, während ein Batch eine Gruppe von Draw-Calls ist, die zusammen ausgeführt werden sollen. Batchen von Objekten, die zusammen gezeichnet werden sollen, minimiert die Zustandsänderungen, die erforderlich sind, um jedes Objekt in einem Batch zu zeichnen. Dies führt zu einer verbesserten Leistung, indem die CPU-Kosten für das Rendern von Objekten gesenkt werden.
- Dynamisches Batching: Für kleine Meshes kann Unity die Vertices auf der CPU gruppieren und transformieren und sie dann alle auf einmal zeichnen. Hinweis: Verwenden Sie dies nur, wenn Sie genügend Low-Poly-Meshes haben (weniger als 900 Vertex-Attribute und nicht mehr als 300 Vertices). Der dynamische Batcher wird keine Meshes größer als dies batchen, sodass die Aktivierung Zeit der CPU verschwendet, um in jedem Frame nach kleinen Meshes zu suchen, die gebatcht werden können.
- Statisches Batching: Für nicht bewegliche Geometrie kann Unity die Draw-Calls für Meshes reduzieren, die dasselbe Material teilen. Obwohl es effizienter ist als dynamisches Batching, verwendet es mehr Speicher.
- GPU-Instanzierung: Wenn Sie eine große Anzahl identischer Objekte haben, batcht diese Technik sie effizienter durch die Nutzung von Grafik-Hardware.
SRP-Batching: Aktivieren Sie den SRP-Batcher in Ihrem URP-Asset unter Erweitert. Dies kann Ihre CPU-Rendering-Zeiten erheblich beschleunigen, abhängig von der Szene.
Vermeiden Sie zu viele dynamische Lichter
Es ist entscheidend, zu vermeiden, zu viele dynamische Lichter in Ihre mobile Anwendung hinzuzufügen. Erwägen Sie Alternativen wie benutzerdefinierte Shader-Effekte und Lichtproben für dynamische Meshes sowie gebackene Beleuchtung für statische Meshes.
Siehe diese Funktionsvergleichstabelle für die spezifischen Grenzen von URP und Built-In Render Pipeline Echtzeitlichtern.
Schalten Sie Schatten aus
Der Schattenwurf kann pro MeshRenderer und Licht deaktiviert werden. Deaktivieren Sie Schatten, wann immer es möglich ist, um Draw Calls zu reduzieren.
Sie können auch gefälschte Schatten mit einer verschwommenen Textur erstellen, die auf ein einfaches Mesh oder Quad unter Ihren Charakteren angewendet wird. Andernfalls können Sie Blob-Schatten mit benutzerdefinierten Shadern erstellen.

Backen Sie Ihr Licht in Lichtkarten ein
Fügen Sie Ihrer statischen Geometrie dramatische Beleuchtung mit Global Illumination (GI) hinzu. Markieren Sie Objekte mit Contribute GI, damit Sie hochwertige Beleuchtung in Form von Lightmaps speichern können.
Gebackene Schatten und Beleuchtung können dann zur Laufzeit ohne Leistungseinbußen gerendert werden. Der Progressive CPU- und GPU-Lightmapper kann das Backen von Global Illumination beschleunigen.
Befolgen Sie das Handbuch und dieses Artikel zur Lichtoptimierung, um mit dem Lightmapping in Unity zu beginnen.

Verwenden Sie Lichtschichten
Für komplexe Szenen mit mehreren Lichtern trennen Sie Ihre Objekte mithilfe von Ebenen und beschränken Sie dann den Einfluss jedes Lichts auf eine bestimmte Culling Mask.

Verwenden Sie Lichtproben für bewegliche Objekte
Lichtproben speichern gebackene Beleuchtungsinformationen über den leeren Raum in Ihrer Szene und bieten hochwertige Beleuchtung (sowohl direkt als auch indirekt). Sie verwenden sphärische Harmonien, die im Vergleich zu dynamischen Lichtern schnell berechnet werden.

Minimieren Sie Reflexionsproben
Ein Reflexionsprobe kann realistische Reflexionen erzeugen, kann jedoch in Bezug auf Batches sehr kostspielig sein. Verwenden Sie niedrigauflösende Cubemaps, Culling-Masken und Texturkompression, um die Laufzeitleistung zu verbessern.

Achten Sie auf transparente Materialien
Das Rendern eines Objekts mit Transparenz verbraucht immer mehr GPU-Ressourcen als das Rendern eines undurchsichtigen Objekts, insbesondere wenn transparente Objekte mehrfach übereinander gerendert werden, ein Prozess, der als Überzeichnung 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 Grafik-Debugger überprüfen.
Halten Sie Shader einfach
Verwenden Sie den einfachsten Shader, der möglich ist (wie einen unbeleuchteten Shader), und vermeiden Sie unnötige Funktionen. Verwenden Sie die vorgefertigten Shader von Unity, die speziell für Systeme wie Partikel entwickelt wurden. URP umfasst mehrere leichte beleuchtete und unbeleuchtete Shader, die bereits für mobile Plattformen optimiert sind. Um die Überzeichnung zu minimieren, reduzieren Sie die Anzahl und/oder die Größe der Partikel in Ihrem Spiel.
Für Leistungsziele sollten Sie, wenn möglich, unbeleuchtete undurchsichtige Materialien mit halber Präzision verwenden und auf komplexe Operationen in den Knoten achten. Finden Sie weitere Tipps in dieser Sitzung zu Shader Graph.
Beleuchtet vs. Unbeleuchtete Shader
Beim Erstellen eines Shaders können Sie entscheiden, wie das Material auf Licht reagiert. Die meisten Shader werden entweder als beleuchtet oder unbeleuchtet klassifiziert. Ein unbeleuchteter Shader ist das schnellste und rechnerisch günstigste Schattierungsmodell. Verwenden Sie ihn, wenn Sie ein Gerät der unteren Preisklasse anvisieren.
Wichtige Punkte, die zu beachten sind, umfassen:
- Beleuchtung hat keinen Einfluss auf ein unbeleuchtetes Schattierungsmodell. Das bedeutet, dass viele Berechnungen, wie z.B. Spekularitätsberechnungen, nicht erforderlich sind. Das Ergebnis ist entweder günstigeres oder schnelleres Rendering.
- Die Verwendung einer stilisierten Kunstrichtung, die einem Cartoon ähnelt, funktioniert gut mit unbeleuchtetem Shading. Dieser Stil ist es wert, in Betracht gezogen zu werden, wenn Sie Spiele für mobile Plattformen entwickeln.

Mathematische Operationen im Vertex-Shader
Vertex-Shader arbeiten an jedem Vertex, während Pixel- (oder Fragment-)Shader an jedem Pixel ausgeführt werden. In der Regel gibt es mehr Pixel, die gerendert werden, als es Vertices auf dem Bildschirm gibt. Das bedeutet, dass der Pixel-Shader häufiger ausgeführt wird als der Vertex-Shader. Aus diesem Grund empfehlen wir, Berechnungen vom Pixel-Shader zum Vertex-Shader zu verschieben, wann immer dies möglich ist. Wie gewohnt müssen Sie nach der Arbeit an Optimierungen weitere Profilierungen durchführen, um die beste Lösung für Ihre spezielle Situation zu bestimmen.
Grundoperationen wie Addition und Multiplikation sind schneller zu verarbeiten. Es ist am besten, die Anzahl langsamer mathematischer Operationen so gering wie möglich zu halten. Die Menge an komplizierter Mathematik, die verwendet wird, muss auf älteren Geräten, wie solchen mit GLES 2.0, geringer gehalten werden.
SRP Batcher
Wenn Sie den SRP Batcher aktivieren, beobachten Sie das Statistikfenster und das Vertices-Diagramm im Rendering-Bereich in der Profileransicht. Abgesehen von einem Anstieg der FPS sinkt die Anzahl der verarbeiteten Dreiecke und Vertices dramatisch. Da unsere Objekte einen Shader verwenden, der mit URP kompatibel ist, fasst die Render-Pipeline automatisch alle relevanten Geometriedaten zusammen, um die Menge der verarbeiteten Daten zu reduzieren.
Charakteranimation
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 das entsprechende generische Rig, da es inverse Kinematik und Animation-Retargeting in jedem Frame berechnet.
Das Rendern von skinned meshes ist teuer. Stellen Sie sicher, dass jedes Objekt, das einen SkinnedMeshRenderer verwendet, dies benötigt. Wenn ein GameObject nur manchmal Animation benötigt, verwenden Sie die BakeMesh-Funktion, um das skinned mesh in einer statischen Pose einzufrieren, und wechseln Sie dann zur einfacheren MeshRenderer zur Laufzeit.
Primär für humanoide Charaktere gedacht, ist Unitys Mecanim-System ziemlich ausgeklügelt, wird jedoch oft verwendet, um einzelne Werte (z. B. den Alpha-Kanal eines UI-Elements) zu animieren. Vermeiden Sie eine Übernutzung von Animatoren. Insbesondere in Verbindung mit UI-Elementen sollten Sie in Betracht ziehen, Tweening-Funktionen zu erstellen oder eine Drittanbieterbibliothek für einfache Animationen (z. B. DOTween oder LeanTween) zu verwenden.

Weitere Tipps
Arbeiten Sie mit einem spezifischen Zeitbudget pro Frame
Jeder Frame hat ein Zeitbudget basierend auf Ihren Zielbildern pro Sekunde (fps). Idealerweise ermöglicht eine Anwendung, die mit 30 fps läuft, etwa 33,33 ms pro Frame (1000 ms / 30 fps). Ebenso lässt ein Ziel von 60 fps 16,66 ms pro Frame.
Geräte können dieses Budget für kurze Zeiträume überschreiten (z. B. für Zwischensequenzen oder Ladebildschirme), jedoch nicht für längere Zeit.
Voreinstellungen
Verlassen Sie sich nicht auf die Standardeinstellungen. Verwenden Sie die plattformspezifische Überschreibung, um Assets wie Texturen und Mesh-Geometrie zu optimieren. Falsche Einstellungen können zu größeren Build-Größen, längeren Build-Zeiten und schlechter Speichernutzung führen. Erwägen Sie die Verwendung der Funktion "Voreinstellungen", um Basiseinstellungen anzupassen, die ein bestimmtes Projekt verbessern.
Eingeschränkte Verwendung von Kameras
Jede Kamera verursacht einen gewissen Overhead, unabhängig davon, ob sie sinnvolle Arbeit leistet oder nicht. Verwenden Sie nur die für das Rendering erforderlichen Kamera-Komponenten. Auf mobilen Plattformen der unteren Preisklasse kann jede Kamera bis zu 1 ms CPU-Zeit verbrauchen.
Vermeiden Sie Vollbild-Effekte
Vollbild-Post-Processing-Effekte, wie Glühen, können die Leistung erheblich verlangsamen. Verwenden Sie sie vorsichtig in der künstlerischen Ausrichtung Ihres Titels.
Seien Sie vorsichtig mit Renderer.material
Der Zugriff auf Renderer.material in Skripten dupliziert das Material und gibt eine Referenz auf die neue Kopie zurück. Dies bricht jeden bestehenden Batch, der bereits das Material enthält. Wenn Sie auf das Material des gebündelten Objekts zugreifen möchten, verwenden Sie stattdessen Renderer.sharedMaterial.