Mapping ve Hammer

GMod harita performans optimizasyonu: görünürlükle daha fazla FPS

GMod haritasını optimize et: visleaf'leri ve PVS'i anla, func_detail, hint/skip, areaportal, occluder ve fade mesafelerini kullan, sonra oyunda ölç.

Bir GMod haritası, motorun kare başına olabildiğince az şey çizmesi gerektiğinde akıcı çalışır. En büyük kazancı görünürlük sağlar: görüş engeli olarak basit world brush'lar, func_detail olarak detaylar, dar geçitlerde areaportal'lar ve prop'lar için fade mesafeleri. Sonrasında tahmin yürütmek yerine oyunda ölçersin.

Motor neyi çizeceğine nasıl karar verir

Derleme sırasında VBSP haritanın içini visleaf adı verilen dışbükey hacim parçalarına böler. VVIS ardından her leaf için, oradan başka hangi leaf'lerin görülebileceğini hesaplar. Bu listeye PVS (Potentially Visible Set) denir.

Oyunda motor kameranın hangi leaf'te olduğunu belirler ve yalnızca o PVS'in leaf'lerinde ve görüş alanı içinde kalanları çizer. Bunun iki önemli sonucu var:

  • Görünürlük konum başına değil, leaf başına geçerlidir. Bir leaf'teki herhangi bir nokta başka bir leaf'in içini görebiliyorsa, o diğer leaf'in tüm içeriği görünür sayılır.
  • Görünürlüğü yalnızca world brush'lar engeller. Brush entity'ler, func_detail, displacement'lar ve prop'lar, içlerinden bakılamasa bile engellemez.

İyi optimizasyon bu yüzden layout'la başlar: odalar, köşeler ve birbirine göre kaydırılmış kapı açıklıkları alanları birbirinden ayırır. Tek parça devasa bir salonu sonradan hiçbir araç kurtaramaz.

func_detail: detayları görünürlük hesabından çıkar

Her world brush leaf'leri böler. Çok sayıda küçük brush, çok sayıda küçük leaf ve portal üretir; bu da derlemeyi uzatır ve görünürlüğü dağınık hâle getirir. Alanları ayırmayan her şeyi seç ve Ctrl+T ile func_detail'e çevir: sütunlar, basamaklar, çerçeveler, süs çıtaları, brush'lardan yapılmış mobilyalar.

Temel kural olarak odaları kapatan duvarlar, zeminler ve tavanlar world brush olarak kalır. Gerisi detay olur. func_detail'in haritayı kapatmadığını aklında tut. Detail brush'lardan yapılmış bir dış duvar leak'e yol açar. Derlemen VVIS'te takılıp kalıyorsa VVIS çok uzun sürüyor yazısına bak.

Hint ve skip: leaf'leri bilerek kes

VBSP bazen kötü keser, örneğin bir koridor köşesinde; öyle ki bir leaf köşenin ötesine uzanır ve gereğinden çok fazlasını görür. Bir hint brush'ı kesim düzlemini kendin belirlemeni sağlar:

  1. Bir brush oluştur ve tüm yüzeylerine tools/toolsskip uygula.
  2. tools/toolshint texture'ını tam olarak kesimin olması gereken yüzeye uygula.
  3. Brush'ı, hint yüzeyi örneğin köşeden çapraz geçecek biçimde konumlandır.

Hint'leri idareli kullan. Her fazladan kesim yeni leaf'ler ve portallar oluşturur. Bir hint'in işe yarayıp yaramadığını Hammer'da, leaf sınırlarını editörde gösteren Map > Load Portal File ile kontrol edebilirsin.

Areaportal'lar ve occluder'lar

func_areaportal, kapı ya da pencere gibi bir açıklığı tamamen dolduran, tools/toolsareaportal texture'ına sahip ince bir brush'tır. İki biçimde çalışır:

  • Açık: Motor, arkasındaki alanın yalnızca açıklıktan gerçekten görünen kısmını çizer. Bu, prop'ları ve diğer entity'leri de etkiler.
  • Kapalı: Arkasındaki alan hiç çizilmez. Portalı bir kapıya bağlayabilirsin, böylece kapıyla birlikte açılıp kapanır.

Areaportal'lar haritayı alanlara (area) böler. İki alan arasındaki tüm bağlantılar portallarla kapatılmış olmalıdır, yoksa derleme areaportal'da leak bildirir. Yalnızca yakından içine bakılan pencereler için func_areaportalwindow vardır; belirli bir mesafeden sonra alanı gizler.

Hiçbir duvarın bir şeyi ayırmadığı açık arazide func_occluder işe yarar. Tamamen arkasında kalan modelleri gizler, ama brush geometrisini gizlemez. Örten yüzeylere tools/toolsoccluder, diğer hepsine tools/toolsnodraw verilir. Occluder'ların kendisi de işlem süresine mal olur ve yalnızca büyük bir yüzey çok sayıda prop'u gizlediğinde karşılığını verir.

