Geliştirici günlüğü

Geliştirici Günlüğü #9: Savaş sisi ve görüş nasıl çalışır?

MKA Engine'de görüş: motor neyi tutar, oyun neyi seçer? Savaş sisi, keşif, tespit ve oyuncu sisi; ekransız ölçümler ve sınırları.

İçindekiler
Karanlık bir masada, sisle örtülü eski bir harita; yalnız bir lamba ışığıyla aydınlanan küçük bir bölgede pullar ve bir büyüteç

Kısaca: Savaş sisi, bir tarafın haritada bugün neyi gördüğüne ve daha önce neyi keşfettiğine bağlıdır. MKA Engine'de bu bilgiyi motor tutar; menzil, paylaşım, tespit ve oyuncu sisi kurallarını oyun seçer. Ekransız bir ölçümde bir görüş adımı, menzil komşu sayısıyla ölçüldüğünde 1 216 mikrosaniye sürdü; her konuma 1 maliyet yazıldığında 3 642, konumlar farklı maliyetli olduğunda 5 251 mikrosaniye sürdü.

Strateji oyunlarında harita çoğu zaman baştan açık değildir. Oyuncu yalnız birliklerinin gördüğünü görür; gerisi sis altında kalır (Vikipedi, Fog of war (yeni sekmede açılır); Game Developer, Adding strategy to your tactics (yeni sekmede açılır)). Bir simülasyon için bu bir soru doğurur: her taraf için hangi konumun görüldüğü ve keşfedildiği her gün, her makinede aynı olmalıdır. Çok oyunculu bir oyunda her makine aynı simülasyonu koşar ve ağdan yalnız komutlar geçer (Game Developer, Building a Multiplayer RTS in Unreal Engine (yeni sekmede açılır); Deterministic Lockstep in Networked Games, akademik tez (yeni sekmede açılır)); görüş yalnız ekranda çizilen bir şey olsaydı makineler ayrışabilirdi. Bu kilit adım (lockstep) düzeni, çok oyunculu ve tutarlılık günlüğünde anlattığımız gibi, görüşü de simülasyonun parçası yapar.

Motor neyi tutar, oyun neyi seçer?

Motor görüşün tek bir modelini dayatmaz. Yerleşik sistemin tuttuğu iki bilgi vardır: bu tarafın bugün gördüğü konumlar ve daha önce keşfettiği konumlar. Her biri tek bir evet-hayır bittir. 30 000 konumluk bir dünyada bu bitler 64'lü gruplar hâlinde paketlenir: taraf başına 469 grup ve iki sütun, yaklaşık 7,5 KB eder. 250 tarafta bu bitler ölçülen toplamda yaklaşık 1,9 MB tutar. Bitlerin bellekte nasıl durduğunu dünyanın bellekteki hali günlüğünde anlattık.

Geri kalan her şey oyunun kararıdır:

KonuMotorOyun
Görüş ve keşifBugün görülen ve daha önce keşfedilen konumların bitleri—
MenzilKenar sayısı ya da konum maliyetiyle bütçeHangisinin kullanılacağı ve maliyetin nereden geleceği
Paylaşımİlişki satırının bir tarafın görüşünü ötekine vermesiHangi ilişkinin satır yazacağı, örneğin ittifak
Tespit ve gizlenmeGören tarafın tespit değerinin, görülen birliğin gizlenme değerine yetip yetmediğini sınamasıGizlenme (birliğin ne kadar zor fark edildiği) ve tespit değerleri
BilgiSon görülen kopya ve tahminİstihbarat değeri ve tahminin kuralı
Keşfedilmemiş yerHareketin iki yolu: kapalı ya da tahmini maliyetleHangisinin seçileceği
Oyuncu sisiTablo başına süzmeHangi sisin gösterileceği
Motorun tuttukları ve oyunun seçtikleri

