Geliştirici günlüğü

Geliştirici Günlüğü #10: Oyun haritasında kalıcı anahtarlar

Oyun haritasında konum, il ve bölge anahtarları neden kaymamalı? Anahtar defteri, çekiliş düzeltmesi, ölçümler ve sınırları.

İçindekiler
Açık bir deri ciltli defter; sayfalarında pirinç etiketli harita parçaları ve yanında bir mühür, loş ahşap masada

Kısaca: Oyun haritasındaki her konumun, ilin ve bölgenin bir anahtarı, yani değişmeyen bir kimliği vardır. Oyunun içeriği bu anahtarlara bağlanır, bu yüzden haritayı yeniden kurunca anahtarlar kaymamalıdır. MKA Engine'in harita aracı anahtarları bir defterden okur, yeni yer için yeni anahtar verir ve artık var olmayan yerin anahtarını emekliye ayırır; emekli anahtar bir daha kullanılmaz. Yaklaşık 34 bin konumlu bir dünya haritasında aynı küçük harita değişikliği, eski yöntemle 6 039 konum anahtarını emekliye ayırdı; yeni yöntemle bu sayı 2 239 oldu.

Bir strateji oyununda "Kahire" hem bir addır hem de bir yerdir. Oyun dosyası Kahire'yi bir yazıyla değil bir kimlikle tutar: harita yeniden çizilse de kimlik aynı kalır. Tarihsel olaylar, şehir sahipliği ve ticaret yolları bu kimliğe bağlanır. Kimlik kayarsa bir kural ya da bir kayıt yanlış yere bağlanır. Bu yüzden bir anahtar bir kez verilir ve başka bir yere verilmez.

Anahtar defteri kimin?

Harita aracı, motor deposunda duran bir Python boru hattıdır; motorun Rust çekirdeğinin parçası değildir. Anahtar defteri ise oyunun kendi klasöründe durur. Araç anahtarı verir ve korur. Hangi yerin hangi adı taşıyacağına, defterin nerede duracağına ve hangi yerin oyunda var olacağına oyun karar verir. Motor oyuna özgü bir kimlik listesi taşımaz.

Üç kural

  • Bir anahtar bir kez verilir. Yer kurulumda yoksa anahtarı emekliye ayrılır ve bir daha kullanılmaz. Yeni yer yeni anahtar alır.
  • Konum, il ve deniz kayıtları merkez noktasına göre eşleşir; merkez noktası kaydın ortasındaki noktadır. Merkez hâlâ aynı yerdeyse eski anahtar kalır.
  • Kara üzerindeki adlandırılmış bölge, alan ve alt kıta, yapılandırmadaki adının kısaltmasını anahtar alır. Ad sürdükçe anahtar sürer; merkezi kaysa bile sonuna sayı eklenmez. Aynı kısaltmayı veren iki ad hatadır.

Sorun: ortak zar dizisi

Kara üzerinde bölgelere tohum yerleştirirken her bölge tek bir ortak rastgele sayı dizisinden çekiliyordu. Tohum, bir bölgenin büyümeye başladığı ilk noktadır; piksel ise harita ızgarasının her bir karesidir. Çekiliş, bölgenin hangi piksellere tohum koyacağını rastgele seçmesidir. Bir bölgenin kaç çekiliş yaptığı ya da pikselleri değişince, sıradaki bütün bölgelerin sayıları kayıyordu. Bu, sıralı zarların ortasından birini çıkarmak gibiydi: arkadaki her zar başka bir yüz gösterirdi.

Sorunu kenar yumuşatması gösterdi. Kenar yumuşatması, harita sınırındaki basamaklı çizgileri yumuşatan bir değişikliktir. Bu değişiklik geçilmez arazinin (birliklerin geçemediği arazinin) alanını yalnız yüzde 1 değiştirdi, ama 6 039 konum anahtarı emekli oldu. Bunların 3 367'si değişen pikselden 50 pikselden uzaktaydı; yani değişikliğin yanında bile olmayan yerler de kimliğini kaybetti.

Düzeltme: her piksel kendi zarını atar

Artık her pikselin sayısı, rastgelelik için verilen başlangıç değerinden ve pikselin kendi konumundan türer; komşu piksele bağlı değildir. Bir bölgenin tohumları yalnız kendi piksellerine, her pikselin ağırlığına (seçilme payına) ve kotasına (bölgenin alacağı tohum sayısına) bağlıdır. Başka bölgedeki değişiklik ya da bölgelerin sırası bunu değiştirmez. Ağırlığa göre hesaplanan sayılar karşılaştırılır ve en küçük olanlar seçilir; bu, çekilişi yalnız kendi bölgesinin verisine bağlar.

