In diesem Blogbeitrag will ich verschiedene Varianten zeigen, wie ich Bäume platziert habe und deren Einfluss auf die Performance aufzeigen. Wie Bäume erstellt werden, zeige ich in einem anderen Blogbeitrag. Hier soll es darum gehen, dass ich gekaufte Speedtree Bäume platzieren und dabei die Performance schonen möchte.
Bäume platzieren
Die Performance in Unity selbst zu messen ist nicht sehr zuverlässig. Genaue Messungen sollten im fertigen Spiel gemacht werden. Diese Tests hier sollen nur Anhaltspunkte liefern, wie die Performance verbessert werden kann.
Wichtig: Wenn man auf zwei Monitoren arbeitet bzw. sich in Unity gleichzeitige die „Scene“ und die „Game“ Ansicht anzeigen lässt, sinken die FPS (frames per seconds) massiv, da Unity ja alles zwei mal berechnen muss. Bei den Messungen habe ich daher nur die „Game“ Ansicht eingeschaltet.
Test 1 – Leeres Terrain
Als erstes beginne ich mit einem leeren Terrain. Ich habe verschiedene Bodentexturen angebracht und einige Erhebungen im Vordergrund. Dies ist die Testscene:
TEST 2 – Zwei Testbäume (Manuell)
Nun habe ich beim Speedtree Shop einen Baum gekauft „Cypress_Oak_Desktop“ und diesen exportiert und links manuell als Prefab platziert (Speedtree Polygon-Modell: Total: 9341 Tris). Anschliessend habe ich den Baum in Speedtree selbst etwas reduziert und auf folgendem Bild manuell als Prefab rechts platziert (Speedtree Polygon-Modell: Total: 7627 Tris).
Interessant: Obwohl mir Speedtree zeigt, dass beide Bäume zusammen 9341 + 7627 = 16968 Tris (Triangles) haben, hat Unity auf einmal 73’100 Tris mehr zum anzeigen. Das erstaunt doch recht.
TEST 3 – ZWEI TESTBÄUME (Paint Trees)
Nun habe ich beide Prefabs als Trees im Terrain Tool erfasst um diese zu platzieren:
Eigenartigerweise sind alle Werte gleichgeblieben, nur die Anzahl Frames per Second (fps) haben sich verschlechtert. Wobei die Anzahl FPS im Unity Editor nicht sehr exakt gemessen werden kann.
TEST 4 – ACHT BÄUME (Manual)
Der Test wird nun erweitert. Es werden jeweils vier Bäume manuell platziert:
Mit 6 zusätzlichen Bäumen haben wir nun 30 Batches mehr sowie 219.4k Tris mehr.
TEST 5 – Acht Bäume (PAINT TREES)
Der gleiche Test wird mit dem Paint Tree auf dem Terrain wiederholt.
Ausser dass es einen Batch mehr benötigt, hat sich nichts verändert.
Zwischenfazit
Es scheint so, dass die Angaben die Speedtree liefern und das was Unity daraus macht, nicht stimmen. Ob nun Unity etwas eigenartiges macht oder Speedtree falsche Daten liefert, kann ich nicht nachvollziehen.
Es ist ebenfalls aufgefallen, dass es keinen wesentlichen Unterschied gibt, ob die Bäume manuell platziert werden oder ob sie mit dem Terrain Painter platziert werden.
Szenenoptimierung
Nun geht es darum, die Anzahl Batches bzw. die Anzahl Triangles (Tris) so tief wie möglich zu halten, dennoch aber einen dichten Wald zu generieren. Dies machen wir in mehreren Tests.
Um den LOD Effekt besser darzustellen, habe ich die LOD1 Bäume, also jene mit tiefer Qualität, rot verfärbt.
Damit wir nun einen Vergleich haben, habe ich die exakt gleiche Anzahl Bäume manuell platziert:
Es scheint so, dass alle Werte nun etwas besser geworden sind, wobei nicht wesentlich. Bei den 100’000 Triangles Differenz dürfte es sich wahrscheinlich um Rundungsprobleme handeln.
Wir können nun definitiv davon ausgehen, dass das Terrain Painting Tool keine Performanceverbesserungen mit sich bringt.
LOD vs. Non LOD
Als letzten Test will ich nun schauen, wie viel Optimierung man bei vielen Bäumen herausholt, wenn mit LODs gearbeitet wird.
LOD also Level of Details ist eine Technik, welche 3D Objekte die weit weg sind, ungenauer darstellt um Performance zu sparen. Das heisst, man erstellt ein 3D Objekt und nennt es LOD0 (also High Quality) und reduziert dann die Anzahl Details dieses Objektes, macht es also ungenauer und nennt es LOD1 oder LOD2 etc. So kann man viele 3D Objekte gleichzeitig dem Spieler zeigen, wobei die 3D Objekte die weit weg sind, auch nicht so genau dargestellt werden müssen. Zum Beispiel bei einem Haus. Ist man nahe genau am Haus, will man z.B. den Türgriff darstellen. Dieses Detail ist aber nicht notwendigerweise sichtbar, wenn das Haus 300 Meter entfernt steht. Daher muss es auch bei einem weit entfernten Haus kein Türgriff am Haus haben, höchstens vielleicht einen schwarzen Punkt der einen Türgriff simuliert.
Hierzu habe ich vier Punkte auf der Landschaft gezeichnet und platziere nun mit 50 „Brush Size“ und 100 „Tree Density“ Bäume die nur als LOD0 also High Quality Bäume bestehen. Da die Platzierung innerhalb des Radius zufällig erfolgt, können sich die Werte mit jedem neuen Platzieren etwas verändern. Ich habe plus/minus 10% ausgemacht. Da ich aber mit 4 Platzierungen arbeite, sollte sich der Zufallsfehler etwas reduzieren.
Den gleichen Test machen wir nun mit Bäumen, die ein LOD0 und ein LOD1 Baum Modell haben, wobei ich das LOD1 Modell rot eingefärbt habe:
Bei diesem Test die FPS bitte nicht beachten. Ich habe ausversehen den Editor im Hintergrund offen gehabt. Wir stellen nun fest, dass sich die Anzahl Batches nicht wesentlich reduziert hat, jedoch die Anzahl Triangles.
Der grösste Performance-Saver ist jedoch „GPU Instancing“:
GPU Instancing ist eine Einstellung, die bei den meisten Materialien gemacht werden kann. Ich habe in diesem Beispiel nur die Blatttexturen mittels GPU Instancing verändert. Wir sehen hier nun 15% weniger Batches. Wenn ich beide Baumtexturen, also auch den Stamm mittels GPU Instancing optimiere, komme ich auf eine Ersparnis von 25%, was erheblich ist.
Hässliche LOD1 Bäume
Das Problem an der LOD Technik hier ist, dass die LOD0 und LOD1 Bäume das gleiche Material verwenden.
Was wir hier sehen, ist der typische Effekt, wenn wir ein Material mit einer „Alpha Cutoff“ Einstellung haben:
Dieses Problem verursacht den Effekt, dass die Bäume im Hintergrund (also jene welche als LOD1 dargestellt werden), weniger dicht wirken. Das kann je nach Kameraeinstellung sehr hässlich wirken.
Dieses Problem löse ich, indem ich für die LOD1 Bäume das Material kopiere, jedoch den Alpha Cutoff Wert massiv reduziere, damit die Bäume im Hintergrund ebenfalls dicht belaubt wirken.
Der Effekt ist enorm. Der Wald wirkt wieder viel dichter in der Distanz. Es sieht zwar noch nicht optimal aus, das liegt aber daran, dass ich nur zwei LOD Modelle genommen habe. Es wäre sinnvoll, mit drei oder sogar vier LOD Modellen bzw. Materialien zu arbeiten.
Fazit
Als Laie habe ich viel gelernt mein Fazit:
- GPU Instancing hat einen massiven Einfluss und spart ca. 25% Batches.
- LOD lohnt sich bezugnehmend auf die Anzahl Triangles.
- Es gibt keinen nennenswerten Unterschied, ob man die Bäume von Hand platziert oder mit dem Terrain Painter.
- Bäume wirken in der Distanz karg. Mittels zwei Materialien und verschiedenen Alpha Cutoff Werten kann dies verbessert werden.