holodepth

Three.js · Performans · Draw call · Birleştirme

Scene merge (batching): Performans için objeleri birleştirmek

Scene merge / batching, çok sayıda bağımsız mesh’i mümkün olduğunca az sayıda çizim yoluna indirgeme çabasını anlatır: amaç tek başına «daha çok üçgen», aynı zamanda CPU’nun sahneyi yönetme ve GPU’ya komut gönderme maliyetini düşürmektir.

Sıra: önce darboğazın ne olduğu, sonra kazanç özeti, bedeller, iki teknik hat (static / instance) ve en sonda karar tablosu. Düğüm ağacını koruyan runtime birleştirme burada işlenmez — Scene graph; parça parça animasyon ve kontrol Model parenting ile ayrı ele alınır. Özet diyagram: Draw call akışı, kıyaslama ve «ne zaman hangi yol?» dallanması (birinci bölümde).

Ana amaç: Draw call azaltmak

Modern GPU poligon işinde cömert; darboğaz çoğu web sahnesinde CPU tarafındaki «şunu çiz» komutları (draw call) ve durum değişimidir.

  • Belirti: Çok sayıda bağımsız düğüm — her biri için güncelleme ve sıralı komut trafiği; kare bütçesi dolar.
  • Yön: Aynı görünümü daha az çizim yoluna sıkıştırmak; hangi yolun seçileceği türler bölümünde, «uygun mu?» sorusu tabloda özetlenir.

Aşağıdaki şekil sayfanın iskeletini tek bakışta toplar: sorun hattı, strateji çatalı ve örnek kıyaslama. En alttaki dallanma, üstteki üç kolu hangi sırayla ve hangi koşulla seçeceğinizi gösterir — aynı bilgiyi tekrarlamaz, süzgeç görevi görür.

Draw call özeti: çok düğüm yükü artırır; birleştirme, instancing veya düğümleri ayrı tutma farklı maliyet profilleri verir. Aşağıdaki sayılar aynı örgü ve materyal varsayımıyla öğreticidir; gerçek projede materyal sayısı ve sürücü davranışı sonucu değiştirir.

Draw call akışı

Scene objects Sahnedeki bağımsız düğümler
Many meshes Çok sayıda ayrı mesh
CPU overhead Gezinti, matris, komut hazırlığı
Draw calls ↑ Darboğaz: çizim yolu ve durum trafiği artar
Choose strategy Strateji seçimi — üç yol
Merge 1 draw call (tek örgü)
Instance 1 draw call (shared)
Ayrı tut N draw call (her düğüm)

Kıyaslama (örnek)

Ayrı mesh

10 obje → 10 draw call (kavramsal)

Instancing

100 kopya → 1 draw call (shared örgü)

Merge

500 parça → 1 geometri → 1 draw call

Ne zaman hangi yol?

Önce paylaşılabilirlik; «Hayır» ise statik veya hareketli ayrımı. Renkler üst şemadaki strateji türleriyle eşlenir.

Aynı örgü + aynı materyal? Identical geometry & material
Instancing Shared mesh · paylaşımlı örgü InstancedMesh vb.
Statik Merge tek örgü
Hareketli Parenting pivot

Avantajlar: Neden birleştirmeliyiz?

Bir önceki bölümdeki darboğaz, yalnızca «çok üçgen» değil; CPU’nun her karede sahneyi dolaşması, dünya matrislerini türetmesi ve sürücüye komut göndermesiyle büyür. Aşağıdaki üç başlık, birleştirme veya batching doğru uygulandığında bu yükün nerede hafiflediğini özetler. Hangi tekniğin seçileceği dördüncü bölümde kalır.

  • Daha az grafik yönetimi: Bağımsız mesh sayısı azaldığında, motorun her karede güncellediği düğüm sayısı ve buna bağlı dünya matrisi zinciri kısalır. Özellikle kullanıcı veya animasyon her karede sahneyi komple gezdiriyorsa (traverse, toplu seçim, debug çizimi), kazanç doğrudan ölçülebilir hale gelir.
  • Daha sakin GPU beslemesi: Her çizim yolu kendi materyal ve durum setini taşır; çok sayıda küçük yol, sürücüde sık sık «şunu kapat, bunu aç» ritmine dönüşür. Yollar birleştikçe aynı materyal ve örgü üzerinden daha az atlama ile veri akar; GPU işini daha uzun süre kesintisiz sürdürebilir — bu, katalog sahnesi veya yoğun dekorasyonlarda bellek bant genişliğiyle birlikte okunur.
  • Kullanıcı hissi: Masaüstünde kare süresi bazen yeterince iyidir; oysa mobil cihazlarda termal kısma ve pil baskısı, VR’da ise baş hareketi ve yeniden projeksiyon, düşük ve dalgalı FPS’i hemen cezalandırır. Birleştirme doğru yerde yapıldığında ilk fark edilen şey genelde stabil kare süresi ve takip eden rahatlıktır.

Dezavantajlar: Bedeli nedir?

Kazanç her zaman bedelsiz değildir; burada üç ayrı «fatura» kalemi vardır — strateji seçerken bunları tartmak gerekir.

  • Kontrol: Tek örgüye indiğinizde parça parça oynama, seçim veya animasyon zorlaşır; gerekirse yeniden bölme veya shader maskesi ayrı iş.
  • Bellek: Birleştirme sırasında veri kopyalanabilir; RAM artışı görülebilir.
  • Görünürlük ayrımı: Tek büyük sınırlayıcıda, görünür kalan küçük bir köşe tüm bloğu çizime aday gösterebilir; ince taneli culling kaybı yaşanabilir.

Batching türleri

İki teknik hat aynı «az çizim yolu» hedefini paylaşır; farkları veri düzeninde. Üçüncü seçenek birleştirme değil, hiyerarşidir — kapı–kol gibi senaryolarda parenting ve pivot öne çıkar.

A. Static batching (statik birleştirme)

Yerinde kalan kütleler (duvar, karo, sabit kaya): birden fazla BufferGeometry tek tamponda birleşir. Kodda sık kullanılan yol BufferGeometryUtils.mergeGeometries (examples/jsm/utils).

B. Instanced rendering (örneklenmiş çizim)

Aynı örgü + aynı materyal, çok kopya: matris / renk gibi farklar instance öznitelikleriyle taşınır; stadyum koltuğu veya tekrar eden süs tipik örnektir. Uygulama ayrıntısı için ileri instancing sayfasına gidin.

HoloDepth uygulama rehberi: Ne zaman birleştirmeli?

Tablo yönetici özeti içindir; teknik isimler türler bölümünde, riskler bedeller bölümündedir. Animasyon veya parça başına kontrol gerekiyorsa satır genelde «birleştirme değil» der.

Senaryo Strateji Karar
Farklı materyalli 10 obje Manuel geometri birleştirme Hayır — materyal sayısı kadar yol açılabilir; önce materyal birleştirme / atlas planı gerekir.
Aynı materyalli 500 statik taş Static birleştirme Evet — güçlü draw call kazanımı.
Hareket eden 100 tekerlek InstancedMesh Evet — kontrol ve hız dengesi.
Kapı ve kapı kolu Parenting (Group) Hayır — birleştirme animasyonu zorlaştırır; pivot ile hiyerarşi daha doğru.