Babylon.js · Motor & sahne
Sahne yönetimi: grafik, zaman ve öncelik
Holodepth'te Three.js tarafında sahne grafiği, Object3D
hiyerarşisi ve traversal gibi konuları ayrı sayfalarda işledik. Babylon.js'te aynı
kelime — sahne — benzer bir ağaç taşır; fakat bu sayfadaki
odak, "nedir" tekrarından çok sahneyi bir üretim motoru içinde nasıl
yönetirsiniz sorusudur: kare zamanına bağlı güncellemeler, gözlemlenebilir yaşam
döngüleri, aktif kamera ve görünürlük katmanları.
Kısaca: Three.js'te sıkça elle kurduğunuz döngü ve sahne düzeni, Babylon.js'te sahnenin kendi olay modeli ve motorla sıkı bağlantısı ile desteklenir. Bu metin, sahne yönetimini alternatif API ezberi değil, motor deneyimi olarak okumanız için yazıldı.
Özet: sahne yönetiminin dört boyutu
| Boyut | Pratik soru | Babylon.js'te tipik karşılık |
|---|---|---|
| Yapı | Nesneleri kim kimin altında duruyor? | Ebeveyn–çocuk düğümleri; TransformNode, mesh ve grup benzeri köprüler.
|
| Zaman | Kare başına ne güncellenir, ne geciktirilir? | Observable tabanlı kanca ve sahne hazır olma olayları. |
| Görünürlük | Hangi nesne hangi passta çizilir veya seçilir? | Katman (layer) ve görünürlük bayrakları; aktif kamera seçimi. |
| Ömür | Sahne değişince veya rota kapanınca ne olur? | Ağaç üzerinden dispose, çoklu sahne örnekleri ve motorla simetrik temizlik. |
Sahne (Scene) ve motor sözleşmesi
Babylon.js'te Scene, bir Engine örneğiyle doğar; bu yüzden
sahne yönetimi soyut bir liste meselesi değil, grafik bağlamının içinde yaşayan bir
dünya meselesidir. Motor tarafında çözünürlük ve bağlam yenilenirken sahne
tarafında düğüm dönüşümleri, animasyon ve sistem güncellemeleri aynı zaman ekseninde
buluşur.
Üç temel "sorumluluk" ayırımı işinizi kolaylaştırır: (a) sahne grafiğinde nesneleri örgütlemek, (b) her karede veya belirli olaylarda bu grafiği güvenle güncellemek, (c) görüntüleme kararını — örneğin hangi kameranın geçerli olduğu — tek yerden tutarlı kılmak. Kamera matrisleri ve projeksiyon ayrıntısı için bu klasördeki Kamera sistemi sayfasına bırakıyoruz; burada yalnızca sahne–kamera ilişkisinin yönetim yüzünü işaretliyoruz.
Graf, yerel–dünya dönüşümü ve içerik örgütü
Bir sahne ağacında ebeveyni hareket ettirdiğinizde çocukların dünya uzayındaki konumu
güncellenir; bu kural Three.js ile aynı fiziksel gerçektir. Babylon.js tarafında sık
kullanılan desen, boş bir kök için TransformNode benzeri bir düğüm oluşturup
içerikleri onun altına toplamaktır — böylece "karakter", "prop" veya
"UI kökü" gibi kavramlar sahne içinde net paketlenir.
Yönetim perspektifinden kritik olan: derin traversal ile her karede binlerce düğümü tek tek gezmek yerine, anlamlı kökler ve isim / meta veri disiplini ile sahneyi aranabilir tutmaktır. Tasarım araçlarından gelen büyük sahnelerde düğümlere tutarlı adlar ve sahne içi gruplama, hata ayıklama maliyetini doğrudan düşürür.
Kare zamanı: gözlemlenebilir kancalar ve sahne hazırlığı
Three.js öğrenirken oyun döngüsünü çoğu zaman kendiniz kurarsınız; Babylon.js'te sahne, render öncesi ve sonrası için olay benzeri bir model sunar. Örneğin her karede çalışması gereken mantığı, sahneye kayıtlı bir gözlemci ile toplayabilirsiniz; bu, uygulama kodunu "nerede güncelleniyor?" sorusuna tek yerden cevap vermeyi kolaylaştırır.
İkinci yaygın ihtiyaç: içerik veya ağ ilk kez hazır olduğunda tek seferlik kurulum (örneğin fizik gövdelerini bağlama veya harici sisteme abone olma). Bu aşamayı netleştirmek, özellikle asenkron model yüklemelerinde yarış durumlarını azaltır.
// Kare başı mantık ve tek seferlik hazırlık (örnek iskelet)
// BABYLON içeri aktarımı proje yapınıza göre değişir.
scene.onBeforeRenderObservable.add(() => {
// Her kare: basit animasyon, giriş özetleme vb.
});
scene.executeWhenReady(() => {
// Sahne ve temel bağımlılıklar hazır: tek seferlik kurulum
});
Bu yaklaşımın getirdiği avantaj, yaşam döngüsü kancalarının sahne nesnesinde
merkezlenmesidir; yani döngüyü yazdığınız dosya ile sahne davranışını
yazdığınız
dosya arasında köprü kurmak için ekstra çatı kod yazma ihtiyacı azalır. Motorun
runRenderLoop çerçevesi (
Motor yaşam döngüsü) ile
birlikte düşünüldüğünde tablo şöyle oturur: motor kareyi çağırır, sahne kanca ve düğüm
güncellemeleriyle kendini hazırlar, ardından görüntü üretilir.
Aktif kamera, ortam ve sahne atmosferi
Babylon.js'te bir sahnenin "şu an nasıl göründüğü" büyük ölçüde hangi kameranın aktif olduğu ile belirlenir; sahne yönetimi burada bir geçiş problemidir — örneğin birinci şahıs ile kuş bakışı arasında kullanıcı akışına göre aktif kamerayı değiştirmek. Ortam rengi, sis veya çevre yansıması gibi görsel atmosfer kararları da çoğu zaman sahne düzeyinde toplanır; böylece aynı içerik farklı görsel modlarda tutarlı kalır.
Bu sayfada derin matematik yok; mesele, bu ayarların sahne yaşam ömrüyle birlikte düşünülmesi gerektiğidir: rota değişince yalnızca mesh'leri silmek yetmez, hangi kameranın ve hangi ortam ayarının geçerli olduğunu da yeniden kurmak gerekir.
Katmanlar ve seçici görünürlük
Büyük sahnelerde her şeyi her karede çizmek yerine, nesneleri mantıksal katmanlara ayırmak yaygın bir yönetim aracıdır: örneğin yardımcı mesh'ler, düzenleyici önizlemeler veya "sadece düşük kalite önizleme" katmanları. Babylon.js bu ihtiyaca yönelik katman kimlikleri ve kamera–katman eşlemesi gibi mekanizmalar sunar; doğru kullanıldığında hem seçim (picking) hem çizim maliyeti kontrol edilir.
Three.js'te benzer ihtiyaç için sıklıkla layer mask ve çoklu kamera kombinasyonları öğretilir; Babylon.js tarafında vurgu, bu ayrımın sahne ve kamera yönetimiyle iç içe gelmesidir — yani teknik ayrıntıları ezberlemekten çok, üretimde hangi öncelik sırasının işe yaradığını düşünmek.
Three.js ile çakışmadan düşünmek
Three.js dokümantasyonunda sahne genelde grafik ve traversal üzerinden anlatılır; burada ise sahne, kanca tabanlı zaman çizelgesi ve motorla uyumlu ortam kararları üzerinden anlatılır. İkisi çelişmez — biri veri yapısını, diğeri üretim akışını öne çıkarır. Babylon.js sayfalarında küçük karşılaştırma şunu hatırlatır: aynı GPU gerçeği, farklı motor rahatlığı ile sunulur.
Çoklu sahne, editör akışı ve ömür yönetimi
İleri düzey uygulamalarda tek bir Scene ömrü boyunca her şeyi taşımak yerine,
bölüm bazlı sahneler veya yükleme ekranları arasında geçiş yapan ayrı
sahne örnekleri kullanılabilir. Yönetim maliyeti burada patlar: hangi dinleyicinin hangi
sahneye ait olduğu, hangi motor döngüsünün aktif olduğu ve dispose sırasının nasıl
korunacağı net olmalıdır (
Dispose sırası ile
birlikte okuyun).
Özet kural: sahne değiştirmek, sadece görünürlüğü kapatmaktan daha fazlasıdır — GPU ve olay kaynaklarının da planlı şekilde devreden çıkarılması gerekir.
Bu klasörde sıradaki başlıklar
Motor ve sahne hattı burada tamamlanır; kullanıcı arayüzü katmanına 3D GUI ile devam edebilirsiniz. Önceki adım: Render loop.