Ölçüm

Aynı kenar yumuşatması değişikliğini iki çekiliş yönteminde ölçtük. Eski yöntemin sayıları önceki bir koşudan, yeni yöntemin sayıları ayrı bir koşudan geldi; her biri tek koşu:

ÖlçütEski çekilişYeni çekiliş
Emekli olan konum anahtarı6 0392 239
Değişiklikten 50 pikselden uzak, emekli olan konum3 367131
200 pikselden uzaktaki konum: piksel piksel aynı kalan / toplam2 691 / 14 77312 412 / 14 782
Emekli olan alan / bölge / alt kıta65 / 10 / 20 / 0 / 0
Sonuna sayı eklenen ad anahtarıvar0
Eski ve yeni çekiliş

Ölçüm harita derleme aracının koşusuyla alındı; oyun çalıştırılmadı, süre ölçülmedi, yalnız anahtar kararlılığı ölçüldü. Kalan 131 uzak emekli anahtar, her grubun kara konumu hedefinin sabit olmasından gelir: kenar değişince grubun ölçeği değişir ve sınırlar kayar. Bu tasarımın istenen sonucudur.

Konum, il, alan, bölge ve alt kıtadan oluşan yapıyı (hiyerarşiyi) kendi defteriyle yeniden kurduğumuzda defter ve hiyerarşi dosyası bayt bayt aynı kaldı.

Tek seferlik geçiş

Eski defterden yeni çekiliş yöntemine ilk geçişte 5 098 konum anahtarı emekli olur. Bunun nedeni çekiliş yönteminin değişmesidir, bir kenar değişikliği değil. Bu geçişte su çekilişindeki ayrı bir değişiklik nedeniyle deniz kayıtlarının 32'si de yeni anahtar aldı. Oyunun içeriği bu anahtarlara bağlıysa geçiş bir kez içerik güncellemesi ister.

Göllerde bir kurulum hatası

Göl kayıtları defterden anahtar almıyordu. Her kurulumda kendi adlarına sonek ekleniyordu: abaya, abaya_2, abaya_3. Düzeltmeden önce, aynı defterle bir sonraki kurulum 276 su alanı ve 293 su ilini emekliye ayırıp yeniden açacaktı.

Şimdi göl kaydı, kökü kendi adı olan defter anahtarını alır: önce merkeze, merkez kaymışsa ada bakarak. Denizler merkeze göre eşleşmeye devam eder. Oyunun defterinin bir kopyasını iki kez hiyerarşiden geçirdik; iki sonuç aynıydı. Su konumlarında 5 863 anahtar korundu, emekli ya da yeni anahtar çıkmadı. Su illerinde 1 351, su alanlarında 447 anahtar korundu. Bir su bölgesi emekli oldu; nedeni henüz doğrulanmadı.

Bedeli ne?

  • Emekli anahtarlar defterde kalır ve yeniden kullanılmaz. Defter her değişiklikte biraz büyür.
  • Yöntem değişikliği bir kez içerik güncellemesi ister: 5 098 konum anahtarı.
  • Kalan uzak emekli anahtarlar (131) grup hedefinin sonucudur; sıfır değildir.
  • Ölçülmeyenler: derleme süresi, oyunun kendi içerik denetimi ve anahtarlara bağlı kayıtların geçişi. Bunlar oyunun işidir.

Sık sorulanlar

Harita anahtarı nedir?

Bir konumun, ilin ya da bölgenin değişmeyen kimliğidir. Yer haritada yeniden çizilse de anahtar aynı kalır; oyunun içeriği ve kuralları bu anahtara bağlanır.

Anahtar neden emekliye ayrılır?

Yer kurulumda artık yoksa anahtarı emekliye ayrılır ve bir daha kullanılmaz. Böylece eski bir kayıt yeni bir yere yanlışlıkla bağlanmaz.

Harita yeniden kurulunca anahtarlar kayar mı?

Yeni çekiliş yönteminde değişikliğin uzağındaki yerlerin çoğu korunur: 50 pikselden uzak emekli konum sayısı 3 367'den 131'e indi. Yöntemin değiştiği ilk kurulumda ise bir kez büyük bir geçiş olur.

Anahtarları motor mu tutar?

Hayır. Harita aracı anahtarı verir ve korur; defter oyunun klasöründedir, hangi yerin hangi adı taşıyacağına oyun karar verir.

Kaynaklar ve kayıtlar

İlgili günlükler: Kilit adım ve senkron kaybı, Sütun deposu ve bellek düzeni.

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