Geliştirici günlüğü

Geliştirici Günlüğü #13: Betik sınırları ve sonsuz döngü

Oyun betikleri döngü, tarama, eylem zinciri ve mod yakıtını nasıl sınırlar? Varsayılanlar, aşılınca ne olduğu ve neden süre değil sayı.

İçindekiler
Eski bir çalışma tezgâhında pirinç bir merkezkaç regülatörü; ağırlıkları dış sınıra açılmış, yanında durdurma bloğu, zincir makarası ve kayıt cetveli var

Kısaca: Oyun betikleri döngü kurar, koleksiyonları tarar, eylemleri birbirine zincirler ve modları çalıştırır. MKA Engine bu işlerin her birine tur, üye, kat ve komut sayısıyla bir betik sınırı koyar; sınırları yalnız oyunun manifesti ayarlar, modlar değiştiremez. Sınır aşılınca ilgili etki ya da değerlendirme durur, sorun kayda yazılır; motor çökmez ve sonuç her makinede aynı kalır.

Sınır olmadan ne olur?

Sınır olmasaydı, hatalı yazılmış hiç bitmeyen bir döngü tek oyuncuda oyunu takardı. Çok oyunculu oyunda bu daha ağırdır: her makine aynı adımı kendi başına koşar ve yavaşlayan bir adım herkesi bekletir. Bu yüzden sınır, betiğin yazarının dikkatine bırakılmaz; motorun parçasıdır.

Hangi sınırlar var?

SınırVarsayılanAşılınca
Döngü (loop)while başına 1000 turSabit sayı bu sınırı aşıyorsa yükleme hatası; çalışırken etki durur ve betik hatası yazılır
Tarama (scan)Bir değerlendirmede en çok 1.000.000 koleksiyon üyesiDeğerlendirme durur; o ana kadar yazılanlar kalır
Eylem derinliği (action_depth)Bir eylem zinciri en çok 8 kat derine inerZincir durur, betik hatası yazılır
Mod yakıtı (mod_fuel)Wasm modunun her çağrısında 10.000.000 komutÇağrı durur, mod durdurulur
Mod belleği (mod_memory_mb)Wasm mod örneği başına 16 MBMod durdurulur
Betik sınırları ve varsayılanları

Sınırlar oyunun project.bsm dosyasında limits anahtarıyla yazılır. Bir mod bu anahtarı yazarsa motor bunu tanı olarak bildirir. Sınırlar sonucu etkilediği için değişince mod setinin özeti de değişir.

Neden süre değil sayı?

Süre sınırı akla ilk gelen çözümdür. Ama süreyle kesilen bir işin sonucu makinenin hızına bağlanır: yavaş bir bilgisayarda yarım kalan adım, hızlı bir bilgisayarda tamamlanan adımdan farklı olur. Bu yüzden sınırlar tur, üye, kat ve komut sayısıyla ölçülür; her makine aynı yerde keser.

Oyunun süre hedefi (step_target_ms) ise bir ölçüm hedefidir. bsm run adım süresini bu hedefle karşılaştırır ve aşan adımları yazar; adımı asla kesmez.

Pahalı betik nasıl bulunur?

İki araç var. bsm check pahalı kalıpları dosya, satır ve sütunla uyarır: her adımda bütün satırları gezen taramaları ve sık çalışan olayların koşullarını. Uyarı çıkış kodunu değiştirmez; derleme hatası değildir. bsm run --script-cost N ise koşunun gün satırlarından sonra en pahalı N betiği, olay ve eylem adlarıyla, çağrı sayısı ve süresiyle yazar.

Testler neyi sınadı

  • Döngü sınırı aşıldığında etki durur ve betik hatası yazılır; sabit sayı sınırı aşıyorsa yükleme hatası verilir.
  • İç içe taramalar bütçede durur ve o ana kadar yazılanlar kalır.
  • Sınırdan derin bir eylem zinciri tek bir betik hatası olur.
  • Oyunun manifesti sınırları ayarlar; mod yakıtı değişince mod setinin özeti değişir.
  • bsm check pahalı kalıpları beklenen metinle uyarır ve çıkış kodu değişmez.

Bedeli ne?

  • Sınır, yazılmış işi de keser: 1000 turdan uzun bir döngü istediği işi tamamlayamaz. Yazar döngüyü kısaltmak ya da count ve max ile daraltmak zorundadır.
  • Varsayılanlar bir tahmindir; ihtiyaç ölçülürse sınır oyunun manifestinde yükseltilir.
  • Bu günlükte ölçüm yok. Yazı sınırların davranışını anlatır; bir betiğin kaç milisaniye sürdüğünü ölçmez.

Sık sorulanlar

Betik sınırı nerede ayarlanır?

Yalnız oyunun project.bsm dosyasında, limits anahtarıyla. Bir mod bu sınırları değiştiremez.

Döngü sınırı aşılırsa oyun çöker mi?

Hayır. Çalışırken döngünün içinde bulunduğu etki durur ve betik hatası yazılır. Sabit bir sayı sınırı aşıyorsa hata yükleme sırasında verilir.

Sınırlar neden saniye değil sayı ile ölçülür?

Süre makineye göre değişir ve yarım kalan bir adım her makinede farklı yerde kesilir. Tur, üye, kat ve komut sayısı her makinede aynı yerde keser.

Pahalı bir betiği nasıl bulurum?

bsm check pahalı kalıpları dosya, satır ve sütunla uyarır. bsm run --script-cost N koşunun gün satırlarından sonra en pahalı N betiği çağrı sayısı ve süresiyle yazar.

Kaynaklar ve kayıtlar

İlgili günlükler: Geliştirici Günlüğü #7, Oyun motorunda mod desteği.

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