Kort gezegd: dichte vegetatie wordt zelden alleen door triangle-aantallen gedood, want ze sterft aan duizend draw calls, overdraw van slordige alpha cards, en schaduwen waarvan niemand meer wist dat ze aanstonden. Besteed je moeite in deze volgorde: instancing eerst, cull-afstanden tweede, schaduwen derde, LOD's vierde, dichtheidsplaatsing vijfde, en verifieer elke stap met dezelfde vaste camera, één variabele per keer, of je leert niets. Deze gids behandelt elke fase met de profiler-signatuur die je vertelt dat het jouw probleem is.
Een echt bos rendert "gratis" omdat fysica massaal parallel is. Je GPU kan de look faken op 60 fps, maar alleen als je stopt met het saboteren van de machinerie die engines al meeleveren voor precies deze taak.
Het mentale model: vijf knelpunten, één volgorde
Vegetatieprestatie is niet één probleem, het zijn er vijf, en ze domineren in een voorspelbare volgorde. Draw calls binden eerst de CPU; de cull-afstand beslist hoeveel je de GPU überhaupt vraagt te tekenen; schaduwen verdubbelen stilletjes de kosten van alles dat ze werpt; LOD's en overdraw regeren de per-pixel-rekening; en dichtheidsplaatsing beslist hoeveel van dat alles je echt nodig had. Val ze in verkeerde volgorde aan en je optimaliseert iets dat niet het knelpunt was. De volgorde hieronder is die waarin de kosten echt bijten.
Instancing eerst, al het andere daarna
Eén boom 5.000 keer getekend is radicaal goedkoper dan 5.000 individuele bomen: beide engines batchen herhaalde meshes in instanced draws, en je eerste taak is simpelweg die machinerie niet saboteren.*
Unreal batcht via foliage en hierarchical instanced static meshes; Unity via GPU instancing en terreindetails. Wat het batchen stil breekt:
- vegetatie geplaatst als unieke actors/objecten in plaats van instances;
- materiaalvarianten per instance: gebruik per-instance-data (kleur, schaal) binnen één materiaal in plaats van een materiaal per look te maken;
- organisatorisch verspreide plaatsing, zodat de engine clusters niet als eenheden kan cullen.
De profiler-verrader is ondubbelzinnig: draw calls die schalen met het plantaantal. Als een bosaanzicht duizenden draw calls toont, fix dit voordat je iets anders aanraakt: niets verderop in deze lijst redt je, want je bent CPU-bound voordat de GPU zelfs start. Gezonde instanced vegetatie houdt draw calls in de lage honderden voor een heel bosaanzicht, ongeacht hoeveel duizenden planten erin staan.
Cull-afstanden zijn gratis geld
Gras hoeft niet op 800 meter te renderen: stel per-type cull-afstanden in (bodembedekking 30–60 m, struiken 100–200 m, alleen bomen verdienen lange afstanden) met fade-bereiken om het poppen te verbergen.*
Dit is de instelling met de hoogste waarde per minuut in de hele pipeline, en ze blijft routinematig op "oneindig" omdat ze daar standaard staat en niemand het merkt. De redenering is perceptueel: bodembedekking overspant minder dan één pixel lang voor 100 m: het draagt letterlijk niets bij aan het eindbeeld terwijl het elk frame nog vertices, overdraw en schaduwwerk kost. Verre bedekking hoort bij goedkopere systemen: de kleur van het terreinmateriaal, opake impostors, of gewoon het verre LOD van de terreinlaag in het juiste groen geschilderd.
Fade-bereiken (dithered of alpha) verbergen het uit-poppen zodat spelers de cull-afstand zelf nooit zien. Stem de fade net lang genoeg af om onzichtbaar te zijn en niet langer: een te lange fade betekent dat je twee representaties van dezelfde plant betaalt tijdens de crossfade.
Schaduwen: de stille helft van de rekening
Zet dynamische schaduwworp UIT voor kleine bodembedekking, houd hem voor bomen, en beperk hem op afstand voor struiken: grasschaduwen verdubbelen je kosten voor bijna nul visuele winst.*
Elke grasspriet in de schaduwpass wordt opnieuw getekend, vanuit het gezichtspunt van het licht. In dichte scènes kost de schaduwpass vaak evenveel als de base pass, wat betekent dat grasschaduwen de grootste enkele post in het hele vegetatiebudget kunnen zijn terwijl ze visueel niet te onderscheiden zijn van een simpele omgevingsverdonkering aan de basis van de pol. De fix is bijna gratis: schaduwworp uit voor bodembedekking, aan voor bomen (hun schaduwen doen echt compositorisch werk), afstandsbeperkt voor het tussenin. Check daarna de schaduwpass in je profiler ervoor en erna: het is meestal de grootste enkele winst na instancing, en het kost minuten.
LOD's: budgetteer de silhouet, niet de polygonen
Een goede vegetatie-LOD-keten behoudt de omtrek en slacht het interieur: verifieer overgangsafstanden op het oog, en optimaliseer het hardst het laatste mesh-LOD vóór de impostor, want dat is in beeld in elk breed shot.*
Bodemlaagplanten als deze zijn waar cull-afstand- en schaduwinstellingen het meest lonen: duizenden instances, elk bijna niets bijdragend voorbij een paar tientallen meter, elk verdubbelend in kosten als het een dynamische schaduw werpt.
Een praktische keten voor een hero-boom: volledige mesh → ~50 % interieurreductie (zelfde silhouet) → ~15 % met samengevoegde cards → opake impostor/billboard. Twee opmerkingen die echte pijn besparen:
- Zelfs in engines met gevirtualiseerde geometrie blijven verre impostors de moeite waard, want overdraw en schaduwen blijven echte kosten ongeacht hoe triangles betaald worden. Gevirtualiseerde geometrie lost het triangle-aantal op, niet de transparantiekosten.
- Transparantie is de vijand op afstand. Dichte alpha-tested cards stapelen overdraw precies waar de GPU het zwakst is: de middelste LOD's. Verkies mesh-bladeren van dichtbij en opake impostors van veraf; het alpha-zware midden is waar frame-tijd zich verstopt. Als één LOD mysterieus duur is, is het bijna altijd de transparante.
Overdraw: de kosten die je niet ziet
Overdraw is de GPU die dezelfde pixel meerdere keren shadet door gestapelde transparante oppervlakken: de specifieke vloek van vegetatie, onzichtbaar in het eindbeeld, en vaak de reden dat een "lichte" scène traag is.*
De meeste engines hebben een overdraw-visualisatiemodus; zet hem aan en kijk naar een grasveld. Als het wit gloeit, shade je elke pixel vijf of tien keer terwijl overlappende alpha cards zich opstapelen. Mitigaties: minder, grotere sprieten in plaats van veel dunne; opake geometrie waar het silhouet het toelaat; en agressief cullen van de cards die het minst bijdragen. Overdraw is de klassieke "mijn scène is traag maar niets ziet er duur uit"-boosdoener, want de triangles zijn goedkoop en de pixels worden vele malen betaald.
Dichtheid is een designbeslissing, geen sliderpositie
Dicht waar de speler loopt en kijkt, schaars waar niet: een band van 20 m rijk detail langs het pad leest als "overal weelderig" tegen een fractie van de uniforme kosten.*
Helling- en hoogtemaskers doen een deel hiervan automatisch (steile vlakken en verre plateaus hebben helemaal geen bodembedekking nodig), en clustering doet de rest: pollen met gaten renderen goedkoper dan uniforme vulling en ogen natuurlijker, zodat de prestatiewinst en de schoonheidswinst dezelfde kant op wijzen. Hier verdient plaatsingsgereedschap zijn kost: dichtheid schilderen met maskers en per-soort-regels, dan direct naar engine-native instances bakken, is het verschil tussen een middag en een week. Het is de kern van wat Numivo's scatter doet, en omdat het naar gewoon foliage en instanced meshes bakt, geldt elke techniek in dit artikel ongewijzigd voor het resultaat. Er zit geen plugin-runtime tussen jou en de standaardoptimalisaties; de gebakken scène is gewoon engine-content.
De profilingslus
Zelfde camera, zelfde aanzicht, één variabele per keer: meet GPU-frametijd, draw calls, de schaduwpass en overdraw na elke wijziging.*
Kies een vaste "budgetcamera" in je dichtste vista en screenshot de stats voor en na elke stap hierboven. De discipline telt omdat vegetatieoptimalisaties interacteren: een cull-afstand-wijziging verandert hoeveel instances de schaduwpass ziet; een LOD-wijziging verandert overdraw; een dichtheidswijziging verandert ze allemaal tegelijk. Willekeurige flythroughs produceren willekeurige getallen en onweerlegbare discussies over of een wijziging hielp. Vaste camera's produceren beslissingen die je kunt verdedigen. Houd de getallen in een gedeeld blad en de trendlijn vertelt je het verhaal dat een enkele meting niet kan.
Veldcijfers die het waard zijn te stelen
- Bodembedekking-cull: 30–60 m · struiken: 100–200 m · bomen: zichtlijn
- Draw calls voor een gezond instanced bosaanzicht: lage honderden
- Schaduwpass-aandeel in dichte scènes: vaak ~de helft van de vegetatiekosten, grasschaduwen uit is de goedkoopste grote winst die er is
- Padband-dressingbreedte die "overal weelderig" leest: ~20 m
- LOD-aantal voor een hero-boom: 3 mesh-LOD's + opake impostor
- Overdraw-doel voor gras: minder dan ~3× in de overdraw-weergave, niet de gloeiend-witte 8–10× van gestapelde alpha cards
Mini-FAQ
Maakt Nanite / gevirtualiseerde geometrie dit overbodig? Het verandert welke posten domineren, niet de discipline. Overdraw van alpha cards, schaduwkosten en per-instance-overhead blijven allemaal, en impostors op afstand lonen nog steeds. Meet op je doelhardware in plaats van aan te nemen dat de nieuwe tech jouw specifieke knelpunt oploste: het heeft het misschien verplaatst, niet verwijderd.
Waarom is mijn scène traag zelfs bij lage dichtheid? De gebruikelijke verdachten, op volgorde: gras dat dynamische schaduwen werpt, een uniek materiaal per variant dat batchen saboteert, cull-afstanden op oneindig, of een alpha-tested LOD-keten die overdraw stapelt. Elk heeft een aparte profiler-signatuur: check voor je wijzigt, of je fixt de verkeerde.
Hoe dicht is "te dicht" voor gameplay? Gevechtsleesbaarheid begrenst dichtheid voordat prestatie dat doet: als silhouetten in de rommel verdwijnen, geven spelers het spel de schuld, niet de dressing. Dicht in de vista, gematigd in de arena is het patroon dat zowel de profiler als de playtest overleeft.
Bakken of procedureel houden? Bak voor release: gebakken instances profilen eerlijk en releasen zonder runtime-afhankelijkheid. Houd de procedurele setup (maskers, regels, seeds) in versiebeheer zodat je na een terreinwijziging opnieuw kunt bakken zonder het werk met de hand over te doen.
Dicht-ogend en snel is geen tegenstelling: het is vooral de discipline van vijf dingen in de juiste volgorde doen en elk met dezelfde camera bewijzen.