Three.js · Varlık optimizasyonu · Performans
CPU ve GPU darboğazı (bottleneck)
Bir 3D sahnenin akıcılığı, işlemci (CPU) ve ekran kartının (GPU) uyum içinde çalışmasına bağlıdır — tıpkı bir bayrak yarışında olduğu gibi: hızı her zaman en yavaş halka belirler.
Darboğaz şudur: CPU bir kareyi hazırlamak için 20 ms harcıyor ama GPU çizmek için yalnızca 5 ms gerektiriyorsa, sistem en fazla yaklaşık 50 FPS verebilir. GPU ne kadar güçlü olursa olsun, CPU tarafındaki tavanı aşamazsınız.
Bu sayfa GPU tarafındaki overdraw ve draw call / materyal konularına köprü kurar: sorun hangi taraftaysa, doğru optimizasyon farklıdır.
Darboğaz (bottleneck) nedir?
Her karede motor; sahneyi günceller, komutları üretir ve GPU’ya iletir. Bu zincirin herhangi bir adımı yavaşladığında, kare süresi (frame time) uzar ve FPS düşer.
Pratik kural: «Nerede vakit harcanıyor?» sorusunu cevaplamadan «poligon kırp» veya «doku sıkıştır» demek, çoğu zaman yanlış sıraya optimizasyon yapmak demektir.
Frame Time Split Visualizer
CPU
—
GPU
—
FPS
Capped at 240 for demo
—
Kural
frame time = max(CPU ms,GPU ms)
FPS ≈ 1000 frame time
Frame time (max)
—
İpucu
Bound
Bağ: Bu panel tek başına §2 (CPU), §3 (GPU) ve §4 (teşhis) sezgisini verir: bir taraf yükselince diğer tarafı optimize etmek tek başına yetmez; tavanı belirleyen en yavaş taraftır.
CPU darboğazı: yönetim ve karar merkezi
İşlemci, sahnenin «beyni»dir: animasyonu ilerletir, sahne ağacını dolaşır, görünürlük / seçim mantığını çalıştırır ve GPU’ya iletilecek çizim komutlarını üretir. FPS sorununuz CPU kaynaklıysa, yalnızca poligonları azaltmak çoğu zaman hiçbir işe yaramaz — çünkü tavan genelde «kaç üçgen var?» değil, «kare başına CPU kaç ms harcıyor?» sorusudur.
Aşağıdaki belirtiler, §4 tablosundaki «çözünürlük testi» ile aynı yönde okunur; fark şudur: burada neden ve hangi iş yükü tipi olduğunu netleştiriyoruz.
Belirtiler
- Kamera sabitken bile düşük FPS: Görüntüleme yükünü değiştirmeden kare süresi uzuyorsa, iş çoğu zaman hâlâ CPU tarafında (mantık, komut üretimi, sahne güncellemesi) demektir.
- Çözünürlük düşürünce belirgin iyileşme yok: 1080p → 480p gibi adımlar piksel sayısını azaltır; GPU bağlı bir tavanda genelde fark edilir. Fark yoksa, darboğaz büyük olasılıkla CPU veya GPU’dan bağımsız bir «sabit maliyet» (ör. ağır betik, aşırı GC, senkron ağ) da olabilir — yine de ilk adım CPU profilidir.
Olası nedenler
- Aşırı draw call: Her çağrı; durum değişimi, kayıt hazırlığı ve sürücüye iletim maliyeti taşır. GPU hızlı olsa bile «komut üretmek» CPU’da tıkanır. Pratik çözüm yönü: materyal / çağrı disiplini, birleştirme, instancing, gereksiz materyal çeşitliliğini azaltmak.
- Karmaşık sahne grafiği: Çok derin parent–child hiyerarşilerinde her karede dünya matrislerinin yayılması (matrix propagation) pahalıdır. Özellikle dinamik objeler çoğaldıkça, «görünmeyen» dallarda bile güncelleme yapılıyorsa maliyet büyür.
- Fizik ve mantık: Çarpışma çiftleri, sürekli raycast, ağır AI karar ağaçları veya tek iş parçacığında bloklayan işler kare süresini uzatır; grafik ayarından bağımsız görünür.
- Traversing (ağacı tarama): Her karede tüm sahneyi koşulsuz gezmek, culling / dirty bayrakları olmadan yapılırsa CPU’da sabit bir vergi oluşturur. Hedef: «değişmeyen dalı yeniden işleme» disiplinidir.
GPU darboğazı: üretim ve boyama merkezi
Ekran kartı, sahnenin «işçisi»dir: CPU’nun verdiği çalışmayı piksel piksel üretir. Sorun GPU kaynaklıysa, kod kalitesi yükselse bile donanımın doldurma ve hesap hızı tavanına çarparsınız; yani «daha iyi yazdım» ile «daha hızlı boyadı» aynı şey değildir.
Bu bölümdeki belirtiler, §4 tablosunda özellikle «çözünürlük / sahne yoğunluğu» satırlarıyla örtüşür; burada amaç, GPU tarafında hangi alt tür (vertex vs fragment vs bellek) ihtimalinin öne çıktığını ayırmaktır.
Belirtiler
- Çözünürlük düşünce FPS sıçraması: Piksel sayısı azalınca yükün ciddi şekilde düşmesi, fill rate ve/veya piksel başına shader maliyeti ihtimalini güçlendirir.
- Sahne içeriğine duyarlı dalgalanma: Boş alana bakınca raharlama, yoğun geometri + ağır materyal + doku kombinasyonuna dönünce tekrar sıkışma genelde GPU’nun «ne kadar şey boyuyorum?» sorusuna bağlıdır (bazen saf geometri, bazen piksel ağırlığı).
Olası nedenler
- Yüksek poligon (vertex bound): Çok fazla üçgen; vertex shader ve vertex verisi taşıma maliyeti. Zemin okuma: geometri karmaşıklığı ve LOD stratejileri.
- Ağır shader (fragment bound): Işık sayısı, gölge haritaları, PBR zinciri veya pahalı efektler; piksel başına matematik patlar. Zemin: materyal optimizasyonu.
- Büyük / çok sayıda doku: VRAM baskısı, anizotropik örnekleme, filtreleme ve bant genişliği. «Diskte küçük» olup «GPU’da geniş» olabilen durumlar da vardır — doku stratejisini ayrı ele alın.
- Overdraw: Aynı pikselin üst üste defalarca boyanması; poligondan bağımsız olarak fill rate tüketir. Şeffaf katmanlar ve partiküller tipik tetikleyicidir.
Teşhis: düşüş nereden geliyor?
HoloDepth projelerinde sorunu bulmak için aşağıdaki hızlı testleri uygulayın. Sonuçlar kesin profil değildir; ama «önce hangi tarafı ölçelim?» sorusunda yön verir.
| Test | Sonuç | Teşhis (ilk tahmin) |
|---|---|---|
| Çözünürlüğü düşür | FPS artmıyor | CPU darboğazı |
| Çözünürlüğü düşür | FPS artıyor | GPU darboğazı |
| Tüm dokuları kaldır / düşür | FPS artıyor | GPU (doku / VRAM) baskısı |
| Objeleri birleştir (merge) / batch | FPS artıyor | CPU (draw call) baskısı |
Görünürlüğü (visible) kapat |
FPS artıyor | İkisi de olabilir — daha detaylı analiz gerekir |
Kritik hata: yanlış optimizasyon
Birçok geliştirici sahne kasıldığında hemen «poligonları azaltalım» der. Oysa sahnede örneğin 2.000 adet düşük poligonlu (ör. 10 tris) küp varsa, sorun çoğu zaman poligon değil, 2.000 ayrı draw call yüküdür. Bu durumda poligon azaltmak neredeyse hiçbir şeyi değiştirmez; çözüm instancing, birleştirilmiş geometri veya batching ile çizim kimliği sayısını düşürmektir.
Poligon bütçesi için zemin: Geometri karmaşıklığı sayfası.
HoloDepth teknik notu: Frame time takibi
FPS yanıltır; kare süresine bakın
FPS (kare sayısı) tek başına yanıltıcı olabilir. Gerçek analiz için frame time (kare süresi, ms) değerine bakın.
- 16,6 ms: 60 FPS hedefi (tipik üst sınır hedefi).
- 33,3 ms: 30 FPS — birçok web deneyimi için kabul edilebilir alt sınır.
Örnek: CPU tarafınız 25 ms alıyorsa, GPU dünyanın en hızlısı olsa bile 60 FPS alamazsınız — tavanı CPU koyar.