holodepth

Three.js · Işık ve materyaller · Gölgeler

Gölgelerde performans optimizasyonu: kalite ve hız dengesi

Her gölge üreten ışık, sahneyi bir kez daha render etmek anlamına gelir; doğru sırayla küçük kesintilerle büyük kazanç sağlanır.

Three.js sahnelerinde gölgeler, GPU üzerindeki en maliyetli işlemlerden biridir. Unutulmaması gereken temel gerçek şudur: Her gölge üreten ışık, sahnenin baştan sona bir kez daha render edilmesi demektir (ışık türüne göre birden çok pass ile).

PointLight ≈ 6 render pass: Bir PointLight, küp haritası için altı yöne gölge ürettiği için sahnede genellikle en ağır yükü oluşturur. Önce ışık sayısını sınırlamak en büyük kazançtır.

Bağlam: Gölge girişi, Shadow map, Gölge türleri tablosu, Bias & Shadow Acne.

Gölge render mantığı (Shadow pass süreci)

Bu özet, gölgeler açıldığında GPU’nun ana kareye ek olarak hangi pass’leri çalıştırdığını gösterir. Tek kamera görüntüsü yetmez; ışık görüşünden derinlik toplanır, ana pass’te karşılaştırılır.

  1. Kamera

    Normal render (ekran görüntüsü)

    • Kamera sahneye bakar; tüm objeler çizilir.
    • Işık ve materyaller hesaplanır.

    Ana pass: Her karede yapılan zorunlu render.

  2. Işık

    Shadow render (derinlik pass’i)

    • Sahne, ışığın bakışından tekrar işlenir.
    • Yalnızca derinlik (depth) hesaplanır → shadow map.

    Amaç: “Işık bu noktayı görüyor mu?” sorusuna veri üretmek.

  3. Karşılaştırma

    Shadow test (ana pass içinde)

    Bu iki değer aynı yüzey noktasına aittir; biri kameradan, biri ışığın bakışından ölçülür.

    Kameradan görülen uzaklık Zpixel
    Shadow map’teki derinlik Zmap

    Zpixel > Zmap → nokta ışığın gördüğünden uzaktadır → gölge.

  4. PointLight

    Küresel ışık = 6 yön

    PointLight her yöne yayılır; gölge için sahne altı yönde ayrı render edilir (küp haritası).

    +X −X +Y −Y +Z −Z

    Tek bir PointLight, gölge için sahneyi 6 kez render eder — pratikte ek shadow pass maliyeti.

Kabaca render maliyeti

Normal sahne (kamera) 1
Directional / Spot (gölge açık) +1 (tek yön)
PointLight (gölge açık) +6 (küresel)

HoloDepth özeti:
Gölge = ekstra render maliyeti.
Işık sayısı arttıkça performans düşer.
Özellikle PointLight en pahalı senaryodur.

  • Her gölge üreten ışık, sahneyi bir veya birden fazla kez daha işler.
  • PointLight gölgesi tek ışıkta bile shadow pass ile en pahalı senaryolardan biridir.
Shadow pass: kamera pass’i + ışık derinlik pass’leri + piksel testi; PointLight için altı yönlük küp haritası.

Pass sayısı → sahne planı

Tablodaki rakamlar üst sınır düşüncesidir: her ek Directional veya Spot için en az bir gölge pass’i, her PointLight için altı yönlük küp beklenir. Gerçek maliyet castShadow kapsamı ve geometri yoğunluğuyla büyür. Profil alırken önce ışık sayısını, sonra mapSize ve frustumu oynayın; Shadow Playground bu sırayı somutlaştırmak için uygundur.

Performans etki hiyerarşisi (nereden başlamalıyım?)

Optimizasyon yaparken en büyük kazancı sağlayan faktörleri sırasıyla bilmek, vaktinizi doğru harcamanızı sağlar:

  1. Işık sayısı (özellikle PointLight) — öncelik çok yüksek: en büyük performans katili.
  2. Shadow map boyutu (mapSize)öncelik yüksek: piksel yoğunluğu ve bellek (VRAM).
  3. Gölge kamerası frustum’uöncelik yüksek: ışığın görüş alanının verimliliği.
  4. Gölge tipi seçimiöncelik orta: filtreleme algoritmasının yükü.
  5. castShadow / receiveShadowöncelik orta: obje bazlı mikro ayarlar.

Profilde aynı sırayı koruyun

FPS düşüşünü «gölge tipiyle düzeltelim» diye baştan PCF / VSM arasında gezinmek çoğu zaman zaman kaybıdır. Önce gölge üreten ışık sayısını ve PointLight yükünü düşürün; ardından harita boyutu ve kutu; en sonda filtre tipi ve ince bayraklar. Bu sıra hem bölüm 1 listesiyle hem sahne profiliyle örtüşür.

mapSize: gizli katlanma maliyeti

light.shadow.mapSize değerini artırırken matematiksel yükün farkında olun:

  • Geometrik artış: mapSize değerini 2 katına çıkardığınızda (ör. 512’den 1024’e), işlenen piksel sayısı 4 kat artar. Bu durum hem GPU işlem süresini hem de VRAM kullanımını aynı oranda şişirir.
  • Pratik takas: Çoğu zaman 2048 yerine 1024 kullanmak, görsel olarak fark edilmeyen ama FPS tarafında ciddi rahatlama sağlayan akıllıca bir seçimdir.

