Tüm yazılar
Eğitimler · 8 min read

Kare hızı faturası olmadan yoğun bitki örtüsü: pratik bir rehber

Bir sahneyi bitki örtüsüyle doldurup hızlı tutmanın yolu: instancing, cull mesafeleri, LOD stratejisi, gölge maliyetleri, overdraw, yoğunluk yerleşimi ve her optimizasyonun gerçekten kazandırdığını kanıtlayan sabit kamera profilleme döngüsü.

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

Kısaca: yoğun bitki örtüsünü nadiren yalnız üçgen sayısı öldürür: bin draw call, özensiz alfa kartlarından overdraw ve kimsenin açık olduğunu hatırlamadığı gölgelerden ölür. Çabanı şu sırayla harca: önce instancing, ikinci cull mesafeleri, üçüncü gölgeler, dördüncü LOD'lar, beşinci yoğunluk yerleşimi, ve her adımı aynı sabit kamerayla, bir kerede bir değişken, doğrula, yoksa hiçbir şey öğrenmezsin. Bu rehber, her aşamayı sana "bu senin sorunun" diyen profiler imzasıyla kapsar.

Sakin bir dereye yansıyan yoğun orman örtüsü Gerçek bir orman "bedavaya" render olur çünkü fizik devasa paralel. GPU'n bu görünümü 60 fps'te taklit edebilir, ama yalnız motorların tam bu iş için zaten gönderdiği makineyi sabote etmeyi bırakırsan.

Zihinsel model: beş darboğaz, bir sıra

Bitki örtüsü performansı tek bir sorun değil, beş sorundur ve öngörülebilir bir sırayla baskındır. Draw call'lar önce CPU'yu bağlar; cull mesafesi GPU'dan çizmesini istediğin miktarı belirler; gölgeler onları düşüren her şeyin maliyetini sessizce ikiye katlar; LOD'lar ve overdraw piksel başına faturayı yönetir; ve yoğunluk yerleşimi bütün bunların ne kadarına gerçekten ihtiyacın olduğunu belirler. Onlara yanlış sırayla saldır, darboğaz olmayan bir şeyi optimize edersin. Aşağıdaki sıra, maliyetlerin gerçekten ısırdığı sıradır.

Önce instancing, sonra her şey

5.000 kez çizilen bir ağaç, 5.000 ayrı ağaçtan radikal biçimde daha ucuzdur, çünkü her iki motor da tekrarlanan meshleri instance edilmiş çizimlere gruplar ve ilk işin sadece o makineyi sabote etmemektir.

Unreal foliage ve hierarchical instanced static meshes ile gruplar; Unity GPU instancing ve arazi detaylarıyla. Gruplamayı sessizce kıran:

  • benzersiz aktörler/nesneler olarak yerleştirilmiş bitki örtüsü, instance yerine;
  • instance başına malzeme varyantları: her görünüm için malzeme yazmak yerine tek bir malzeme içinde instance başına veri (renk, ölçek) kullan;
  • organizasyonel olarak dağıtılmış yerleşim, öyle ki motor kümeleri birim olarak cull edemez.

Profiler işareti nettir: bitki sayısıyla ölçeklenen draw call'lar. Bir orman görünümü binlerce draw call gösteriyorsa, başka her şeye dokunmadan önce bunu düzelt: bu listenin daha aşağısındaki hiçbir şey seni kurtarmaz, çünkü GPU daha başlamadan CPU-bound'sun. Sağlıklı instance edilmiş bitki örtüsü, içinde kaç bin bitki olursa olsun tüm bir orman görünümü için draw call'ları düşük yüzlerde tutar.

Cull mesafeleri bedava paradır

Çimenin 800 metre uzakta render olmasına gerek yok: pop'u gizlemek için fade aralıklarıyla tip başına cull mesafeleri (yer örtüsü 30–60 m, çalılar 100–200 m, yalnız ağaçlar uzun mesafeleri hak eder) ayarla.

Bu, tüm pipeline'daki dakika başına en yüksek değerli ayardır ve rutin olarak "sonsuz"da bırakılır çünkü varsayılan orada ve kimse fark etmez. Gerekçe algısaldır: yer örtüsü 100 m'den çok önce bir pikselden azını kaplar, nihai görüntüye tam anlamıyla hiçbir şey katmazken her kare hâlâ vertex, overdraw ve gölge işi harcar. Uzak kaplama daha ucuz sistemlere aittir: arazi malzemesinin rengi, opak impostorlar ya da yalnızca doğru yeşile boyanmış arazi katmanının uzak LOD'u.

