Geliştirici Günlükleri

MKA Engine'i geliştirirken tuttuğumuz günlükler: neyi neden böyle kurduğumuz ve ne ölçtüğümüz.

MKA Engine'i geliştirirken tuttuğumuz günlükler. Her günlükte bir kararı, nedenini ve ölçtüğümüz sonucu yazıyoruz. Motorun kendisi için MKA Engine sayfasına bakın.

Geliştirici Günlükleri

Geliştirici Günlüğü #18: Mod komutları nasıl denetleniyor?

· Ayrı sayfada aç

Üç bağlı dünya haritası aynı oyun adımlarını izlerken, ayrı bir masada bir komut inceleniyor

Kısaca: Modlar, ekledikleri komutlar için oyuna özgü denetim kuralları tanımlayabilir. Oyuncu arayüzünün sorduğu soru ile komut uygulanmadan önce yapılan denetim aynı kuralı kullanır; tek bir makinede sorulan arayüz sorusu da çok oyunculu ortak akıştan ayrı tutulur.

Bir strateji oyununda oyuncu, bir hamleyi seçmeden önce “Bu komut şimdi geçerli mi?” diye sorabilir. Dünya bu sorudan sonra değişebileceği için komut işlenirken verilen yanıt farklı çıkabilir; önemli olan, aynı kuralın her iki seferde de o anki dünya koşullarını değerlendirmesidir. Bizim amacımız, modun kendi oyun kuralını bu iki anda da aynı biçimde uygulamak.

Komut için aynı denetim

Mod, eklediği bir komut için kabul ya da ret yanıtı veren bir kural tanımlayabilir. Oyuncu arayüzü komutun kullanılabilir olup olmadığını sorarken de oyun komutu uygulamadan hemen önce değerlendirirken de aynı kural çalışır; kural her seferinde güncel dünya koşullarına bakar. Bu iki değerlendirme arasında dünya değişmişse yanıt da değişebilir.

Mod bu ek kuralı tanımlamazsa, modun komuta özgü denetimi yapılmaz; oyunun ve motorun diğer kuralları yine geçerlidir. Komut reddedilirse uygulanmaz ve dünya değişmez. Kabul edilmesi, komutun o anki kurallara uygun bulunduğu anlamına gelir; değişiklik normal oyun adımında yapılır.

Oyuncunun komut sorusu ile uygulama öncesi denetim aynı oyun kuralına başvuruyor; kontrol haritayı değiştirmiyor

Denetim dünyayı değiştirmez

Komut denetimi, işlemin mevcut dünya koşullarında geçerli olup olmadığını anlamaya yarar. Bu sırada kural dünyayı inceleyebilir, ancak denetimin kendisi oyun durumunda değişiklik yapmaz. Böylece oyuncunun düğmenin neden etkin olup olmadığını sorması, oyun dünyasında hamlenin yapılmış sayılmasına yol açmaz.

Bunu bir dükkânda görevliye “Bu ürünü alabilir miyim?” diye sormaya benzetebiliriz. Görevli stok durumunu kontrol eder; soruyu yanıtlamak için ürünü teslim edilmiş gibi işaretlemez. Teslim işlemi ancak alışveriş gerçekleştiğinde yapılır.

Denetim sırasında bir kural beklenmedik bir çalışma hatası verirse komut reddedilir ve hata kayda alınır. İncelediğimiz komut yolunda bu hata tek başına modun diğer işlerini durdurmaz; sonraki bir komut işlenebilir. Bu ayrım, hatalı denetimin oyun dünyasına uygulanmasını önler.

Yerel soru, ortak oyundan ayrı

Aynı oyun adımlarını paylaşan haritalardan ayrı bir masada tek makinede sorulan komut sorusu

Çok oyunculu oyunda bütün bilgisayarların ortak dünya için aynı komutları aynı sırayla işlemesi gerekir. Oyuncu arayüzünün bir komut hakkında sorduğu soru ise yalnızca oyuncunun kendi bilgisayarında sorulabilir. Soru ortak dünya adımına doğrudan katılmaz; ancak sonraki denetim bu yerel sorunun bıraktığı geçici bilgilere dayanırsa, farklı bilgisayarlarda farklı yanıtlar doğabilir.

Motor arayüz sorusunu ortak oyun adımlarından ayrı tutar; böylece soru kendi başına ortak hesaba eklenmez. Ancak bu ayrım tek başına ortak adımların aynı kalmasını sağlamaz: mod denetiminin sonucu yalnızca ortak dünya verilerine ve herkes için yüklenmiş ortak oyun içeriğine dayanmalı, önceki yerel soruların bıraktığı geçici bilgilere dayanmamalıdır. İncelediğimiz hata yolunda ilgili komut reddedilir ve hata kayda alınır; bu bulgu diğer hata türlerine genellenemez.

