Areaportal, hint ve occluder: hangisi hangi sorunu çözer
Areaportal, hint/skip brush'ları ve occluder karşılaştırması: her araç nasıl çalışır, maliyeti nedir, ne zaman yerleştirilir ve sonuç oyunda nasıl doğrulanır.
Hint brush'lar, areaportal'lar ve occluder'lar üç farklı görünürlük sorununu çözer. Hint, derleme sırasında visleaf'lerin nasıl kesildiğini değiştirir ve oyunda hiçbir maliyeti yoktur. Areaportal, çalışma zamanında görüşü bir açıklığa göre kırpar ya da arkasındaki bölgeyi tamamen kapatır. Occluder ise çalışma zamanında yalnızca bir yüzeyin tamamen arkasında kalan modelleri gizler.
Üç araç, iki ayrı zaman
VBSP iç hacmi visleaf'lere böler, VVIS de her leaf için oradan başka hangi leaf'lerin görülebileceğini hesaplar (PVS). Temel bilgiler GMod harita performans optimizasyonu ve VBSP, VVIS ve VRAD nedir yazılarında anlatılıyor. Üç araç farklı noktalarda devreye girer:
- Hint ve skip derleme sırasında etki eder. VBSP'nin leaf'leri nerede keseceğini sen belirlersin, bu da VVIS'in sonucunu değiştirir.
- Areaportal'lar haritayı derleme sırasında area'lara böler, ama neyin çizileceğine ancak oyunda karar verir.
- Occluder'lar yalnızca oyunda çalışır.
VVIS areaportal'ları hesaba katmaz: test haritamızda iki oda, portallar doğru yerleştirilmiş olmasına rağmen hâlâ birbirinin PVS'indeydi. Yani oyunda motor önce PVS'i alır, onu areaportal'larda kırpar ve en son modelleri occluder'lara karşı test eder.
Hint ve skip: leaf kesimlerini yönetmek
Hint brush, kesim yüzeyinde tools/toolshint, diğer tüm yüzeylerinde tools/toolsskip bulunan bir world brush'tır. VBSP kesim düzlemlerini brush'ların yüzeyleri arasından seçer. Source SDK 2013'ün VBSP kodunda skip yüzeyleri hiçbir zaman seçilmez; bir hint yüzeyini kesecek bir düzlemden de, o düzlemin kendisi hint olmadığı sürece kaçınılır.
Klasik örnek, dik açıyla dönen bir koridordur:
- Hint olmadan VBSP iki iç duvardan biri boyunca keser. Sonuç, bir portalı paylaşan iki leaf'tir. Bir kolun ucundan bakıldığında motor diğer kolun ucunu da çizer.
- Köşeye kama biçimli bir brush yerleştir. Hint yüzeyi dış köşeyi keser: dış duvardan dış duvara 45 derecelik açıyla uzanır ve köşenin iç kenarına tam olarak değer.
- Hint köşeden üçgen bir parça ayırır ve her kol kendi leaf'ini korur. İki kolun leaf'leri artık yalnızca iç kenarda birbirine değer ve ortak bir portalları kalmaz.
GMod'un derleyicileriyle yaptığımız testte bu, sayıyı 2 leaf ve 1 portaldan 4 leaf ve 3 portala çıkardı, çünkü VBSP köşe üçgenini bir iç duvar boyunca bir kez daha böldü. İki kolun uçları artık birbirinin PVS'inde değildi. Köşenin içindeyken ise iki kolu da görmeye devam edersin.
Her hint kesimi, VVIS'in hesaplamak zorunda olduğu leaf'ler ve portallar oluşturur. Bu konuda daha fazlası VVIS çok uzun sürüyor yazısında.
Areaportal'lar: açıklıkları kırpmak ve kapatmak
func_areaportal, bir açıklığı tamamen dolduran, tools/toolsareaportal kaplı tek bir brush'tır.
- Açık: Motor görüşü açıklığın kesitine daraltır. Bunun dışında kalan leaf'ler atlanır ve arkadaki bölgede bulunan her entity, bounding box'ı üzerinden bu kesite karşı test edilir.
- Kapalı: Arkadaki bölge, içine açılan başka bir açık portal olmadığı sürece hiç çizilmez.
En önemli kural: bir portalın iki tarafı farklı area'larda bulunmalıdır. Bu yüzden iki area arasındaki her bağlantı bir portalla ya da world brush'larla kapatılmış olmalıdır. func_detail, displacement'lar, brush entity'ler ve prop'lar kapatmaz. Bu konuda daha fazlası func_detail mi world brush mı yazısında.
Kapılar için portalda "Name of Linked Door" alanına kapının adını yaz ve "Initial State" değerini kapının başlangıç durumuna göre ayarla. Source SDK 2013 kodunda func_door, func_door_rotating ve prop_door_rotating, kendilerini bağlı kapı olarak gösteren her func_areaportal'ı kapı açılmaya başlar başlamaz açar ve ancak kapı tamamen kapandığında kapatır. Valve wiki'sine göre, kapalı kapının çizilmeye devam etmesi için portal brush'ını kapıdan daha ince yap.
func_areaportalwindow kapıya göre değil, mesafeye göre kapanır. "Fade Start Distance" (varsayılan 128) ile "Fade End Distance" (varsayılan 512) arasında, "Rendered Window" alanına girilen brush entity'yi kademeli olarak görünür kılar, ardından bölgeyi kapatır. Bir kapıya bağlanamaz: bunun için bir alanı yoktur ve SDK'daki kapı kodu yalnızca func_areaportal arar.
Areaportal leak'ini bulmak
Bir portal iki tarafında da aynı area'ya değiyorsa VBSP bunu şöyle bildirir:
Processing areas...Wrote mymap.lin
Areaportal leak ! File: mymap.lin
Brush 88: areaportal brush doesn't touch two areas
VBSP bu noktada durmaz. GMod'un derleyicileriyle yaptığımız testte BSP'yi ve portal dosyasını yine de yazdı, VVIS de hatasız tamamlandı. Ancak ortaya çıkan BSP yalnızca tek bir area içeriyordu ve hiç areaportal verisi yoktu; yani iki oda da aynı area'daydı. Oyunun böyle bir haritayla ne yaptığını test etmedik. Hiçbir şey durmadığı için mesaj kolayca gözden kaçar. Bu konuda daha fazlası compile log okuma yazısında.
.lindosyasını Hammer'daMap > Load Pointfileile yükle. Testimizde çizgi, portalın bir tarafından açık bağlantı üzerinden diğer tarafına gidiyordu.- Hangi portalın kastedildiğini bilmiyorsan
View > Go to Brush Numberile mesajdaki brush ID'sine atla. - Çizgiyi takip et ve boşluğu ara: portalı olmayan ikinci bir geçit,
func_detailya da displacement'lardan yapılmış bir duvar veya açıklığı tamamen doldurmayan bir portal brush'ı.
func_occluder: modelleri bir yüzeyin arkasında gizlemek
func_occluder leaf kesmez, hiçbir şeyi kapatmak zorunda değildir ve boşlukta serbestçe durabilir. Motor her karede bir modelin bounding box'ının örten yüzeyin tamamen arkasında kalıp kalmadığını kontrol eder ve kalıyorsa modeli çizmez. Yalnızca modeller test edilir, yani prop'lar, NPC'ler ve oyuncular. Occluder world brush'ları ya da displacement'ları gizlemez; Source SDK 2013'ün client kodu da brush entity'leri testin dışında bırakır.
Onu, içinden bakılamayan bir şeyin içine brush olarak kurarsın; örneğin func_detail'den yapılmış bir duvarın, displacement'lardan oluşan bir tepenin ya da prop'lardan yapılmış bir binanın içine. Örten yüzeylere tools/toolsoccluder, diğer hepsine tools/toolsnodraw verilir. Yalnızca bir occluder yüzeyine baktığın yönden çalışır.
Valve wiki'sine göre occluder'lar nesne başına açık areaportal'lardan daha pahalıdır. Bu yüzden yalnızca büyük bir yüzey çok sayıda modeli örttüğünde karşılığını verir.
Karşılaştırma: hangi iş için hangi araç
| Araç | World geometrisini gizler | Prop'ları gizler | Derleme maliyeti | Çalışma zamanı maliyeti | Tipik kullanım |
|---|---|---|---|---|---|
| Hint ve skip | evet, leaf'leri bütün olarak | evet, leaf ile birlikte | VVIS için daha fazla leaf ve portal | yok | koridor ve geçitlerdeki köşeler |
| Areaportal | evet, kesitin dışında kalanı; kapalıyken tüm bölgeyi | evet, bounding box üzerinden tek tek | düşük, portal başına fazladan bir leaf | görünen her açık portal için | kapılar, pencereler, bina girişleri |
| Occluder | hayır | evet, tamamen örtülüyorsa | yok | her occluder ve test edilen her model için | açık arazide serbest duran görüş engelleri |
Buradan sıralama çıkar: önce görüş engeli olarak world brush'lar, sonra hint'ler, sonra arkasında çok içerik bulunan dar geçitlerde areaportal'lar, occluder'lar ise yalnızca hiçbir duvarın kapatamadığı yerlerde.
Oyunda kontrol etmek
Tam hesaplanmış bir VVIS ile test et. Aşağıdaki komutlar GMod'un motorunda mevcuttur. İlk beşi orada cheat korumalıdır ve sv_cheats 1 gerektirir, r_occlusion ise gerektirmez:
mat_wireframe 1
mat_leafvis 1
r_lockpvs 1
r_DrawPortals 1
r_portalsopenall 1
r_occlusion 0
mat_wireframe 1, render edilen her şeyi duvarların arkasındakiler dahil tel kafes olarak çizer.mat_leafvis 1kameranın içinde bulunduğu leaf'i gösterir,r_lockpvs 1ise etrafta uçabilmen için PVS'i dondurur. Hint'leri bunlarla kontrol et.r_DrawPortals 1areaportal'ların dış hatlarını çizer,r_portalsopenall 1ise tüm portalları açık olmaya zorlar. Bunu açıp kapattığında tel kafes değişmiyorsa portal o noktada hiçbir şey kazandırmıyordur.r_occlusion 0, karşılaştırma için occlusion sistemini kapatır.
Compile log'u Map Scanner aracına yapıştırabilirsin; araç VBSP, VVIS ve VRAD log'larındaki temel nedenleri ve zincirleme hataları tespit eder.
Sık sorulan sorular
Bir areaportal'ı trigger ile kontrol edebilir miyim?
Evet. func_areaportal'ın Open, Close ve Toggle input'ları vardır. Ancak portalın tüm oyuncular için tek bir durumu vardır. Valve wiki'si çok oyunculu oyun için en başta sürekli açık portalları, ardından kapılardaki portalları, trigger ile kontrol edilenleri ise en son sırada önerir.
Kaç areaportal fazla sayılır?
Sabit bir sayı yok. Görünen her açık portal işlem süresine mal olur ve çok az şey gizliyorsa sahne portal olmadan daha hızlıdır. Ayrıca her areaportal bir entity'dir ve edict limiti hesabına dahildir.
Bir kapının ya da pencerenin arkasındaki oda neden kayboluyor?
O zaman içinden bakabildiğin hâlde bir portal kapalıdır. Tipik nedenler şunlardır: "Initial State" değeri "Closed" olan ve hiçbir kapının ya da input'un asla açmadığı bir portal, cam bölmesi olan bağlı bir kapı veya "Fade End Distance" değeri fazla kısa olan bir func_areaportalwindow.