Alle Artikel
Tutorials · 8 min read

Dichtes Laub ohne die Frameraten-Rechnung: ein praktischer Leitfaden

Wie man eine Szene mit Vegetation füllt und schnell hält, mit Instancing, Cull-Distanzen, LOD-Strategie, Schattenkosten, Overdraw, Dichteplatzierung und der Fixkamera-Profiling-Schleife, die beweist, dass sich jede Optimierung tatsächlich ausgezahlt hat.

Illustration of a row of trees next to a rising frame-rate graph

Kurz gesagt: Dichte Vegetation wird selten allein von Dreieckszahlen getötet: sie stirbt an tausend Draw Calls, Overdraw von unbedachten Alpha-Cards und Schatten, an die niemand mehr dachte. Setze deine Mühe in dieser Reihenfolge ein: Instancing zuerst, Cull-Distanzen zweitens, Schatten drittens, LODs viertens, Dichteplatzierung fünftens, und verifiziere jeden Schritt mit derselben Fixkamera, eine Variable nach der anderen, sonst lernst du nichts. Dieser Leitfaden behandelt jede Stufe mit der Profiler-Signatur, die dir sagt, dass es dein Problem ist.

Dichtes Walddach, gespiegelt in einem stillen Bach Ein echter Wald rendert „umsonst", weil Physik massiv parallel ist. Deine GPU kann den Look mit 60 fps vortäuschen, aber nur, wenn du aufhörst, die Maschinerie zu sabotieren, die Engines für genau diese Aufgabe bereits mitliefern.

Das mentale Modell: fünf Flaschenhälse, eine Reihenfolge

Vegetationsperformance ist nicht ein Problem, sondern fünf, und sie dominieren in einer vorhersehbaren Abfolge. Draw Calls binden zuerst die CPU; die Cull-Distanz entscheidet, wie viel du die GPU überhaupt zu zeichnen bittest; Schatten verdoppeln stillschweigend die Kosten von allem, das sie wirft; LODs und Overdraw regieren die Pro-Pixel-Rechnung; und Dichteplatzierung entscheidet, wie viel von all dem du tatsächlich brauchtest. Greif sie in falscher Reihenfolge an und du optimierst etwas, das nicht der Flaschenhals war. Die Reihenfolge unten ist die, in der die Kosten tatsächlich beißen.

Instancing zuerst, alles andere danach

Ein 5000-mal gezeichneter Baum ist radikal günstiger als 5000 einzelne Bäume, denn beide Engines batchen wiederholte Meshes in instanzierte Draws, und deine erste Aufgabe ist einfach, diese Maschinerie nicht zu sabotieren.

Unreal batcht über Foliage und hierarchische instanzierte Static Meshes; Unity über GPU-Instancing und Terrain-Details. Was das Batching stillschweigend bricht:

  • Vegetation platziert als einzigartige Actors/Objekte statt als Instanzen;
  • Pro-Instanz-Materialvarianten: nutze Pro-Instanz-Daten (Farbe, Skalierung) innerhalb eines Materials, statt ein Material pro Look zu erstellen;
  • organisatorisch verstreute Platzierung, sodass die Engine Cluster nicht als Einheiten cullen kann.

Der Profiler-Verräter ist eindeutig: Draw Calls, die mit der Pflanzenzahl skalieren. Zeigt eine Waldansicht Tausende von Draw Calls, behebe das, bevor du irgendetwas anderes anfasst, denn nichts weiter unten auf dieser Liste rettet dich, weil du CPU-gebunden bist, bevor die GPU überhaupt startet. Gesunde instanzierte Vegetation hält Draw Calls im niedrigen dreistelligen Bereich für eine ganze Waldansicht, egal wie viele Tausend Pflanzen darin sind.

Cull-Distanzen sind geschenktes Geld

Gras muss nicht 800 Meter entfernt rendern. Setze pro-Typ-Cull-Distanzen (Bodendecker 30–60 m, Büsche 100–200 m, nur Bäume verdienen weite Distanzen) mit Fade-Bereichen, um das Popping zu verbergen.

Das ist die Einstellung mit dem höchsten Wert pro Minute in der ganzen Pipeline, und sie bleibt routinemäßig auf „unendlich", weil sie dort standardmäßig steht und niemand es bemerkt. Die Begründung ist wahrnehmungsbasiert: Bodendecker unterspannen weniger als ein Pixel lange vor 100 m, sie tragen buchstäblich nichts zum finalen Bild bei, kosten aber weiterhin jeden Frame Vertices, Overdraw und Schattenarbeit. Ferne Bedeckung gehört günstigeren Systemen: der Farbe des Terrain-Materials, opaken Impostoren oder einfach dem fernen LOD der Terrain-Schicht, im richtigen Grün bemalt.

