Tarayıcıda açık dünya oluşturmak, bölüm 11: Sabit kodlanmış mod değil, politika modu
Yazan: Oleg Sidorkin, Cinevva CTO'su ve Kurucu Ortağı
Burada yeni misiniz? Seri rehberine göz atın. Bu rehber, spike'ın ne olduğunu açıklıyor ve tüm bölümlere bağlantı veriyor.
Dikiş kaosu bölümünden sonra tepki vermeyi bırakıp sistemi yönetmeye başlamamız gerekiyordu.
Spike 23, geçici davranışların yerine açık politika kuralları getirdi. Chunk'lar artık yerel durumlarının önerdiği her şeyi yapmak yerine merkezi bir politika sisteminin verdiği kararlara uyuyordu. Bu chunk hangi LOD seviyesini alacak? Yükseklik haritası olarak mı yoksa marching cubes ile mi render edilecek? Geçiş hücrelerine ihtiyacı var mı, varsa hangi yüzlerde? Yanıtlar; kameraya olan mesafeyi, düzenleme geçmişini ve komşu çözünürlük durumlarını değerlendiren bir politika fonksiyonundan geliyordu.
Spike 23'ü yeni sekmede aç ↗ · Kaynak kodunu görüntüle
Mesafeye dayalı LOD ataması, clipmap kavramına benzer biçimde kamera etrafındaki eş merkezli halkaları kullanıyor, ancak bunu chunk ızgarasına uyguluyordu. Halka 0'daki chunk'lar tam çözünürlüklü MC alır. Halka 1, yarı çözünürlüklü MC alır. Halka 2 ve ötesi ise yükseklik haritası modunu kullanır. Komşuluk kısıtı kritik öneme sahipti: komşu herhangi iki chunk için
HM/MC geçiş mantığı, her chunk'ın düzenleme bit eşlemini kontrol ediyordu. Bir chunk'ta herhangi bir hacimsel düzenleme (mağaralar, tüneller, arazi şekillendirmeleri) varsa mesafeden bağımsız olarak MC modunda kalıyordu. Düzenlenmemiş chunk'lar yeterince uzağa gittiklerinde yükseklik haritası moduna geçebiliyordu. Bu hibrit yaklaşım, önemli olduğu yerlerde hacimsel özgürlük, olmadığı yerlerde ise verimlilik sağladı.
Bu spike dışarıdan bakıldığında önceki bazı spike'lardan daha küçük görünüyordu. Pratikte ise geliştirme sürecinde yaşam kalitesini ciddi ölçüde artırdı.
Sisteminiz bir chunk'ın neden mod değiştirdiğini açıklayabildiğinde tahmin yürütmeye daha az zaman harcarsınız. Renk kodlu katmanlar ekledik: yükseklik haritası chunk'ları için yeşil, MC chunk'ları için mavi, geçişin etkin olduğu yüzler için turuncu. Dikiş görünürlüğüne özel render kontrolleri olduğunda görsel hata ayıklamadaki belirsizlik azalır. Çizim aralıkları, politika sisteminden gelen etkin vertex sayılarına açıkça bağlandığında eski geometri hayaletleri öğleden sonranızı boşa harcamayı bırakır.
Bu spike'ta kamera davranışını da baştan elden geçirdik. Önceki spike'larda ekran görüntüleri için yeterli, ancak hataları yeniden üretmek için kullanışsız olan basit yörünge kontrolleri bulunuyordu. Spike 23; yapılandırılabilir hıza, irtifa kilidi açma/kapama seçeneğine ve konum göstergesine sahip WASD uçuş kamerası ekledi. Bu küçük bir ayrıntı gibi gelebilir. Ancak “şu sırtın yakınlarında bir yerde hata gördüm” ile “hata, kuzeybatıya bakarken (142, 12, -67) konumunda ortaya çıkıyor” arasındaki farkı yarattı.
Bu bölümün temel çıkarımı, politikanın karmaşıklığı azaltmadığıdır. Politika, karmaşıklığı düzenledi. Aynı sayıda uç durum hâlâ vardı. Ancak artık her uç durumun bir adı, tetikleme koşulu ve kodda kesme noktası koyabileceğiniz bir yeri bulunuyordu. Bu farklı türde bir kazanımdır ve bir sistemin gelişmeye devam edip edemeyeceğini ya da kendi ağırlığı altında çöküp çökmeyeceğini belirleyen şeydir.
Spike 23'ün sonunda, sürekli etkileşim hatası korkusu yaşamadan uzak alan clipmap halka stratejisine bağlanabilecek kadar öngörülebilir bir yakın alan davranış katmanımız vardı.
- bölümde; halka geçişlerinin, skybox sisinin ve Three.js sürüm düzeyindeki shader entegrasyonunun projenin bu bölümünü tamamladığı Spike 24'ü ele alıyoruz.
Bu bölümde değinilen teknolojiler
Mesafeye dayalı LOD politikası. Kameraya olan mesafeyi, düzenleme geçmişini ve komşu durumlarını temel alarak her chunk'a LOD seviyesi ve render modu atayan merkezi bir fonksiyon. Eş merkezli mesafe halkaları temel LOD'u belirler: halka 0 = tam çözünürlüklü MC, halka 1 = yarı çözünürlüklü MC, halka 2+ = yükseklik haritası modu. Politika fonksiyonu, kamera hareket ederken her karede çalışır ve chunk geçişlerini tetikler. Böylece geçici, chunk başına alınan kararların yerini öngörülebilir ve hata ayıklanabilir bir kural sistemi alır. Compute shader karşılığı için GPU destekli LOD seçimine bakın.
Komşuluk kısıtları. Transvoxel algoritması yalnızca 2:1 çözünürlük oranlarını işler. İki komşu chunk arasında birden fazla LOD seviyesi farkı varsa (örneğin LOD 0'ın yanında LOD 2), geçiş tabloları geçerli dikiş geometrisi üretemez. Politika sistemi, LOD farkı 1'i aştığında daha düşük ayrıntılı chunk'ı yükselterek bu kısıtı uygular. Bu kısıt yayılımı zincirleme ilerleyebilir: bir chunk'ın yükseltilmesi, komşularının da yükseltilmesini gerektirebilir. Uygulama, tipik ızgara yapılandırmalarında 2-3 yinelemede yakınsayan basit bir yinelemeli geçişten oluşur.
Mod seçimi için düzenleme bit eşlemi. Her chunk, hacimsel SDF düzenlemeleri (mağaralar, tüneller, şekillendirmeler) içerip içermediğini kaydeden bir bit eşlemi tutar. Herhangi bir düzenleme içeren chunk'lar, üreticinin değişikliklerini korumak için mesafeden bağımsız olarak marching cubes modunda kalır. Düzenlenmemiş chunk'lar kameradan yeterince uzaktayken yükseklik haritası moduna geçerek hesaplama ve bellek tasarrufu sağlar. Bit eşlemi, chunk başına tek bir bayraktan oluşur; ancak daha ayrıntılı mod kararları için düzenleme yoğunluğunu izleyecek şekilde genişletilebilir.
Hata ayıklama görselleştirme katmanları. Renk kodlu chunk render'ında yeşil = yükseklik haritası modu, mavi = MC modu, turuncu = geçişin etkin olduğu yüzler anlamına gelir. Chunk başına katmanlar; LOD seviyesi numaraları, mod etiketleri ve tel kafes açma/kapama seçenekleri sunar. Bunlar yayınlanan özellikler değil, geliştirme araçlarıdır; ancak LOD geçişleri ile dikiş artefaktlarında hata ayıklarken maliyetlerini defalarca çıkarırlar. Tam dünya konumunu bildiren WASD uçuş kamerasıyla birlikte “bir yerde hata gördüm” ifadesini “hata, bu LOD yapılandırmasıyla (142, 12, -67) konumunda ortaya çıkıyor” ifadesine dönüştürürler.
12 bölümün 11. bölümü.
Önceki: Bölüm 10 - Dikiş kaosu ve köşe bölüm sonu canavarı
Sonraki: Bölüm 12 - Halkalar, gökyüzü sisi ve yeniden yapacaklarımız
Seri rehberi: /tr/blog/2026-02-25-open-world-browser-series-guide