holodepth

Three.js · Görüntü sonrası · Performans

Efektlerin gizli maliyeti: GPU neden yorulur?

Çoğu post-processing geçişi tam ekran (full-screen pass) olarak çalışır: çıktı çözünürlüğünüz örneğin 1920×1080 ise tek bir geçiş bile yaklaşık 2.073.600 piksel için fragment işi üretir — her pikselde tampon okuma, hesaplama ve bir hedefe yazma maliyeti vardır. Zincire ikinci bir geçiş eklendiğinde bu tur çoğu zaman baştan tekrarlanır; üçüncüsünde yine. Bu yüzden «küçük görünen» efekt slider’ları kümülatif olarak GPU’yu boğabilir.

Tam ekran maliyetinin üzerine üç tip yük biner: doku okuma yoğunluğu, komşuluk genişliği ve başına piksel aritmetiği. Aşağıda bu üçünü kısaca açıyoruz; tampon ve geçiş ekonomisi için Render target · performans ile Efekt kombinasyonu · çok geçiş maliyeti başlıkları tamamlayıcı okumadır.

Doku okuma (texture sampling)

SSAO, DOF veya geniş çekirdekli bulanıklaştırma yalnızca «bu piksel»e bakmaz; her çıktı pikseli için komşu alanı tarar. Bu tarama, bellek bant genişliği üzerinde sürekli «gidip gelme» üretir — özellikle yüksek çözünürlük ve düşük önbellek dostu erişim düzenlerinde fark edilir.

Aritmetik karmaşıklık

Gerçekçi bokeh, çok örnekleme veya uzamsal filtreler başına piksel işlem sayısını hızla çoğaltır. Ton sıkıştırması gibi bazı adımlar görece ucuzken; çok komşulu bulanıklaştırma veya yoğun SSAO aynı çözünürlükte kat kat daha pahalı olabilir — tablo ve strateji bölümlerinde bu göreli sırayı netleştiriyoruz.

Maliyet tablosu: kim ne kadar yük getirir?

Aşağıdaki seviyeler tipik bir gerçek zamanlı web/proje bağlamında göreli sıralamayı özetler — kesin milisaniye rakamları donanıma, çözünürlüğe ve motor varyantına göre değişir. Profilde ölçmeden «DOF her zaman en pahalıdır» demek doğru olmayabilir; fakat A neden B’den sıklıkla ağırdır? sorusuna cevap verir.

Göreli maliyet özeti

Efekt Göreli seviye Neden pahalı?
Tone mapping Çok düşük Başına piksel birkaç matematiksel dönüşüm; geniş komşuluk taraması veya çoklu ara tampon turu içermez.
Bloom Orta Çoğu kurulumda parlama için düşük çözünürlükte özet tamponlar ve çok aşamalı bulanıklaştırma kullanılır — tek «ucuz shader» değildir.
SSAO Yüksek Derinlik (ve bazen normal) tamponundan yoğun örnekleme; örnek sayısı ve çözünürlük maliyeti dik yükseltir.
Depth of field Çok yüksek Gerçekçi bokeh veya geniş çekirdek bulanıklaştırma başına piksel komşuluk alanını genişletir.

Kendi sahneniz için tek doğru yöntem ölçmektir: ağır geçişleri tek tek kapatıp kare süresine bakmak. İlgili efekt sayfaları tasarım tuzaklarını anlatır; Bloom, SSAO ve DOF · performans bağlantıları teşhis sırasında kullanılır.

Optimizasyon stratejileri: sahneyi akıcı tutmak

Holodepth tarzı projelerde amaç aynı sahneyi hem masaüstünde hem mobilde «yağ gibi» akıtmaktır; tasarım kararı çoğu zaman görsel kaliteyi sıfırlamak değil, maliyeti doğru yere taşımaktır.

Downsampling (çözünürlük düşürme)