Fade aralıkları (dithered ya da alfa) pop-out'u gizler, böylece oyuncular cull mesafesinin kendisini asla görmez. Fade'i görünmez olmaya tam yetecek kadar uzun ayarla, daha fazla değil, çünkü aşırı uzun bir fade, crossfade sırasında aynı bitkinin iki temsili için ödeme yaptığın anlamına gelir.

Gölgeler: faturanın sessiz yarısı

Küçük yer örtüsü için dinamik gölge düşürmeyi KAPAT, ağaçlar için tut ve çalılar için mesafeyle sınırla, çünkü çimen gölgeleri neredeyse sıfır görsel kazanç için maliyetini ikiye katlar.

Gölge geçişindeki her çim yaprağı, ışığın bakış açısından tekrar çizilir. Yoğun sahnelerde gölge geçişi çoğu zaman temel geçiş kadar maliyetlidir: bu, çimen gölgelerinin tüm bitki örtüsü bütçesindeki en büyük tek kalem olabileceği anlamına gelirken, kümenin dibindeki basit bir ortam kararmasından görsel olarak ayırt edilemezler. Düzeltme neredeyse bedava: yer örtüsü için gölge düşürme kapalı, ağaçlar için açık (gölgeleri gerçek kompozisyon işi yapar), aradakiler için mesafeyle sınırlı. Sonra profilerında gölge geçişini önce ve sonra kontrol et, çünkü genellikle instancing'den sonraki en büyük tek kazançtır ve dakikalar sürer.

LOD'lar: silueti bütçele, poligonları değil

İyi bir bitki örtüsü LOD zinciri dış hatları korur ve içi doğrar. Geçiş mesafelerini gözle doğrula ve impostordan önceki son mesh LOD'unu en sert optimize et, çünkü her geniş çekimde ekranda olan odur.

Bir patika boyunca orman zemininde eğrelti otları ve çalılık Bunun gibi zemin katmanı bitkileri, cull mesafesi ve gölge ayarlarının en çok kazandırdığı yerdir: binlerce instance, her biri birkaç düzine metre ötesinde neredeyse hiçbir şey katmaz, her biri dinamik gölge düşürürse maliyette ikiye katlanır.

Kahraman bir ağaç için pratik bir zincir: tam mesh → ~%50 iç azaltma (aynı siluet) → birleştirilmiş kartlarla ~%15 → opak impostor/billboard. Gerçek acıyı önleyen iki not:

  • Sanallaştırılmış geometrili motorlarda bile uzak impostorlar değerli kalır, çünkü overdraw ve gölgeler üçgenlerin nasıl ödendiğine bakılmaksızın gerçek maliyet olmayı sürdürür. Sanallaştırılmış geometri üçgen sayısını çözer, şeffaflık maliyetini değil.
  • Şeffaflık mesafede düşmandır. Yoğun alpha-tested kartlar, GPU'nun en zayıf olduğu yerde (ortadaki LOD'larda) overdraw yığar. Yakında mesh yapraklarını, uzakta opak impostorları tercih et; alfa-ağır orta, kare süresinin saklandığı yerdir. Bir LOD gizemli biçimde pahalıysa, neredeyse her zaman şeffaf olanıdır.

Overdraw: göremediğin maliyet

Overdraw, GPU'nun aynı pikseli üst üste yığılmış şeffaf yüzeyler boyunca birden çok kez gölgelemesidir: bitki örtüsünün özgül laneti, nihai görüntüde görünmez ve çoğu zaman "hafif" bir sahnenin yavaş olmasının nedeni.

Çoğu motorda bir overdraw görselleştirme modu vardır; aç ve bir çim tarlasına bak. Beyaz parlıyorsa, üst üste binen alfa kartları yığılırken her pikseli beş ya da on kez gölgeliyorsun. Hafifletmeler: çok sayıda ince yerine daha az, daha büyük yaprak; silüetin izin verdiği yerde opak geometri; ve en az katkıda bulunan kartların agresif cull'lanması. Overdraw, "sahnem yavaş ama hiçbir şey pahalı görünmüyor"un klasik suçlusudur, çünkü üçgenler ucuz ve pikseller defalarca ödeniyor.

Yoğunluk bir tasarım kararıdır, bir kaydırıcı konumu değil

Oyuncunun yürüdüğü ve baktığı yerde yoğun, olmadığı yerde seyrek: patika boyunca 20 m'lik zengin detay bandı, tekdüze maliyetin bir kısmıyla "her yerde gür" okunur.