Bu ayrım bilerek yapıldı. İki oyun aynı tarafları görse de savaş sisinin kuralları farklı olabilir. Biri görüşü yalnız menzile bağlar, öteki arazi ve hava maliyetine. Motor ikisini de aynı bit ailesiyle destekler; hangi kuralın geçerli olacağını oyun yazar. Oyunun kuralları nasıl yazıldığını oyun kuralları günlüğünde anlattık.

Menzil: kenar sayısı mı, maliyet mi?

Varsayılan menzil komşu sayısıdır: bir birlik, kenar sayısı kadar uzağı görür. Hızlı ve anlaşılırdır. Oyun isterse her konuma bir maliyet yazar; ormanda ya da dağda pahalı, düz arazide ucuz. O zaman menzil bir bütçe olur ve görüş maliyet tükenene kadar yayılır. Maliyeti dolduran bir konum, arkasındaki konumları görünmez yapar.

Ölçtüğümüz şey tek bir güncelleme adımının süresidir. Koşucu 30 000 konumlu bir dünya, 8 taraf, menzil 3 ve 5 000 kaynak kullandı. Ölçüm paylaşımlı bir makinede, yük 20–30 arasındayken tek koşu olarak alındı.

Görüş güncellemesinin bir adımı: kenar sayısı 1 216, birim konum maliyeti 3 642, değişken konum maliyeti 5 251 mikrosaniye

Her konuma 1 maliyet yazıldığında sonuç kenar sayısıyla aynıydı: iki durumda da 9 855 konum görüldü. Yol doğru, ama üç kat yavaş. Konumlar farklı maliyetli olduğunda güncelleme 5 251 mikrosaniye sürdü ve 9 039 konum görüldü; görülen alan biraz küçüldü.

Paylaşım ve tespit

Paylaşım bir ilişki tablosuyla kurulur. Oyun iki taraf arasında bir satır yazarsa satır, bir tarafın bugün gördüğünü ötekine verir; satırı silerse paylaşım biter. Motor ittifakın ne olduğunu bilmez. Oyun isterse keşfi de paylaşır. Paylaşılan keşif yalnız büyür: bir kez keşfedilen yer, satır silinse bile keşfedilmiş kalır.

Tespit ayrı bir kuraldır. Her birliğin bir gizlenme değeri vardır: birliğin ne kadar zor fark edildiğini gösterir. Gizli bir birlik, gördüğümüz konumda ancak gören tarafın tespit değeri birliğin gizlenme değerine eşit ya da üstündeyse görünür. Paylaşılan görüş tespit taşımaz: müttefikin gördüğü konum açılır, ama orada gizli bir birlik varsa görünmez. Tespit ittifakla gelmez.

Bu bölümde bir hikâye var. İlk hâlinde tespit, her taraf için her konumda bir değer tutuyordu: taraf başına 240 000 bayt, 250 tarafta 60 MB (hesap). Sonra değiştirdik: gizlenen tablonun her yuvasında (tablodaki bir satır için ayrılan yer) bir bit ve yuvanın varlığını tutuyoruz. Aynı 250 tarafta bu 4,16 MB tutar. Bu değer ölçüldü ve formülün verdiği değerle aynı çıktı.

Son bilinen kopya ve tahmin

Görmediğimiz bir birliğin son görülen gücü, taraf onu en son gördüğünde alınan kopyadır. Birlik hareket etse de kopya değişmez. Yuva yeniden kullanılırsa eski kopya gösterilmez.

Tahmin bir istihbarat değeriyle (0 ile 1 arası) çalışır. Tam istihbaratta gerçek değer okunur. Değilse gerçek değer, her gün bir çekilişle en çok (1 − istihbarat) × yayılma kadar kaydırılır. Çekiliş belirlenimcidir: aynı gün aynı cevap çıkar.

Yapay zekâ neyi bilir?

Görüş kuralları açıkken yapay zekâ yalnız tarafının gördüğünü okur. Görmediği değerler bilinmeyendir ve onlara bağlı bir koşul sağlanmaz. Okuma biçimini kipler seçer: bilinmeyen, son bilinen ya da tahmin.