Fade-Bereiche (Dither oder Alpha) verbergen das Aufpoppen, sodass Spieler die Cull-Distanz selbst nie sehen. Stelle den Fade so ein, dass er gerade lang genug ist, um unsichtbar zu sein, und nicht länger, denn ein zu langer Fade heißt, du bezahlst während des Crossfades für zwei Repräsentationen derselben Pflanze.

Schatten: die stille Hälfte der Rechnung

Schalte dynamischen Schattenwurf für kleinen Bodendecker AUS, behalte ihn für Bäume und begrenze ihn distanzabhängig für Büsche, denn Grasschatten verdoppeln deine Kosten für nahezu null visuellen Gewinn.

Jeder Grashalm im Schattenpass wird erneut gezeichnet, aus Sicht des Lichts. In dichten Szenen kostet der Schattenpass oft so viel wie der Basispass, was bedeutet, dass Grasschatten der größte einzelne Posten im ganzen Vegetationsbudget sein können, während sie visuell nicht von einer einfachen Umgebungsverdunklung an der Basis des Büschels zu unterscheiden sind. Die Abhilfe ist fast gratis: Schattenwurf aus für Bodendecker, an für Bäume (ihre Schatten leisten echte kompositorische Arbeit), distanzbegrenzt für das Dazwischen. Prüfe dann den Schattenpass in deinem Profiler davor und danach: es ist meist der größte einzelne Gewinn nach dem Instancing, und es dauert Minuten.

LODs: budgetiere die Silhouette, nicht die Polygone

Eine gute Vegetations-LOD-Kette bewahrt den Umriss und schlachtet das Innere. Verifiziere Übergangsdistanzen mit dem Auge, und optimiere am härtesten das letzte Mesh-LOD vor dem Impostor, weil das in jeder Weitaufnahme auf dem Bildschirm ist.

Farne und Unterholz auf einem Waldboden entlang eines Pfades Bodenschichtpflanzen wie diese sind, wo Cull-Distanz- und Schatteneinstellungen sich am meisten auszahlen: Tausende Instanzen, jede jenseits weniger Dutzend Meter fast nichts beitragend, jede sich verdoppelnd in Kosten, wenn sie einen dynamischen Schatten wirft.

Eine praktische Kette für einen Hero-Baum: volles Mesh → ~50 % Innenreduktion (gleiche Silhouette) → ~15 % mit zusammengeführten Cards → opaker Impostor/Billboard. Zwei Hinweise, die echten Schmerz sparen:

  • Selbst in Engines mit virtualisierter Geometrie bleiben ferne Impostoren lohnend, weil Overdraw und Schatten echte Kosten bleiben, egal wie Dreiecke bezahlt werden. Virtualisierte Geometrie löst die Dreieckszahl, nicht die Transparenzkosten.
  • Transparenz ist der Feind auf Distanz. Dichte alpha-getestete Cards stapeln Overdraw genau dort, wo die GPU am schwächsten ist: den mittleren LODs. Bevorzuge Mesh-Blätter aus der Nähe und opake Impostoren in der Ferne; die alpha-lastige Mitte ist, wo sich die Frame-Zeit versteckt. Wenn ein LOD mysteriös teuer ist, ist es fast immer das transparente.

Overdraw: die Kosten, die du nicht siehst

Overdraw ist die GPU, die denselben Pixel mehrfach durch gestapelte transparente Flächen shadet: der spezifische Fluch der Vegetation, unsichtbar im finalen Bild und oft der Grund, warum eine „leichte" Szene langsam ist.

Die meisten Engines haben einen Overdraw-Visualisierungsmodus; schalte ihn ein und schau auf ein Grasfeld. Glüht es weiß, shadest du jeden Pixel fünf- oder zehnmal, während sich überlappende Alpha-Cards häufen. Abhilfen: weniger, größere Halme statt vieler dünner; opake Geometrie, wo die Silhouette es erlaubt; und aggressives Cullen der Cards, die am wenigsten beitragen. Overdraw ist der klassische „meine Szene ist langsam, aber nichts sieht teuer aus"- Übeltäter, weil die Dreiecke billig sind und die Pixel viele Male überbezahlt werden.

Dichte ist eine Design-Entscheidung, keine Slider-Position

Dicht, wo der Spieler geht und hinsieht, spärlich, wo nicht: ein 20-m-Band reichen Details entlang des Pfads liest sich als „überall üppig" zu einem Bruchteil der uniformen Kosten.