Oyuncu denetimi ne zaman gerekir?

Mod, bir komutun belirli bir oyun nesnesine yöneldiğini ve gönderen oyuncunun bu nesneyi yönetmesi gerektiğini belirtebilir. Motor bu koşulu, oyun da oyuncuların hangi nesneleri yönettiğini bildirdiğinde uygular. Böylece bu bilgi yoksa her komuta kendiliğinden yetki şartı eklenmez.

Modun kuralı komutun oyuna özgü koşullarını, motorun denetimi ise bildirilmiş oyuncu-yönetim koşulunu ele alır. Böylece “Bu komut oyunumda geçerli mi?” sorusu ile “Bu oyuncu belirtilen nesneyi yönetiyor mu?” sorusu birbirine karışmaz.

Ne gördük?

İncelediğimiz denemede, tek makinedeki arayüz sorusundan sonra ortak adımlar, soru sorulmayan dünyayla aynı ilerledi. Bu sonuç, denetimin yerel soru geçmişine değil ortak oyun verilerine dayanması koşuluyla sınırlıdır. Hatalı bir komut denetimi komutu reddetti; modun sonraki komutu ve düzenli işleri çalışmayı sürdürdü. Deneme gerçek ağ oturumu, farklı fiziksel bilgisayarlar, gecikme veya hız ölçümü değildir.

Komut denetimi hatası için de aynı sınır gözlendi: komut uygulanmadı, hata kayda geçti ve sonraki komut değerlendirilebildi. Bu, her tür mod hatasının zararsız olduğu anlamına gelmez; burada söz konusu olan, arayüzün ya da oyun adımının yaptığı komut denetimindeki hatadır.

Neden böyle seçtik?

Arayüz sorusu ile komut uygulanırken yapılan denetim için iki ayrı kural yazmak zamanla farklı ölçütler doğurabilirdi. Aynı kuralı kullanmak bu ayrılığı önler; her değerlendirme o andaki dünya koşullarına bakar, bu nedenle koşullar değişmişse yanıt da değişebilir.

Yerel arayüz sorusunu ortak dünya adımlarından ayırmak tutarlılığı destekler; ancak bunun yeterli olması için denetim, herkesin paylaştığı dünya verileri ve yüklenmiş ortak oyun içeriğiyle çalışmalı, önceki yerel soruların bıraktığı bilgileri kullanmamalıdır.

Bedeli ne?

Bu ayrım oyun çalışırken ek bellek kullanır; miktarı ve hıza etkisi ölçülmedi. İncelediğimiz senaryoda yerel arayüz sorusu ortak dünya adımlarını değiştirmedi; bu sonuç denetimin yerel soru geçmişini kullanmadığı koşula bağlıdır ve gerçek ağ performansını ya da tüm hata türlerini kapsamaz.

Sık sorulanlar

Mod kendi komutunun geçerli olup olmadığını belirleyebilir mi?

Evet. Mod, komutu kabul eden ya da reddeden ek bir kural tanımlayabilir. Arayüz sorusu ve uygulama öncesi denetim aynı kuralı kullanır; her biri o anki koşulları değerlendirir, bu yüzden arada dünya değişmişse yanıt farklı olabilir.

Komut denetimi oyun dünyasını değiştirebilir mi?

Hayır. Denetim mevcut koşulları inceler; komut reddedilirse uygulanmaz. Değişiklik kabul edilen komut oyun adımında işlenirken yapılır.

Denetim sırasında hata olursa oyun durur mu?

İncelediğimiz komut denetimi yolunda hata komutu reddeder ve kayda alınır; sonraki komutlar ve modun diğer işleri devam edebilir. Bu, diğer hata türleri için genel bir güvence değildir.

Motor her komutta oyuncunun ilgili nesneyi yönetmesini ister mi?

Hayır. Bu kontrol, komut tanımında böyle bir koşul belirtildiğinde ve oyun oyuncu-yönetim bilgisini sağladığında uygulanır. Modun kendi oyun koşulları bundan ayrı değerlendirilir.

Çok oyunculu dünyaların ortak adımları nasıl izlediği için Geliştirici Günlüğü #2, modların kapsamı için Geliştirici Günlüğü #8 yazımıza bakabilirsiniz. Sorularınız için iletişim sayfasından bize ulaşabilirsiniz.