Kenar 2× → alan 4×

mapSize’ı büyütürken yalnızca çizgiyi değil kare alanıyı çoğalttığınızı aklınızda tutun; bellek ve fill oranı kabaca bundan etkilenir. Okuma için BasicShadowMap · mapSize bölümünü bu sayfanın hiyerarşisiyle birlikte kullanın.

Shadow camera (frustum) alanı

Gölge kamerasının kapsadığı alanı (frustum) daraltmak, kaliteyi çoğu zaman “bedavaya” artırır.

Alan ve keskinlik: Daha küçük bir alan, eldeki piksel sayısının (mapSize) daha yoğun bir bölgeye odaklanması demektir. Yani alanı daraltarak, mapSize’ı artırmadan çok daha keskin gölgeler elde edebilirsiniz.

Dar kutu, bias tarafına da nefes verir

Gölge kutusu gereksiz genişse aynı piksel sayısı büyük bir dünya hacmine yayılır; hem keskinlik düşer hem de acne / bias ayarı zorlaşır. Kutuyu sıkılaştırmak, çoğu ekipte önce harita ve frustum önerisiyle aynı yönde çalışır.

autoUpdate ve statik gölgeler

Sahnede her şeyin her karede güncellenmesi gerekmez.

Statik mod: Işıklar ve gölgelenen geometri gerçekten sabitse, renderer.shadowMap.autoUpdate = false ile gölge haritasını bir kez hesaplayıp dondurabilirsiniz. Hareket veya değişiklik olduğunda renderer.shadowMap.needsUpdate = true (ve gerektiğinde tekrar autoUpdate) ile yenilemek gerekir.

// Statik sahne — örnek
renderer.shadowMap.autoUpdate = false;
// Sahne veya ışık değişince bir kez:
renderer.shadowMap.needsUpdate = true;

Uyarı

Hareketli karakter veya dinamik obje varken gölgeyi dondurursanız, gölgeler objeyi takip etmez; sahne tutarlılığı bozulur. Bu mod yalnızca gerçekten statik kurulumlar içindir.

Seyrek güncelleme senaryosu

Ortam statik, yalnızca birkaç obje seyrek hareket ediyorsa tam kare dondurmak yerine değişim anında needsUpdate ile tek seferlik yenileme düşünülebilir — fakat uygulama detayı projeye göre değişir; hareketli kamera veya sürekli animasyonda autoUpdate = false açık unutulmamalıdır.

Shadow map tipi ve performans

Gölge tipi — kabaca kalite ve maliyet
Tip Kalite Performans
BasicShadowMap Düşük (sert) Çok hızlı
PCFShadowMap Orta Dengeli
PCFSoftShadowMap Yüksek (yumuşak) En pahalı

Not: VSMShadowMap farklı bir matematiksel yaklaşım kullandığı için performansı sahnenin karmaşıklığına ve donanıma göre değişken olabilir; ölçüm ve test ile kullanılmalıdır.

Tip seçimini listenin sonuna bırakın

Tablo, kalite ve maliyet için kabaca göreli bir sıralama sunar; donanım ve sahne tipine göre sapma normaldir. Işık sayısı ve harita bütçesi toparlanmadan yalnızca PCFSoft veya VSM maliyeti üzerinde dönmek, çoğu zaman ikinci planda kalmalıdır.

Seçici gölge yönetimi (cast & receive)

En basit optimizasyon bazen hiç işlem yapmamaktır: gereksiz yüzeyleri gölge hattından çıkarın.

  • Önemsiz objeler: Görünmeyen, çok küçük veya arka planda kalan nesnelerde gölgeyi tamamen kapatın (castShadow = false, receiveShadow = false).
  • Zemin kuralı: Zeminler çoğu zaman yalnızca gölge alır, gölge düşürmez. castShadow = false ile zemini gölge üretiminden çıkarmak, gereksiz yükü azaltır.

Zemin: çoğu zaman yalnızca alıcı

Zemin ağlarında castShadow = false bırakmak, gölgelerin hâlâ zeminde okunmasına izin verirken gereksiz occluder geometrisini derinlik pass’lerinden çıkarır. Bitki örtüsü veya dekoratif küçük öğelerde seçici bayraklar, düşük maliyetle stabil FPS sağlamanın en hızlı yollarından biridir.

HoloDepth performans checklist

Üretim öncesi akış

Aşağıdaki maddeleri kontrol ederek sahnenizi üretim seviyesine yaklaştırın; sıra, bölüm 1–6’daki öncelik hiyerarşisiyle uyumludur:

  • Sahnedeki gölge üreten ışık sayısı minimuma indirildi mi?
  • mapSize gereğinden büyük mü? (Örn. 1024 yeterliyken 2048 kullanılıyor mu?)
  • Shadow camera yalnızca ilgili objeleri kapsayacak kadar dar mı?
  • Gereksiz objelerde castShadow ve receiveShadow kapalı mı?

Artefakt taraması için Bias & Shadow Acne özeti; tür seçimi için gölge türleri tablosu.

Altın kural

En büyük performans kazancı, neredeyse her zaman ışık sayısını azaltmaktan gelir — özellikle çok pass üreten PointLight gölgelerinde.