Hang- und Höhenmasken tun einen Teil davon automatisch (steile Flächen und ferne Plateaus brauchen gar keinen Bodendecker), und Clustering tut den Rest: Ballungen mit Lücken rendern günstiger als uniforme Füllung und sehen natürlicher aus, sodass der Performance-Gewinn und der Schönheits-Gewinn in dieselbe Richtung zeigen. Hier macht sich Platzierungswerkzeug bezahlt: Dichte mit Masken und Pro-Spezies-Regeln malen, dann direkt in engine-native Instanzen backen, ist der Unterschied zwischen einem Nachmittag und einer Woche. Das ist der Kern dessen, was Numivos Scatter tut, und weil es in gewöhnliches Foliage und instanzierte Meshes backt, gilt jede Technik dieses Artikels unverändert für das Ergebnis. Es gibt keine Plugin-Laufzeit zwischen dir und den Standard-Optimierungen; die gebackene Szene ist einfach Engine-Inhalt.

Die Profiling-Schleife

Gleiche Kamera, gleiche Ansicht, eine Variable nach der anderen: miss GPU-Frame-Zeit, Draw Calls, den Schattenpass und Overdraw nach jeder Änderung.

Wähle eine feste „Budget-Kamera" in deiner dichtesten Vista und screenshotte die Stats vor und nach jedem Schritt oben. Die Disziplin zählt, weil Vegetationsoptimierungen interagieren: eine Cull-Distanz-Änderung ändert, wie viele Instanzen der Schattenpass sieht; eine LOD-Änderung ändert Overdraw; eine Dichte-Änderung ändert alle auf einmal. Zufällige Durchflüge erzeugen zufällige Zahlen und unwiderlegbare Argumente darüber, ob eine Änderung half. Feste Kameras erzeugen Entscheidungen, die du verteidigen kannst. Halte die Zahlen in einer geteilten Tabelle, und die Trendlinie erzählt dir die Geschichte, die eine einzelne Messung nicht kann.

Feldzahlen, die es sich zu stehlen lohnt

  • Bodendecker-Cull: 30–60 m · Büsche: 100–200 m · Bäume: Sichtlinie
  • Draw Calls für eine gesunde instanzierte Waldansicht: niedrige Hunderter
  • Schattenpass-Anteil in dichten Szenen: oft ~die Hälfte der Vegetationskosten, Grasschatten aus ist der billigste große Gewinn, den es gibt
  • Pfadband-Dressing-Breite, die „überall üppig" liest: ~20 m
  • LOD-Zahl für einen Hero-Baum: 3 Mesh-LODs + opaker Impostor
  • Overdraw-Ziel für Gras: weniger als ~3× in der Overdraw-Ansicht, nicht die glühend-weißen 8–10× gestapelter Alpha-Cards

Mini-FAQ

Macht Nanite / virtualisierte Geometrie das obsolet? Es ändert, welche Posten dominieren, nicht die Disziplin. Overdraw von Alpha-Cards, Schattenkosten und Pro-Instanz-Overhead bleiben alle, und Impostoren auf Distanz zahlen sich weiter aus. Miss auf deiner Zielhardware, statt anzunehmen, die neue Technik habe deinen spezifischen Flaschenhals gelöst: sie hat ihn vielleicht verschoben, nicht entfernt.

Warum ist meine Szene selbst bei geringer Dichte langsam? Die üblichen Verdächtigen, der Reihe nach: Gras, das dynamische Schatten wirft, ein einzigartiges Material pro Variante, das Batching sabotiert, Cull-Distanzen auf unendlich, oder eine alpha-getestete LOD-Kette, die Overdraw stapelt. Jeder hat eine eigene Profiler-Signatur, prüfe vor dem Ändern, sonst behebst du den falschen.

Wie dicht ist „zu dicht" fürs Gameplay? Kampf-Lesbarkeit deckelt die Dichte, bevor es die Performance tut: verschwinden Silhouetten im Gewirr, geben Spieler dem Spiel die Schuld, nicht dem Dressing. Dicht in der Vista, moderat in der Arena ist das Muster, das sowohl den Profiler als auch den Playtest übersteht.

Soll ich backen oder prozedural lassen? Backe fürs Ausliefern: gebackene Instanzen profilen ehrlich und liefern ohne Laufzeit-Abhängigkeit aus. Halte das prozedurale Setup (Masken, Regeln, Seeds) in der Versionskontrolle, damit du nach einer Terrain-Änderung neu backen kannst, ohne die Arbeit von Hand zu wiederholen.

Dicht aussehend und schnell ist kein Widerspruch, es ist meist die Disziplin, fünf Dinge in der richtigen Reihenfolge zu tun und jedes mit derselben Kamera zu beweisen.