Prop'lar, lightmap'ler ve görünmeyen yüzeyler

  • Fade mesafeleri: Prop'ların "Start Fade Dist" ve "End Fade Dist" özellikleri vardır (prop_static üzerinde adları "Start Fade Dist/Pixels" ve "End Fade Dist/Pixels" şeklindedir). Şişe ya da tabela gibi küçük nesnelerin uzaktan çizilmesi gerekmez. Prop ne kadar küçükse o kadar erken kaybolabilir.
  • Doğru prop türü: Hiç hareket etmeyen her şey prop_static olur. Fizik prop'ları dolu bir sunucuda fiziğe ve ağ trafiğine ek yük bindirir.
  • Lightmap ölçeği: Varsayılan değer 16'dır. Büyük ve eşit aydınlatılmış yüzeylerde 32 ya da 64 gibi değerler bellekten ve dosya boyutundan tasarruf sağlar. Daha küçük değerleri yalnızca gölgelerin keskin olması gereken yerlerde kullan. Bu konuda daha fazlası Source Engine ışıklandırma rehberi yazısında.
  • Nodraw: Kimsenin asla görmeyeceği yüzeylere tools/toolsnodraw verilir. Bu; arka yüzler, displacement'ların altındaki yüzeyler ve prop'ların örttüğü yerler için geçerlidir. Haritanın dışındaki boşluğa bakan yüzeyleri VBSP otomatik olarak kaldırır.
  • Uzak manzara: Uzaktaki arazi haritaya gerçek geometri olarak değil, bir 3D skybox içine konur.

Tahmin yürütmek yerine oyunda ölç

Tam bir derlemeyle test et. Hızlı VVIS ile motor gereğinden fazlasını çizer, dolayısıyla sayılar pek bir şey ifade etmez. GMod'da mat_wireframe, mat_leafvis, r_DrawPortals ve r_lockpvs cheat korumalıdır ve sv_cheats 1 gerektirir; cl_showfps ve +showbudget ise gerektirmez.

KomutNe gösterir
cl_showfps 1Kare hızı
+showbudgetKare başına sürenin nasıl dağıldığı, örneğin dünya, prop'lar ve fizik arasında. -showbudget paneli yeniden gizler
mat_wireframe 1Çizilen her şeyi, duvarların arkasındakiler dahil, tel kafes olarak gösterir. Böylece motorun bir duvara rağmen neleri çizdiği görülür
mat_leafvis 1Kameranın içinde bulunduğu visleaf'in dış hatları
r_DrawPortals 1Areaportal'ların dış hatları
r_lockpvs 1Görünürlüğü dondurur, böylece etrafta dolaşıp eski konumdan nelerin çizildiğini kontrol edebilirsin

Sistemli çalış: önce kare hızının en düşük olduğu noktaları bul, neyin gereksiz yere çizildiğini görmek için onlara mat_wireframe 1 ile bak ve ancak ondan sonra hint'leri, areaportal'ları ya da fade mesafelerini hedefli biçimde yerleştir. Bu sırada compile log'da yerine oturtamadığın uyarılar görürsen Map Scanner, bilinen mesajlar için nedenler ve çözümler önerir.

Sık sorulan sorular

func_detail gerçekten daha fazla FPS sağlar mı?

Doğrudan bakıldığında func_detail en çok derlemeyi kısaltır. Oyundaki kazanç daha küçüktür: haritada daha az leaf olur ve world brush'ların yüzeyleri daha az parçaya bölünür. Ancak fazla detay da zarar verir: func_detail olarak işaretlenen hiçbir şey artık görünürlüğü engellemez.

VVIS çalıştığı hâlde haritam neden yavaş?

Çoğu zaman layout fazla açıktır, öyle ki neredeyse her şey neredeyse her yerden görünür. Diğer nedenler fade mesafesi olmayan çok sayıda prop, pahalı su ya da dinamik ışıklardır. +showbudget zamanı hangi kategorinin yediğini gösterir.

Displacement'lar görünürlüğü engeller mi?

Hayır. Displacement'lar ne haritayı kapatır ne de görünürlüğü engeller. Arkalarında başka bir alan başlıyorsa tepelerin altına ve kaya duvarların arkasına tools/toolsnodraw kaplı basit world brush'lar koy.

Areaportal'lar nerede mantıklıdır?

İçeriği yoğun alanlar arasındaki dar geçitlerde, yani kapılarda, pencerelerde ve geçişlerde. Geniş açık bir alanda pek işe yaramazlar, çünkü açıklıktan zaten neredeyse her şey görünür.