Bloom, SSAO veya DOF’u ana tampon çözünürlüğünde çözmek yerine 1/2 veya 1/4 ölçekte hesaplayıp yükseltmek, işlenen piksel sayısını kat kat düşürür — örnek olarak dörtte bir ölçekte alan dört kat küçülür; maliyet teorik olarak yaklaşık aynı oranda azalabilir (fiili sonuç filtreye bağlıdır). İnsan gözü yükseltme ve hafif yumuşatma ile birlikte çoğu durumda farkı tolere eder; yanlış ölçek seçimi ise halo veya titrek gölge üretir.

Yalnızca gerekli geçişler

«Hepsini aç» yaklaşımı düşük segmentte projeyi öldürür. Üretim pratiği: kalite profilleri (low / medium / high) veya gerçek zamanlı ölçülen kare süresine göre otomatik devre dışı bırakma — örneğin belirli bir eşiğin altında SSAO veya DOF’u kapatmak veya örnekleme sayısını düşürmek. Bu, kullanıcıya akıcılık hediye ederken sahneyi tamamen bozmaz.

Örnek sayısı ve yumuşatma dengesi

SSAO ve DOF’ta sample count ve yarıçap doğrudan GPU yükünü belirler. Aynı görsel hedefe bazen 32 yerine 16 örnek + kontrollü bir blur geçişi ile yaklaşılabilir — gürültü–maliyet takasıdır. Kaliteyi koruyup maliyeti düşürmenin sırrı çoğu zaman «daha çok örnek» değil, daha akıllı örnekleme + düşük çözünürlük + yükseltme kombinasyonudur.

Kritik karar: kalite mi, akıcılık mı?

Birçok etkileşimli üründe kullanıcı deneyimi, sabit duran güzel kareden çok sabit kare süresi ile ölçülür: düşük ve dalgalı kare hızı kontrol hissini, okuma hızını ve konforu bozar. Bu yüzden 30 FPS’de stabil ve öngörülebilir bir sahne, bazen 60 FPS hedefine yaklaşmak için sürekli titreşen bir sahneden daha «iyi» sayılır — rakamlar projenize göre değişir, fakat prensip budur.

Pratik altın kural: efekt ekledikçe tarayıcı geliştirici araçları, yerleşik profil çıktıları veya Stats.js gibi basit göstergelerle kare süresini izleyin. 60 Hz için teorik hedef yaklaşık 16,7 ms / karedir — ancak ekran yenilemesi, senkronizasyon ve diğer iş yükleri nedeniyle gerçek bütçe daha dardır; önemli olan eklediğiniz zincirin bu bütçeye ne kadarını «yedirdiğidir». Düşüş belirgin olduğunda ilk bakılacak yer çoğu zaman en geniş komşuluklu geçişlerdir — tipik olarak DOF veya yoğun SSAO.

Geçiş birleştirme (single-pass düşüncesi)

Özel shader yazımına güven varsa, iki bağımsız ShaderPass yerine tek geçişte bitişik matematik birleştirilebilir — örneğin parlama özetinin son bulanıklaştırması ile ton sıkıştırmasının aynı döngüde yapılması. Kazanç, ara yazımları ve geçiş başına bellek trafiğini azaltmaktır; maliyet ise bakım ve hata ayıklama karmaşıklığıdır.

Hazır kütüphane kullanıyorsanız her zaman mümkün olmayabilir; fakat «neden dört geçiş var?» sorusunun cevabı bazen tek bir birleşik geçiş olabilir — özellikle mobil bütçede.

Holodepth teknik notu

Performans ayıklamak için üç soru: (1) Maliyet gerçekten shader’da mı, yoksa gereksiz tampon kopyasında mı? (2) Ağır geçiş düşük çözünürlükte çözülüp yükseltilerek kabul edilebilir görünür mü? (3) Kalite profiline göre hangi iki efekt «olmazsa olmaz»? Ölçmeden optimizasyon yapmak, çoğu zaman yanlış slider’ı kısmaktır — Pass zinciri bağlamında düşünün.