Eğim ve yükseklik maskeleri bunun bir kısmını otomatik yapar (dik yüzler ve uzak platolar hiç yer örtüsüne ihtiyaç duymaz) ve kümeleme gerisini yapar, çünkü boşluklu kümeler tekdüze doldurmadan daha ucuz render olur ve daha doğal görünür, öyle ki performans kazancı ve güzellik kazancı aynı yönü gösterir. Yerleşim araçları burada hakkını verir: yoğunluğu maskeler ve tür başına kurallarla boyamak, sonra doğrudan motor-yerel instance'lara pişirmek, bir öğleden sonra ile bir hafta arasındaki farktır. Numivo'nun scatter'ı'nın yaptığının çekirdeğidir, ve sıradan foliage ve instance edilmiş meshlere pişirdiği için, bu makaledeki her teknik sonuca değişmeden uygulanır. Seninle standart optimizasyonlar arasında bir eklenti runtime'ı yoktur; pişmiş sahne sadece motor içeriğidir.

Profilleme döngüsü

Aynı kamera, aynı görünüm, bir kerede bir değişken: her değişiklikten sonra GPU kare süresini, draw call'ları, gölge geçişini ve overdraw'ı ölç.

En yoğun manzaranda sabit bir "bütçe kamerası" seç ve yukarıdaki her adımdan önce ve sonra istatistikleri ekran görüntüsü al. Disiplin önemlidir çünkü bitki örtüsü optimizasyonları etkileşir: bir cull mesafesi değişikliği gölge geçişinin kaç instance gördüğünü değiştirir; bir LOD değişikliği overdraw'ı değiştirir; bir yoğunluk değişikliği hepsini birden değiştirir. Rastgele uçuşlar rastgele sayılar ve bir değişikliğin yardım edip etmediği üzerine yanlışlanamaz tartışmalar üretir. Sabit kameralar savunabileceğin kararlar üretir. Sayıları paylaşılan bir sayfada tut, trend çizgisi sana tek bir ölçümün anlatamayacağı hikâyeyi anlatır.

Çalmaya değer saha rakamları

  • Yer örtüsü cull: 30–60 m · çalılar: 100–200 m · ağaçlar: görüş hattı
  • Sağlıklı instance edilmiş bir orman görünümü için draw call'lar: düşük yüzler
  • Yoğun sahnelerde gölge geçişi payı: çoğu zaman bitki maliyetinin ~yarısı, çimen gölgeleri kapalı, var olan en ucuz büyük kazançtır
  • "Her yerde gür" okuyan patika bandı dressing genişliği: ~20 m
  • Kahraman bir ağaç için LOD sayısı: 3 mesh LOD + opak impostor
  • Çimen için overdraw hedefi: overdraw görünümünde ~3×'ten az, yığılmış alfa kartlarının parlak-beyaz 8–10×'i değil

Mini-SSS

Nanite / sanallaştırılmış geometri bunu geçersiz kılar mı? Hangi kalemlerin baskın olduğunu değiştirir, disiplini değil. Alfa kartlarından overdraw, gölge maliyeti ve instance başına ek yük hepsi kalır, ve mesafedeki impostorlar hâlâ kazandırır. Yeni teknolojinin senin özel darboğazını çözdüğünü varsaymak yerine hedef donanımında ölç, çünkü onu kaldırmamış, taşımış olabilir.

Sahnem düşük yoğunlukta bile neden yavaş? Her zamanki şüpheliler, sırayla: dinamik gölge düşüren çimen, gruplamayı sabote eden varyant başına benzersiz malzeme, sonsuzda cull mesafeleri ya da overdraw yığan alpha-tested bir LOD zinciri. Her birinin ayrı bir profiler imzası var, değiştirmeden önce kontrol et, yoksa yanlışını düzeltirsin.

Oynanış için ne kadar "fazla yoğun"? Çatışma okunabilirliği yoğunluğu performanstan önce sınırlar: siluetler dağınıklığa karışırsa, oyuncular dressing'i değil oyunu suçlar. Manzarada yoğun, arenada orta, hem profileri hem oyun testini atlatan desendir.

Pişireyim mi yoksa prosedürel mi tutayım? Sevkiyat için pişir: pişmiş instance'lar dürüstçe profillenir ve runtime bağımlılığı olmadan çıkar. Prosedürel kurulumu (maskeler, kurallar, tohumlar) sürüm kontrolünde tut ki arazi değişikliğinden sonra işi elle yeniden yapmadan yeniden pişirebilesin.

Yoğun görünen ve hızlı bir çelişki değildir: çoğunlukla beş şeyi doğru sırayla yapmanın ve her birini aynı kamerayla kanıtlamanın disiplinidir.