World Partition, Unreal Engine 5'in açık dünya geliştirme yaklaşımını yeniden tanımlayan sistemdir. UE4 döneminde devasa haritalar manuel olarak sublevel'lara bölünür, Level Streaming Volumes ile yönetilir, takım üyelerinin aynı dosyada çalışması ciddi merge çatışmalarına yol açardı. World Partition bu modeli devre dışı bırakır: sahne otomatik olarak bir grid'e bölünür, motor hangi cell'in yüklü olduğunu kendi yönetir, her actor ayrı bir dosyada saklanır.
Biz Althera Games olarak Potion Rise Simulator'ın küçük köy ölçeğinde World Partition'a şu an ihtiyaç duymuyoruz; ancak şehir ve dükkan ekosistemi büyürse adayız. Bu yazıda World Partition'ın mimarisini, cell streaming ve HLOD'un işleyişini, Data Layers'ın koşullu yükleme gücünü, OFPA'nın takım iş akışına etkisini ve indie projeler için ne zaman mantıklı olduğunu ele alıyoruz. Daha geniş bir UE5 girişi için UE5 rehberi hub ve UE5 indie geliştirme rehberi tamamlayıcı okumalardır.
World Partition Nedir?
World Partition'ı en basit haliyle, dünyanızı otomatik olarak bölgelere ayıran ve oyuncunun yakınındaki bölgeleri runtime'da yükleyen bir sistem olarak tanımlayabiliriz. Eski Level Streaming yaklaşımında geliştirici hangi alanı ne zaman yükleyeceğini elle programlardı; World Partition bu sorumluluğu motora devreder. Sonuç, daha basit bir geliştirici deneyimi ve takım çalışmasında ciddi performans iyileşmesidir.
Sistem üç temel bileşenden oluşur. World Partition Subsystem: dünyanın grid yapısını ve hangi cell'in ne zaman yükleneceğini yöneten motor sistemi. OFPA (One File Per Actor): her actor'ün ayrı bir disk dosyasında saklanmasını sağlayan veri formatı. HLOD (Hierarchical Level of Detail): uzaktaki cell'lerin düşük detay sürümlerinin oluşturulmasını sağlayan otomatik LOD sistemi. Üç bileşen birlikte çalışarak büyük dünyaların hem geliştirme hem oyuncu deneyimi açısından yönetilebilir kalmasını sağlar.
Resmi belgeler için Epic'in World Partition dokümantasyonu kapsamlı bir başlangıç noktasıdır. Brian Karis ve Epic teknik ekibinin SIGGRAPH konuşmaları, sistemin teknik temellerini derin bir mühendislik perspektifinden anlatır.
Cell Streaming ve HLOD
World Partition'ın kalbi cell streaming'dir. Dünyanız aktive edildiği anda otomatik olarak kare şeklinde cell'lere bölünür; varsayılan boyut 25600 santimetredir, yani 256 metrelik kareler. Oyuncu bir cell'e yaklaştığında o cell ve etrafındakiler yüklenir; uzaklaştığında boşaltılır. Yükleme yarıçapı, runtime grid hücreleri ve streaming kaynak ayarlarıyla yönetilir.
Cell boyutu kararı, hafıza ve streaming yükü arasındaki denge meselesidir. Küçük cell'ler (örneğin 12800 cm) hafızada daha az veri tutar ama daha sık IO yükü yaratır; oyuncu hızla hareket ettiğinde cell sınırlarını çok kez geçer ve streaming hatası riski yükselir. Büyük cell'ler (örneğin 51200 cm) daha az IO işlemi gerektirir ama hafıza ayak izini büyütür. Çoğu açık dünya projesi için 25600 cm güvenli bir başlangıç noktasıdır; karakter hızınız ve sahne yoğunluğunuza göre profiling ile final değer belirlenir.
HLOD sistemi, oyuncudan uzaktaki cell'lerin düşük detay sürümlerini önceden hesaplar. Cell yakınsa tam geometri, orta uzaklıktaysa orta detaylı bir mesh proxy, çok uzaktaysa basitleştirilmiş bir blob mesh kullanılır. HLOD seviyeleri için 3 kademeli bir yapılanma çoğu indie proje için yeterlidir. HLOD generation süresi, açık dünyada bir gece sürebilir; bu süreç distributed build sistemi ile dağıtılabilir veya CI pipeline'ında otomatize edilebilir.
HLOD'un ana faydası, oyuncunun ufuk çizgisinde dağ silsileleri, uzak şehirler veya geniş ormanlar gördüğünde bunların gerçekte yüklü olmaması ama görünmesidir. Nanite rehberimizde incelediğimiz Nanite teknolojisi, HLOD ile birlikte çalıştığında geometri yoğunluğunun açık dünyada bile sınırlanmamasını sağlar.
Data Layers: Conditional Loading
Data Layers, World Partition'ın koşullu içerik sistemidir. Bir cell'i yükleyip yüklememeye karar vermenin ötesinde, bir cell'in hangi içeriğinin yükleneceğini de yönetebilirsiniz. Bu, modern açık dünya tasarımı için kritik bir özelliktir.
Pratik kullanım örnekleri: Gece/gündüz katmanı: gece olunca farklı NPC'ler, farklı ışıklar, farklı tehditler aktive olur. Hikâye katmanı: oyuncu belirli bir görevi tamamladıktan sonra dünyanın bazı bölgeleri değişir; eski katman boşaltılır, yeni katman yüklenir. Multiplayer katmanı: bir takıma ait yapılar yalnızca o takımın oyuncularına yüklenir, rakip takıma yüklenmez. Geliştirme katmanı: editor-only debug actor'leri, kalıcı olarak production build'e girmez ama editor'da görünür.
Data Layers'ı düzgün kullanmak için önce dünyanızın state matrisini çıkarın. Hangi katmanlar hangi koşulda aktif? Bu matris dağınıksa runtime'da beklenmedik kombinasyonlar ortaya çıkar; sıkı tutulursa katmanların birbiriyle ilişkisi öngörülebilir olur. Potion Rise Simulator için katmanlarımız şu şekilde planlanıyor: temel köy katmanı (her zaman aktif), gündüz pazarı katmanı (08:00-18:00), gece bekçileri katmanı (22:00-06:00), festival katmanı (oyun-içi bayram günlerinde).
World Composition'dan World Partition'a Geçiş
UE4 döneminden gelen birçok proje hâlâ World Composition kullanıyor. World Composition, manuel olarak yapılandırılmış sublevel'lardan oluşan eski bir sistemdir; UE5'te halen desteklenir ama yeni projeler için önerilmez ve uzun vadede deprecated olacaktır. Yeni projeler doğrudan World Partition kullanmalıdır.
Mevcut bir World Composition projesini World Partition'a taşımak çoğu projede manuel emek gerektirir. Epic'in OneFilePerActor Migration Tool aracı ilk adımı otomatize eder, ama sublevel'ların World Partition cell yapısına dönüştürülmesi sıklıkla manuel müdahale ister. Pratik adımlar: önce mevcut proje üzerinden bir kopya alın (asla orijinalde çalışmayın), bütün sublevel'ları persistent level'a merge edin, ardından World Partition activate edin ve OFPA convert işlemini çalıştırın.
Geçişin maliyeti küçümsenmemeli; orta ölçekli bir UE4 açık dünyası için bir geliştiricinin 1-2 haftalık tam zamanlı çalışması gerekebilir. Karşılığında elde edilen kazançlar (otomatik streaming, OFPA ile takım iş akışı, modern editor desteği) bu yatırımı haklı çıkarır. Ancak proje lansman aşamasındaysa veya ekip ufaksa, geçişi sequel veya next-version'a ertelemek mantıklı olabilir.
One File Per Actor (OFPA) ve Versiyonlama
OFPA, World Partition'ın belki de en az anlatılan ama takım iş akışı açısından en etkili özelliğidir. Geleneksel UE projelerinde bir level dosyası tek bir .umap dosyası olarak saklanır; bu dosyada sahnedeki tüm actor'ler bulunur. İki geliştirici aynı level üzerinde çalıştığında merge çatışması neredeyse kaçınılmazdır; binary .umap dosyalarını merge etmek pratik olarak imkânsızdır.
OFPA bu modeli devre dışı bırakır. Her actor, disk üzerinde ayrı bir küçük .uasset dosyası olarak saklanır. İki geliştirici aynı level'da farklı actor'ler üzerinde çalıştığında, çakışma yoktur; ikisinin değişiklikleri ayrı dosyalardadır ve sorunsuz birleşir. Bu, takım iş akışında devrimsel bir kazançtır; özellikle 3-10 kişilik indie ekipler için.
Versiyonlama sistemi seçimi de OFPA ile değişir. Perforce, OFPA için tam destek sağlar; binary asset'lerin file-locking mantığı, OFPA'nın çok dosyalı yapısıyla mükemmel uyumludur. Git kullanan ekipler için OFPA çalışır ama dikkat gerektirir; çok sayıda küçük binary dosya Git LFS'i yorabilir, normal Git'te tutmak ise repo boyutunu büyütür. Pratik öneri: küçük .uasset dosyalarını normal Git'te tutmak (toplu binary olsalar da küçük), Megascans gibi büyük asset'leri LFS'te tutmak. Blueprint vs C++ yazımız ekip iş akışları üzerine ek perspektif sunar.
OFPA, World Partition'ın görünmez kahramanıdır. Takım çalışan bir indie stüdyo için, geliştirici saatleri açısından ekonomik değeri streaming sisteminden bile yüksektir.
Open World Performans İpuçları
World Partition kullanan bir açık dünyanın performansı, varsayılan ayarlarla nadiren tatmin edicidir. Üretim seviyesinde performans için aşağıdaki başlıkların her biri optimize edilmelidir.
Cell size profiling: oyuncu hareket profiliniz çıkarın; ortalama hız nedir, en yüksek hız nedir, ne kadar süre tek bir cell'de kalıyor? Bu profile göre cell size'ı kalibre edin. Hızlı hareket eden oyuncular (motorsiklet, uçuş) büyük cell'lerden, yavaş hareket edenler (yaya, iç mekân) küçük cell'lerden faydalanır.
Loading range tuning: r.WorldPartition.LoadingRange komutu yükleme yarıçapını kontrol eder. Ufuk çizgisinde HLOD görünmek istediğiniz mesafeden cell yüklemenin başlamasını isteyebilirsiniz. Çok düşük değerler streaming hitch yaratır; çok yüksek değerler hafıza kullanımını şişirir. 12800-25600 cm aralığı çoğu proje için iyi bir başlangıçtır.
Streaming source weight: oyuncu kamerasının yanı sıra bazı NPC veya araç actor'leri streaming source olarak işaretleyebilirsiniz; bu actor'ler etrafındaki cell'ler de yüklenir. Bu, sinematik kameralar veya araç kovalamacaları için kritiktir.
Initially Loaded: bazı cell'leri her zaman yüklü tutmak isteyebilirsiniz (oyuncunun başlangıç bölgesi, ana hub, karakter spawn alanı). Bu cell'leri Initially Loaded olarak işaretlemek, oyuncu uzaklaştıktan sonra bile boşaltılmamasını sağlar.
HLOD ayarları: HLOD'un proxy mesh kalitesi varsayılanda yüksektir; küçük indie projeler için 3 yerine 2 HLOD seviyesi yeterli olabilir ve build süresini önemli ölçüde düşürür. Lumen rehberimiz bu ayarların aydınlatma performansıyla nasıl etkileştiğini açıklar.
Indie Projede World Partition: Ne Zaman Mantıklı?
World Partition, varsayılan olarak iyi bir karar değildir; doğru karardır, ama yalnızca proje gerçekten ihtiyaç duyuyorsa. Küçük lokal bir oyun (kapalı bir apartman, bir köy, iç mekânlar) için World Partition gereksiz bir karmaşıklık katar. Karar kriterimiz şu sorulardır:
- Haritanızın boyutu 5 km² üzerinde mi? Küçükse World Partition'a ihtiyacınız muhtemelen yoktur.
- Birden fazla geliştirici aynı level'da çalışıyor mu? Evetse OFPA tek başına World Partition'ı haklı çıkarabilir.
- Build süreleriniz saatlere uzuyor mu? Bu, manuel sublevel yapısının üstesinden gelemediğinin işaretidir.
- Açık dünya streaming oynanışınızın bir parçası mı? Mesela kesintisiz at sürme veya araç kullanımı? Evetse World Partition zorunludur.
- Multiplayer ve sunucu streaming ihtiyacınız var mı? Evetse World Partition'ın server streaming altyapısı kritiktir.
Potion Rise Simulator için bu sorulara verilen cevaplar bizi şu an World Partition'dan uzak tutuyor; köy küçük, harita 1 km²'den az, takımımız küçük. Eğer şehir ekosistemi büyür ve birden çok mahalleye yayılırsa World Partition'a geçiş gündeme gelir. NightRecord: Thin Walls için ise World Partition gereksizdir; oyun tamamen kapalı bir apartman içinde geçer ve harita küçük ölçeklidir.
Pratik öneri: World Partition'ı erken aktive etmeyin. Eğer karar verdiyseniz proje başlangıcında kurun, sonradan geçişin maliyeti yüksek olur; ama kararsızsanız klasik level yapısıyla başlayın ve gerçekten ihtiyaç doğduğunda taşıyın. Yanlış nedenlerle erken benimseme, indie ekipleri sıklıkla teknik karmaşıklığa boğar. Oyun sayfamızdan Potion Rise Simulator'ın güncel mimari kararlarını takip edebilirsiniz.
Sıkça Sorulan Sorular
Küçük ölçekli indie projelerde World Partition gerekli midir?
World Partition, 5 km² ve üzeri açık dünyalar için tasarlanmıştır; küçük lokal haritalar (kapalı bir apartman, küçük bir köy, iç mekânlar) için gereksiz karmaşıklık getirir. Eğer haritanız 1 km² altındaysa Level Streaming Volumes veya doğrudan tek-level yaklaşım daha pragmatiktir. World Partition'a geçmek için kriter, ihtiyaç olarak ortaya çıkmasıdır: harita rahatça çalışmıyor, build süreleri saatlere uzuyor, takım birden fazla kişi tarafından aynı sublevel'da çalışmaya başlıyor.
World Partition multiplayer'da nasıl davranır?
World Partition multiplayer projelerinde Server Streaming Source kavramı üzerinden çalışır; sunucu hangi cell'leri yüklediğini her oyuncuya göre yönetir. Bu, tüm oyuncuların farklı bölgelerde olduğu açık dünya MMO veya battle royale tasarımları için doğru bir mimaridir. Ancak bant genişliği planlaması kritiktir; cell sınırlarında oyuncu hareketi sırasında replication'ın kararsızlaşmaması için Data Layer ve Initially Loaded ayarları dikkatli yapılmalıdır.
OFPA (One File Per Actor) ile Git LFS uyumlu mu?
Evet, ama dikkat gerektirir. OFPA aktifleştirildiğinde her actor disk üzerinde ayrı bir .uasset dosyası olarak saklanır; bu küçük dosya sayısını binlerce, on binlerce mertebeye çıkarır. Git LFS, büyük binary dosyalar için tasarlanmıştır ve çok sayıda küçük dosyayla performans düşüşü yaşayabilir. Pratik öneri: OFPA dosyaları normal Git'te tutulabilir (binary çünkü uasset, ama küçük), Megascans gibi büyük asset'ler LFS'te. Perforce kullanan ekipler için OFPA tam destek sağlar; Git ile küçük ekipler atomic commit disiplinine dikkat etmelidir.
Cell size optimum değer nasıl bulunur?
Cell size, hafıza ile streaming yükü arasındaki dengeye karar verir. Çok küçük cell'ler (örneğin 1024 cm) çok sayıda IO işlemi ve streaming hatası riski yaratır; çok büyük cell'ler (örneğin 51200 cm) yüksek hafıza kullanımı ve yavaş yükleme. Çoğu açık dünya projesinde 25600 cm (256 m) iyi bir başlangıç noktasıdır; karakter hareket hızı yüksekse 51200 cm, karakter yavaşsa veya iç mekânlar yoğunsa 12800 cm denenebilir. Final değer her projenin profiling'i ile belirlenir.
World Composition'dan World Partition'a geçiş zorunlu mu?
World Composition, UE5'te halen desteklenir ama yeni projeler için önerilmez ve uzun vadede deprecated olacaktır. Yeni başlayan projeler doğrudan World Partition kullanmalıdır. Mevcut UE4'ten gelen büyük projeler için Epic'in resmi geçiş aracı vardır; süreç manuel level merge ve sublevel yeniden organize etme gerektirir. Geçiş kolay değildir, fakat World Partition'ın iterasyon hızı ve takım iş akışı kazançları geçişi haklı çıkarır.
Sonuç: Doğru Karar, Doğru Zamanda
World Partition, UE5'in açık dünya tasarımı için sunduğu en olgun ve modern çözümdür. Cell streaming, HLOD, Data Layers ve OFPA bir araya geldiğinde hem geliştirici deneyimini hem oyuncu deneyimini ileriye taşır. Ama bütün modern çözümler gibi, doğru proje için doğru karardır; yanlış proje için fazladan teknik karmaşıklık olur.
Indie ekiplerin almak istediği ders şudur: World Partition'ı çekici buluyorsanız bile, projenizin gerçekten ihtiyaç duyup duymadığını sorgulayın. Küçük lokal bir korku oyunu için klasik level yapısı çoğu zaman yeterli ve sade kalır; geniş bir RPG açık dünya için World Partition zorunlu hale gelir. UE5 rehberi hub'ımız, motor seviyesindeki diğer kararlar üzerine geniş bir referans sunar; oyun sayfamızdan kendi mimari kararlarımızın evrimini izleyebilirsiniz.