Singkatnya: vegetasi lebat jarang mati oleh jumlah segitiga saja: ia mati oleh seribu draw call, overdraw dari kartu alfa yang sembrono, dan bayangan yang tak seorang pun ingat masih menyala. Habiskan usahamu dalam urutan ini: instancing dulu, jarak cull kedua, bayangan ketiga, LOD keempat, penempatan kepadatan kelima, dan verifikasi tiap langkah dengan kamera tetap yang sama, satu variabel sekali, atau kau takkan belajar apa pun. Panduan ini membahas tiap tahap dengan tanda profiler yang memberitahumu bahwa itu masalahmu.
Hutan sungguhan me-render "gratis" karena fisika sangat paralel. GPU-mu bisa memalsukan tampilan itu di 60 fps, tapi hanya jika kau berhenti mengalahkan mesin yang sudah dikirim engine tepat untuk pekerjaan ini.
Model mental: lima leher botol, satu urutan
Performa vegetasi bukan satu masalah, melainkan lima, dan mereka mendominasi dalam urutan yang bisa ditebak. Draw call mengikat CPU lebih dulu; jarak cull menentukan berapa banyak yang bahkan kau minta GPU gambar; bayangan diam-diam menggandakan biaya segala yang melemparkannya; LOD dan overdraw memerintah tagihan per piksel; dan penempatan kepadatan menentukan berapa dari semua itu yang benar-benar kau butuhkan. Serang mereka di luar urutan dan kau akan mengoptimasi sesuatu yang bukan leher botol. Urutan di bawah adalah urutan biaya benar-benar menggigit.
Instancing dulu, semua yang lain kedua
Satu pohon digambar 5.000 kali jauh lebih murah daripada 5.000 pohon individual: kedua engine membatch mesh berulang menjadi draw ter-instance, dan tugas pertamamu sekadar tidak mengalahkan mesin itu.
Unreal membatch lewat foliage dan hierarchical instanced static meshes; Unity lewat GPU instancing dan detail terrain. Yang diam-diam mematahkan batching:
- vegetasi ditempatkan sebagai aktor/objek unik alih-alih instance;
- varian material per-instance: pakai data per-instance (warna, skala) di dalam satu material alih-alih membuat material per tampilan;
- penempatan tersebar secara organisasi sehingga engine tak bisa cull klaster sebagai unit.
Tanda profiler tak ambigu: draw call menskala dengan jumlah tanaman. Jika sebuah tampilan hutan menunjukkan ribuan draw call, perbaiki ini sebelum menyentuh apa pun yang lain: tak ada di bawah daftar ini yang menyelamatkanmu, karena kau CPU-bound bahkan sebelum GPU mulai. Vegetasi ter-instance yang sehat menahan draw call di ratusan rendah untuk seluruh tampilan hutan, tak peduli berapa ribu tanaman di dalamnya.
Jarak cull adalah uang gratis
Rumput tak perlu me-render pada 800 meter: atur jarak cull per tipe (penutup tanah 30–60 m, semak 100–200 m, hanya pohon yang layak jarak jauh) dengan rentang fade untuk menyembunyikan pop.
Ini pengaturan bernilai-per-menit tertinggi di seluruh pipeline, dan rutin ditinggalkan di "tak terhingga" karena default-nya di sana dan tak ada yang sadar. Alasannya perseptual: penutup tanah membentang kurang dari satu piksel jauh sebelum 100 m: ia benar-benar tak menyumbang apa pun ke gambar akhir sambil masih memakan vertex, overdraw, dan kerja bayangan tiap frame. Cakupan jauh milik sistem lebih murah: warna material terrain, impostor opak, atau sekadar LOD jauh lapisan terrain yang dicat hijau yang tepat.
Rentang fade (dithered atau alfa) menyembunyikan pop-out agar pemain tak pernah melihat jarak cull itu sendiri. Setel fade cukup panjang untuk tak terlihat dan tak lebih: fade terlalu panjang berarti kau membayar dua representasi tanaman sama selama crossfade.
Bayangan: separuh senyap dari tagihan
Matikan pelemparan bayangan dinamis untuk penutup tanah kecil, pertahankan untuk pohon, dan batasi jaraknya untuk semak: bayangan rumput menggandakan biayamu untuk untung visual mendekati nol.
Tiap helai rumput dalam pass bayangan digambar lagi, dari sudut pandang cahaya. Di adegan lebat pass bayangan sering memakan sebanyak pass dasar, yang berarti bayangan rumput bisa jadi item tunggal terbesar di seluruh anggaran vegetasi sementara secara visual tak terbedakan dari penggelapan ambien sederhana di dasar rumpun. Perbaikannya nyaris gratis: pelemparan bayangan mati untuk penutup tanah, hidup untuk pohon (bayangannya melakukan kerja komposisi sungguhan), dibatasi jarak untuk yang di antara. Lalu cek pass bayangan di profiler-mu sebelum dan sesudah: biasanya kemenangan tunggal terbesar setelah instancing, dan makan menit.
LOD: anggarkan siluet, bukan poligon
Rantai LOD vegetasi yang baik menjaga garis luar dan membantai bagian dalam: verifikasi jarak transisi dengan mata, dan optimasi paling keras mesh LOD terakhir sebelum impostor, karena itulah yang di layar di tiap bidikan lebar.
Tanaman lapisan tanah seperti ini adalah tempat pengaturan jarak cull dan bayangan paling membayar: ribuan instance, masing-masing menyumbang nyaris nol melampaui beberapa puluh meter, masing-masing berlipat biaya jika melempar bayangan dinamis.
Rantai praktis untuk pohon hero: mesh penuh → reduksi bagian dalam ~50 % (siluet sama) → ~15 % dengan kartu tergabung → impostor/billboard opak. Dua catatan yang menghemat derita nyata:
- Bahkan di engine dengan geometri tervirtualisasi, impostor jauh tetap sepadan, karena overdraw dan bayangan tetap biaya nyata tak peduli bagaimana segitiga dibayar. Geometri tervirtualisasi menyelesaikan jumlah segitiga, bukan biaya transparansi.
- Transparansi adalah musuh di kejauhan. Kartu alpha-tested lebat menumpuk overdraw tepat di tempat GPU paling lemah: LOD tengah. Utamakan daun mesh dari dekat dan impostor opak dari jauh; tengah yang berat-alfa adalah tempat waktu frame bersembunyi. Jika satu LOD misterius mahal, hampir selalu yang transparan.
Overdraw: biaya yang tak bisa kau lihat
Overdraw adalah GPU meng-shade piksel sama berkali-kali lewat permukaan transparan yang menumpuk: kutukan spesifik vegetasi, tak terlihat di gambar akhir, dan sering alasan adegan "ringan" lambat.
Kebanyakan engine punya mode visualisasi overdraw; nyalakan dan lihat ladang rumput. Jika bersinar putih, kau meng-shade tiap piksel lima atau sepuluh kali saat kartu alfa yang tumpang tindih menumpuk. Mitigasi: helai lebih sedikit, lebih besar alih-alih banyak yang tipis; geometri opak di tempat siluet mengizinkan; dan cull agresif kartu yang menyumbang paling sedikit. Overdraw adalah tersangka klasik "adeganku lambat tapi tak ada yang tampak mahal", karena segitiga murah dan piksel dibayar berkali-kali.
Kepadatan adalah keputusan desain, bukan posisi slider
Lebat di tempat pemain berjalan dan melihat, jarang di tempat tidak: pita 20 m detail kaya sepanjang jalan terbaca "subur di mana-mana" dengan biaya sebagian dari biaya seragam.
Mask lereng dan ketinggian melakukan sebagian ini otomatis (muka curam dan plato jauh tak butuh penutup tanah sama sekali), dan clustering melakukan sisanya: rumpun bercelah me-render lebih murah dari isian seragam dan tampak lebih alami, sehingga kemenangan performa dan kemenangan keindahan menunjuk arah sama. Di sinilah perkakas penempatan membayar diri: melukis kepadatan dengan mask dan aturan per-spesies, lalu memanggang langsung ke instance native engine, adalah beda antara satu sore dan seminggu. Itu inti dari yang scatter Numivo lakukan, dan karena ia memanggang ke foliage biasa dan mesh ter-instance, tiap teknik di artikel ini berlaku tanpa perubahan ke hasilnya. Tak ada runtime plugin antara kau dan optimasi standar; adegan terpanggang hanyalah konten engine.
Loop profiling
Kamera sama, tampilan sama, satu variabel sekali: ukur waktu frame GPU, draw call, pass bayangan, dan overdraw setelah tiap perubahan.
Pilih "kamera anggaran" tetap di vista terpadatmu dan tangkap-layar statistik sebelum dan sesudah tiap langkah di atas. Disiplin penting karena optimasi vegetasi berinteraksi: perubahan jarak cull mengubah berapa instance yang dilihat pass bayangan; perubahan LOD mengubah overdraw; perubahan kepadatan mengubah semuanya sekaligus. Terbang acak menghasilkan angka acak dan argumen tak-terfalsifikasi soal apakah suatu perubahan membantu. Kamera tetap menghasilkan keputusan yang bisa kau bela. Simpan angka di lembar bersama dan garis tren memberitahumu cerita yang satu pengukuran tak bisa.
Angka lapangan yang layak dicuri
- Cull penutup tanah: 30–60 m · semak: 100–200 m · pohon: garis pandang
- Draw call untuk tampilan hutan ter-instance yang sehat: ratusan rendah
- Porsi pass bayangan di adegan lebat: sering ~separuh biaya vegetasi, karena bayangan rumput mati adalah kemenangan besar termurah yang ada
- Lebar pita dressing jalan yang terbaca "subur di mana-mana": ~20 m
- Jumlah LOD untuk pohon hero: 3 mesh LOD + impostor opak
- Target overdraw untuk rumput: kurang dari ~3× di tampilan overdraw, bukan 8–10× putih menyala dari kartu alfa bertumpuk
Mini-FAQ
Apakah Nanite / geometri tervirtualisasi membuat ini usang? Ia mengubah baris mana yang mendominasi, bukan disiplin. Overdraw dari kartu alfa, biaya bayangan, dan overhead per-instance semuanya tetap, dan impostor di kejauhan tetap membayar. Ukur di perangkat keras targetmu alih-alih mengasumsikan teknologi baru menyelesaikan leher botol spesifikmu, ia mungkin memindahkannya, bukan menghapusnya.
Kenapa adeganku lambat bahkan pada kepadatan rendah? Tersangka biasa, berurutan: rumput melempar bayangan dinamis, material unik per varian mengalahkan batching, jarak cull di tak terhingga, atau rantai LOD alpha-tested menumpuk overdraw. Masing-masing punya tanda profiler berbeda: cek sebelum mengubah, atau kau memperbaiki yang salah.
Seberapa "terlalu lebat" untuk gameplay? Keterbacaan tempur membatasi kepadatan sebelum performa: jika siluet lenyap ke dalam kekacauan, pemain menyalahkan game, bukan dressing. Lebat di vista, sedang di arena adalah pola yang bertahan baik dari profiler maupun playtest.
Panggang atau tetap prosedural? Panggang untuk rilis: instance terpanggang mem-profile jujur dan rilis tanpa ketergantungan runtime. Simpan setup prosedural (mask, aturan, seed) di kontrol versi agar kau bisa memanggang ulang setelah perubahan terrain tanpa mengulang kerja dengan tangan.
Tampak lebat dan cepat bukan kontradiksi: ia terutama disiplin melakukan lima hal dalam urutan benar dan membuktikan tiap satu dengan kamera sama.