Geliştirici günlüğü

Geliştirici Günlüğü #25: Oyun durumunun parmak izi ve nüfus grupları

Oyun durumunun parmak izini ve nüfus gruplarını düzenleme sıklığını iki ayrı test koşulunda ölçüyor, sonuçların sınırlarını açıklıyoruz.

İçindekiler
Harita üzerindeki nüfus kümeleri ve takvim, dünyadaki birkaç değişimi izleyen parmak izi halkasına bağlanıyor

Kısaca: MKA Engine’de oyun durumunun parmak izini yalnız değişen bölümleri yeniden hesaplayarak güncelledik; bu, az şeyin değiştiği bir dünyada ölçümü hızlandırırken sık değişen bir koşuda yavaşlatabildi. Büyük nüfus tablolarını her gün yeniden düzenlemek yerine daha seyrek düzenlemeyi de ölçtük: sıradan günler kısalırken ay sonuna iş yığılıyor. Sonuçlar ayrı test dünyalarına aittir; tam oyun günü performansı olarak okunmamalıdır.

Sorun ne idi?

Çok oyunculu bir strateji oyununda herkesin aynı dünya durumuyla ilerlemesi gerekir. Durum parmak izi, bu dünyanın kısa bir özeti gibidir: oyuncuların simülasyonlarının birbirinden ayrıldığını fark etmeye yardım eder. Önceki günlüklerde çok oyunculu tutarlılığı ve dünyanın bellekte nasıl tutulduğunu anlatmıştık (#2, #3).

Önceki yöntem, değişen bilgileri tek tek değil, onları içeren büyük bölümleri topluca özetliyordu. Az sayıda değişiklik olsa bile, etkilenen bölümün özeti çıkarılırken o bölümün okunması gerekebiliyordu; bu, her adımda bütün dünyanın yeniden okunması değildi. Öte yandan yalnız değişen parçaları takip etmek de her koşulda bedava değildir: bir günün büyük kısmı değişiyorsa, her parçayı tek tek izlemek baştan hesaplamaktan pahalıya gelebilir.

Nüfus gruplarını benzer özelliklerine göre düzenli tutmak da ayrı bir masraftır. Yeni gruplar sık doğduğunda, bütün grupları her gün yeniden düzenlemek günün çoğunu bu işe ayırabilir. Daha seyrek düzenlemek bunu azaltabilir; ancak düzenlemenin yapıldığı gün daha yoğun olur.

Nasıl çözdük?

Değişen bölümleri yeniden hesapladık

Önceki yöntemde değişen büyük bölümlerin özeti topluca çıkarılıyordu. Yeni yöntemde değişen her öğenin parmak izine katkısını ayrı ayrı güncelliyoruz. Dünya çoğunlukla sabitse, aynı bilgiyi yeniden okumaktan kaçınıyoruz. Aynı zamanda farklı bir durumda—çok sayıda bölüm her gün değişirken—bu yöntemin getirisi azalabilir. Bu nedenle iki koşulu da ölçtük; tek bir iyi sonuçtan genel hız iddiası çıkarmadık.

Yan yana iki harita: birinde değişen büyük bölümlerin toplu özeti güncelleniyor, diğerinde yalnız değişen bölgelerin katkısı duruma ekleniyor

Nüfus gruplarını yeniden düzenleme sıklığını seçilebilir kıldık

Bir oyunun ihtiyaçlarına göre, yeni oluşan gruplar belirli aralıklarla yeniden düzenlenebilir. Düzenleme aralığı uzadığında gruplar günlük işlemlerden kaybolmaz; oyun onları düzenleme yapılana kadar da hesaba katabilir. Böylece oyun, günlük düzenlemenin maliyetini daha seyrek bir toplama işiyle takas eder. Bu seçim evrensel bir ayar değildir: değişimin hangi gün görünür olması gerektiği ve ay sonundaki iş yükü oyunun tercihidir.

Günlük takvimde az sayıda yeni nüfus grubu düzenlenirken ay sonu biriken çok sayıda grup birlikte düzenleniyor

Ne gördük?

İlk ölçümde, harita içeren büyük bir deneme dünyasında yalnız durum parmak izinin süresine baktık. Dünya yaklaşık 2,04 milyon nüfus grubu içeriyordu; sistem yük göstergesi (çalışan ve sırada bekleyen işlerin yoğunluğunu kabaca gösterir) ölçüm sırasında 8–9 aralığındaydı. Milisaniye, saniyenin binde biridir. Tablodaki işçi sayısı, motorun aynı anda işi paylaştırdığı görevli sayısını gösterir.

İşçi sayısıÖnceki yöntemDeğişiklik sonrası
19,5–9,8 ms0,92–1,23 ms
86,6–7,2 ms0,46–0,55 ms

Bunlar yalnız durum özetinin süresidir; tam bir oyun gününün süresi değildir. Farklı koşuda sonuç tersine döndü: 60 günlük koşucu senaryosunda özet hesabı günde 0,086 ms’den 0,459 ms’ye çıktı. Daha sonraki, ayrı bir 60 günlük ve 8 işçili ölçümde kısmi düzeltme özeti 0,32 ms/günden 0,26 ms/güne indirdi; aynı senaryonun karşılaştırma tabanı 0,11 ms/gündü. Yani düzeltme yolu iyileştirdi ama tabana döndürmedi. Yük koşulları farklı olduğu için bu sonuçları tek bir seri gibi birleştirmiyoruz. Bu senaryoda çoğu durum her gün değiştiği için yalnız değişen parçaları tek tek güncellemenin ek işi faydayı aştı. Nedenini ölçtüğümüz kadar anlattık; koşunun en yavaş günlerinin başka hangi işlerden etkilendiği kesinleşmedi.

Nüfus gruplarını düzenleme ölçümü ayrı bir büyük test dünyasında, deneysel bir nüfus güncelleme yolu kullanılarak 26 oyun günü sürdü. Günlük düzenleme, test adımının yüzde 70–72’sini alıyor ve adım yaklaşık 15–18 ms sürüyordu. Aylık düzenlemede ortalama gün 1 işçiyle 3,63 ms, 8 işçiyle 2,72 ms oldu; ay sonundaki düzenleme günü ise sırasıyla 19,6 ve 18,5 ms’ye çıktı. Makine yükü 2,8–3,9 aralığındaydı. Bu ölçüm de tam kampanya veya bütün motor için değil, belirtilen büyük test dünyasındaki bu iş için geçerlidir.

Başlangıç düzenini de ölçtük

Aylık aralığı ilk denediğimizde başlangıç dünyasının kuruluş biçimi, beklenmedik biçimde her gün ek iş çıkarıyordu. Bu kurulum yolunu düzelttikten sonra aylık ölçümü yeniden aldık. Bu ayrıntı, aylık düzenlemenin her durumda daha hızlı olduğu anlamına gelmez; yalnızca karşılaştırmanın düzgün kurulması için yaptığımız düzeltmeyi açıklar.

Neden böyle seçtik?

Durum özeti ve nüfus gruplarını düzenleme aynı sorun değildir; biri dünyadaki değişimleri izler, diğeri benzer grupları birlikte işlemeye hazırlar. Bu yüzden birini hızlandırırken diğerinin de otomatik olarak hızlanacağını varsaymadık. Az değişen ve çok değişen dünyaları ayrı ölçmek, ayrıca günlük ve aylık düzenleme arasındaki sıradan gün/ay sonu farkını göstermek daha dürüst bir karşılaştırma sağladı.

Bedeli ne?

Değişen parçaları takip etmek, değişikliğin az olduğu koşulda hesap işini azaltıyor; çoğu şey değiştiğinde ise ek takip işi yaratabiliyor. Aylık düzenleme sıradan günleri kısaltırken ay sonuna belirgin bir iş yükü taşıyor. Koşucu senaryosundaki durum özeti hâlâ önceki ölçüm düzeyine dönmedi.

Sırada ne var?

Çok değişen koşudaki özeti ve onun en yavaş günlerini yeniden incelememiz gerekiyor. Aylık düzenlemenin günlük simülasyonla birlikte gerçek bir oyun senaryosunda nasıl davrandığını da ölçmeden, bunu genel bir performans önerisi olarak sunmayacağız.

Sık sorulanlar

Durum parmak izi ne işe yarar?

Oyuncuların simülasyonlarının aynı dünya durumunda kalıp kalmadığını fark etmeye yardım eden kısa bir özettir. Buradaki ölçüm parmak izinin hesaplanma süresine aittir.

Durum özeti her zaman hızlandı mı?

Hayır. Az değişen büyük harita ölçümünde kısaldı; çoğu bilginin her gün değiştiği 60 günlük koşuda uzadı. Kısmi düzeltme sonrasında bile önceki düzeye dönmedi.

Aylık düzenleme neden ay sonu daha yavaş?

Çünkü ertelenen düzenleme o gün yapılır. Ölçümde ortalama gün kısalırken ay sonu günü daha yoğun çıktı.

Bu sayılar tam bir kampanyayı mı anlatıyor?

Hayır. Her iki ölçüm de tanımlanmış test dünyalarında belirli bir motor işini ölçüyor. Tam oyun günü süresi veya genel bir hız garantisi göstermiyor.

Daha fazla arka plan için çok oyunculu tutarlılık, dünyanın bellekteki düzeni, MKA Engine ve geliştirici günlükleri sayfalarına bakabilir; sorularınızı iletişim sayfasından iletebilirsiniz.

Kaynaklar ve ilgili belgeler

Bunlar da ilginizi çekebilir