- Niedrige Vertex-Anzahl bei Modellen
- "Occlusion culling" (auch automatisch durch "viewing frustrum" - Sichtweite der Kamera)
- komplexe Shader vermeiden, "Mobile"-Versionen nutzen (vorallem keine "fragment shader", also Pro-Pixel-Shader)
- Texturen komprimieren und Größe reduzieren
- Mipmaps nutzen (nicht für UI!)
- Level of Detail (LoD) anwenden
- wenige Materialen verwenden -> besseres "batching", siehe DrawCall - Optimierungen
- Texturen zusammenfassen in "texture atlases" (dann auch entsprechend Renderer.sharedMaterial verwenden)
- Light Mapping ("baking") verwenden, siehe Licht - Optimierungen
- Transparenz vermeiden (bzw. alpha cut/test Shader)
- wenige Lichter
- Post Processing minimieren
Läuft das Spiel schneller bei niedrigerer Auflösung? -> Füllratenproblem
- Alpha-testing Shader gegen Alpha-blend austauchen
- einfachere Shader verwenden (Mobile, kein pow, exp, log, sin, tan usw.)
c7e1effa-b611-405d-9ed2-cddd8bdbf274|0|.0|96d5b379-7e1d-4dac-a6ba-1e50db561b04
Static Batching
Statische Objekte sollten als "static" markiert werden, Unity fasst diese Objekte dann in einem DrawCall zusammen.
Allerdings nur Objekte, welche das selbe Material verwenden. D.h. hier sollten "Texture atlases" verwendet werden.
Dynamic Batching
Unity fasst nicht statische Objekte automatisch fürs "Dynamic Batching" zusammen.
Bedingungen:
- Objekte welche unter 900 vertex (Ecken) haben
- gleiche Skalierung
- gleiches Material
- keine Lightmaps
- keine Multi-Pass Shader
be295668-5929-4f26-860b-e3c9d8a7a622|0|.0|96d5b379-7e1d-4dac-a6ba-1e50db561b04
Objekte welche statischen Schatten ("baked") empfangen sollen, sollten im Modell "Generate Lightmap UVs" aktiviert haben.
Unity nutzt dann den 2. UV-Kanal zum Ablegen der Schatteninformationen.
In den Lighting-Einstellungen der Szene sollte dann "Baked GI" aktiviert sein. (Nicht mit "Precomputed Realtime GI" kombinieren!)
Ausführung der Berechnung bzw. "Auto"Aktivierung nicht vergessen.
0e8004b3-0d2d-4551-938d-bd538553ef57|0|.0|96d5b379-7e1d-4dac-a6ba-1e50db561b04
Texturen
- wenn machbar auf Mipmaps verzichten
- komprimieren
- Read/Write abschalten
- Größe anpassen
Analyse und Maßnahmen
- Profiler.GetRuntimeMemorySize() RAM-Verbrauch durch Objekte
- Resources.UnloadAsset (Referenz bleibt bestehen)
- Resources.UnloadUnusedAssets (unreferenzierte)
- Vor und nach dem Laden eines Levels System.GC.Collect
- structures -> Stack, classes -> Heap
- foreach vermeiden, da Enumeratoren erschaffen werden
- analog anonyme Methoden und Lambdas
- AssetBundles verwenden
- strings nicht konkatenieren, ansonsten StringBuilder nutzen
- Asset pool verwenden bei häufigen Objekten, wie z.B. Geschosse
6da1cec0-0d26-41ec-84e6-5493717cb903|0|.0|96d5b379-7e1d-4dac-a6ba-1e50db561b04