Sistemi tekrarla: girişler veya olaylar kaydedilsin mi?


9

Bunu okudum: Bir tekrar sistemi nasıl tasarlanır Ama sorumu gerçekten cevaplamıyor.

Benim oyun sunucu "model" ve "denetleyici" ayrı bir program olarak oyunun istemci "görünümü" ile inşa edilmiştir. (biraz mmo veya bu şekilde yapılmış çok oyunculu bir oyun gibi). Sunucu tarafı her zaman oyunun "gerçeği" dir, sadece istemcilerden ve çıktı olaylarından ve "mevcut durum" mesajlarından girdi olarak eylem isteklerini kabul eder.

Oyun modeli ve kuralları sabit "kene" güncelleme döngüsüyle tamamen belirleyicidir, bu nedenle sunucu tarafında hem müşteri görünümlerine gönderilen olayları hem de eylem isteklerini kaydedebilirim. Her ikisi de belirli çevrim numarası ile ilişkilidir.

Soru şudur: bu durumda, bir yeniden oynatma sistemi kurmak için, girdiyi mi yoksa kullanıcı eylem isteklerini (orada önerildiği gibi) veya olayları mı kullanmalıyım?

Bana öyle geliyor ki her ikisi de aynı çıktıyı verecek. Görebildiğim tek farklar:

  • Olaylar gerçek çıktı verirken, olayları vermek için eylem isteklerinin işlenmesi gerekir.
  • İşlem isteklerinin kaydedilmesi çok daha az veri olabilir.

Dikkate alınacak başka şeyler var mı?

Yanıtlar:


5

Deterministik bir sistem göz önüne alındığında mantıksal olarak eşdeğerdir, bu nedenle özetiniz hemen hemen doğrudur. Ancak beni çıktı olaylarından ziyade girdi eylemlerini kaydetmeye itecek 2 şey daha var:

  1. Eylemleri kaydederseniz, kodları yalnızca etkinlikleri tekrarlamaktan daha fazla kullandıkları için bunları daha sonra test verileri olarak kullanabilirsiniz. Bu, çökme hatalarının teşhisinde, yapılar arasında davranışsal regresyonların bulunmasında vb.
  2. Gelecekte, belirli bir işlem için gönderdiğiniz etkinlikleri değiştirebilir veya bir nedenden dolayı farklı istemcilere farklı etkinlikler gönderebilirsiniz. Bu durumda, tekrar geçersiz veya eksik olabilir. Aynı problem teoride girdiler için de geçerli olabilir, ancak genellikle girdilerin alanı çıktılardan daha kısıtlıdır ve bu nedenle değişme olasılığı daha düşüktür ve bu durumda geriye dönük uyumluluğa uyum sağlamak daha kolaydır. (Girişler, oynatıcının ve diğer giriş kaynaklarının (ör. Rastgele sayı üreteci) yapabilecekleri ile sınırlıdır, ancak çıkışlar bu girişlerin tüm sonuçlarını ve oyun kuralları tarafından üretilen sunum ipuçları, periyodik sunucu gibi diğer çıkışları içerir. yan etkinlikler vb.)

İyi noktalar, özellikle birincisi. Bu kullanımı unuttum ama oldukça yararlı.
Klaim

Bingo, özellikle # 1. Bazı giriş kayıt sistemi oluşturmak için zamanım olsaydı, her bir testi günlüğe kaydedebilir ve çoğaltması zor olan bazı hataları yakalayabilirdim. Bu "nadir durum" günlüklerini tekrar yükleyebilmek, kodunuzda adım attığınızda hatayı tespit etmeyi kolaylaştırır.
ChrisC

1

Her ikisi de işe yarıyor, ancak dikkate alınması gereken birkaç şey var.

İlk olarak, zaman bilgilerini kaydetmeniz gerektiğini unutmayın. Herhangi bir değişken kare hızına sahip oyunlar için bu özellikle zor olabilir; yeniden oynatma verilerinizin oyunun orijinal olarak simülasyon için kullandığı zamanlama bilgilerini verebildiğinden emin olmanız gerekir.

Ayrıca, oyun davranışındaki ince ayarları hesaba katmanız gerekir. Girişi kaydeder ve daha sonra girdinin nasıl işlendiğini, fiziğin nasıl çözüldüğünü vb. Herhangi bir kısmını değiştirirseniz kaydınız geçersiz olur. Oyun etkinliklerini kaydetseniz bile, bu etkinliklerin nasıl yorumlandığının herhangi bir parçası değişiklik yaparsa, sıkışıp kalırsınız.

Sadece oynatma yapmak istiyorsanız, iyi bir yaklaşım, oyuncu varlığı için zamanlama bilgileriyle birlikte belirli bir konumlar ve rotasyonlar listesi kaydetmektir. Oynatmayı mümkün olduğunca çalıştırırken fizik ve diğer oyun mantığını devre dışı bırakın. Bunun ne kadar kolay veya uygulanabilir olduğu, başka kaç nesneyi senkronize etmeniz gerektiğine bağlıdır.


Soruda, oyun modelinin tamamen belirleyici olduğunu belirtiyorum. Hiçbir fizik yoktur ve kare hızı varyasyonu sadece müşteri tarafında görünür, tamamen "keneye" bağlı oyun modelinde değil.
Klaim
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.