İçindekiler

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:
| Konu | Motor | Oyun |
|---|---|---|
| Görüş ve keşif | Bugün görülen ve daha önce keşfedilen konumların bitleri | — |
| Menzil | Kenar sayısı ya da konum maliyetiyle bütçe | Hangisinin kullanılacağı ve maliyetin nereden geleceği |
| Paylaşım | İlişki satırının bir tarafın görüşünü ötekine vermesi | Hangi ilişkinin satır yazacağı, örneğin ittifak |
| Tespit ve gizlenme | Gö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 |
| Bilgi | Son görülen kopya ve tahmin | İstihbarat değeri ve tahminin kuralı |
| Keşfedilmemiş yer | Hareketin iki yolu: kapalı ya da tahmini maliyetle | Hangisinin seçileceği |
| Oyuncu sisi | Tablo başına süzme | Hangi sisin gösterileceği |
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ı.

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:
- Vikipedi, Fog of war (savaş sisi) (yeni sekmede açılır)
- Game Developer, Adding strategy to your tactics (yeni sekmede açılır)
- 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)
İç 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
- Bir strateji oyununun dünya haritası nasıl yapılır?
MKA Engine için gerçek veriden 27.357 konumluk bir 1337 dünya haritası ürettik: arazi, nehirler, boğazlar, nüfus ve konum sınırları nasıl çıkarıldı?
- Oyun motoruna giden yol
MKA Engine'e nasıl başladık: dört oyunu okumak, belirlenimciliği yasa saymak, aşama aşama ölçerek ilerlemek ve şu an neredeyiz.