Bunu bir yetenek sınamasıyla denetledik. Kurallar açıkken yapay zekâ görmediği ya da tespit edemediği bir hedefi seçmiyor, kapalı keşfedilmemiş bir bölgeye rota çizmiyor ve müttefikin paylaşılan görüşüne göre hareket ediyor. Bu sınama davranışı doğrular; yapay zekânın kazanma oranına bir ayar eklenmedi. Hangi zorluğun hangi bilgiyi göreceği oyunun kararıdır.

Oyuncu sisi

Oyuncunun ekranında hangi satırların gösterileceğini, tablo başına yazılan bir kural belirler. Örneğin bir oyun şöyle yazabilir: birlikler yalnız görüldüklerinde ve gören tarafın tespiti gizlenmelerine yetiyorsa gösterilsin; emirleri ve planları yalnız sahibi okusun; yerler bir kez keşfedilince görünür kalsın. Hangi sis modelinin kullanılacağı yine oyunun seçimidir.

Bedeli ne?

  • Bellek: Taraf başına görüş ve keşif için yaklaşık 7,5 KB (hesap). Her gizlenen tablo için, 2 048 yuvalı bir tabloda taraf başına yaklaşık 16,6 KB; bu ölçüldü ve formülle aynı çıktı.
  • Hız: Maliyetli menzil, bir güncelleme adımında kenar sayısından üç kat (birim maliyet) ile 4,3 kat (değişken maliyet) yavaştır; bu ölçüldü. Açık görüşün günlük toplam maliyeti ise ölçülmedi, çünkü ölçek dünyamız görüş anahtarlarını kullanmıyor. Onu oyunun kendi dünyasında ölçeceğiz.
  • Gizlenme sorgusu: "Bu konumda şu gizlenme tespit edilir mi?" sorusu bugün kayıtlı durumdan yanıtlanmaz. Bir oyun bunu isterse hesaplanmış bir sorgu olarak eklenir.
  • Ölçülmeyenler: Keşfedilmemiş yer ve tahmin yollarının süresi, ayrıca tespit açıkken gün sonundaki bit hesabının hızı ölçülmedi; bu yollar senaryo sınamalarıyla doğrulandı.

Sık sorulanlar

Savaş sisini motor mu çizer?

Hayır. Motor her tarafın görüş ve keşif bitlerini tutar. Hangi sisin, hangi menzilin ya da hangi tespit kuralının kullanılacağını oyun seçer.

Müttefikin gördüğü gizli birlik görünür mü?

Konum açılır, birlik görünmez. Paylaşılan görüş tespit taşımaz; gizli birliği görmek için kendi tespit değerinin gizlenmeye yetmesi gerekir.

Görüş ne kadar pahalı?

Ekransız koşucuda 30 000 konumlu bir dünyada bir görüş adımı, menzil komşu sayısıyla 1 216 mikrosaniye sürdü; her konuma 1 maliyet yazıldığında 3 642, konumlar farklı maliyetliyken 5 251 mikrosaniye. Açık görüşün oyundaki günlük maliyeti henüz ölçülmedi.

Yapay zekâ görmediği yerlere saldırır mı?

Görüş kuralları açıkken hayır: görmediği ya da tespit edemediği bir hedef seçilmez ve kapalı keşfedilmemiş bir bölgeye rota çizilmez. Bu bir davranış sınamasıdır; kazanma oranı için ayar yapılmadı.

Kaynaklar ve kayıtlar

Dış kaynaklar:

İç kayıtlarımız:

  • Görüş kararı: Menzil, paylaşım, tespit ve bilgi oyunun seçimidir; motor yalnız bitleri ve ilkelleri tutar.
  • Görüş ölçümü: Ekransız koşucu, tek koşu, paylaşımlı makine.

Bu günlük hakkında sorularınız ya da önerileriniz varsa iletişim sayfasından yazabilirsiniz. Motorun genel tanıtımı için MKA Engine sayfasına, bütün günlükler için Geliştirici Günlükleri listesine bakabilirsiniz.

Kaynaklar ve ilgili belgeler

Bunlar da ilginizi çekebilir