Sık değişen bir oyun için kayıt / tekrar oynatma sistemini nasıl tasarlarsınız?


10

Ücretsiz bir MMORPG'de çalışıyorum ve bir sorunum var.

Oyun için bir video kayıt sistemi geliştiriyorum. Fikir temel olarak: zaman damgaları ile gönderilen ve alınan tüm paketleri, ayrıca istemciden bazı yerel verileri kaydeder ve daha sonra bir dosyaya dökürüz. Videoyu oynatmak için dosyadaki her şeyi taklit ediyoruz. Ayrıca videoyu ffmpeg ile avi'ye dışa aktarma seçeneğimiz var.

Sorun şudur: Oyunun sürümleri arasında geçiş yaptığımızda, video için geriye dönük uyumluluğu korumak zordur (eklenen / kaldırılan komutlar, işlev değişiklikleri, vb.). Bu sorunu çözmenin iyi bir yolu var mı? bir sürü farklı oynatıcıya sahip olmak ve video dosyasının her sürümü için doğru olanı seçmek yerine?

Diğer oyunların bu durumu nasıl ele aldığını bilmek faydalı olacaktır.

Yardımın için teşekkürler, İngilizcem için üzgünüm.


Tıpkı googling / araştırma için biraz daha yiyecek gibi: Bunu yapmanın yolu, id's Quake Games'in Sunucu Paketlerini yakalayarak Demos'u tam olarak nasıl kaydettiğidir. Bildiğim kadarıyla hiçbir zaman uyumluluk sorunlarını çözmediler.
Michael Stum

Bu sorunun başlığını değiştirdim - MMO'larla ilgili değil, MMO'ların en sık değişen oyunlar olması dışında.

Yanıtlar:


8

Temel kuralımız asla mevcut bir paket türünü değiştirmektir. Her şey varolan bir komutun sonuna eklenir veya yeni bir komut eklenir. Bu aynı zamanda iki kişinin birbirlerinin çalışmalarını durdurma olasılığını da azaltır.


Bu oyunda olur .. Paketler eklenir, kaldırılır, taşınır (örneğin, bir süre önce, GM Komutları ile ilgili tüm paketleri "genişletilmiş bir pakete" taşımaya karar verdik, bu muhtemelen guilds sistemi .. Komutları / işlevleri düzenleme (işlevselliğini değiştirme) daha az olasıdır, ama asıl nokta bu değil.Olduktan sonra, herhangi bir paketi kaldırmamalıyız, komutları sil sadece onlara ulaşılamayan sunucu tarafı olsun? Cevabınız için!
Marco

1
Evet, itiraz et ve orada bırak. Sonunda eski şeyler kaldırılabilir, ancak bu genellikle bir veya iki yıl sonra olur.
coderanger

1
Ayrıca, bazı ekstra planlama yardımcı olacaktır. Paketlerinizi ne kadar iyi planlarsanız, gelecekte o kadar az değişiklik yapmanız gerekir.
Kylotan

Sorun şu ki oyun her zaman değişiyor. Neredeyse her ay yeni bir paket ekliyoruz (yeni özellikler ekliyoruz). Yine de, eski paketlerin yeniden yazma özelliklerinde çok fazla değişiklik yapmalıyız ve böylece .. Ama sanırım yöntemleri orada bırakıp kaldırmak için bir yıl bekleyebiliriz.
Marco

3
Daha genel paket türleri kullanmak burada size çok yardımcı olacaktır. Uyguladığınız her yeni özellik için yeni mesaj eklemenize gerek yoktur.
Kylotan

5

Özellikle bir bilgisayarda, oyun kodunu sürümlendirmeleri ve yeniden oynatma sistemini etkileyen bir değişiklik yaptıklarında sürümü çarpmaları akıl almaz değil. Yeniden oynatma dosyası, oluşturulduğu oyun kodunun sürümü ile etiketlenmişse ve istemci, düzgün çalışması gereken sürüme erişebilir.


Bunu pratikte böyle yaptım, sürüm numarasını oyun günlüğüyle saklayın. Daha sonra elbette, önceki günlükleri, örneğin bir kaynak kodu deposunda yeniden oynatmak için önceki yazılım sürümlerini tutmanız gerekir, ancak muhtemelen bunu zaten yapmalısınız.
Ian Schreiber

Cevabınız için teşekkürler, oyun ücretsizdir (GPL lisanslı), bu nedenle herkes eski oyun sürümlerine erişebilir ve hatta istemciyi derleyebilir, böylece tüm farklı sürümlerine sahip olmak bir sorun değildir. Bu çok kullanılır, tüm alternatif sunucular en son sürümleri kullanmaz, 2004'ten sürümleri çalıştıran sunucular vardır ..
Marco

@Marco: SC2'nin nasıl çalıştığından şüpheleniyorum, kodun neredeyse tamamını bir DLL'e koyar. Bir yeniden yükleme yüklediğinde, sürümü denetler ve bu sürümün DLL dosyasını yükler ve çalışır. Biraz daha karmaşık, ancak kullanıcının sadece bir yüklemeye ihtiyacı var ve bir exe tüm eski tekrarları çalıştırabilir.
Mooing Ördek

1

Bununla mücadele etmenin bir yolu "Heroes of Newerth" adlı oyunun çizgileri boyunca. (Bu her +/- 2 haftada bir değişir) Ne söyleyebilirim:

  1. Oyun ve tekrarlar için farklı yama kullanın.
  2. Tüm tekrarlar bulutta depolanır. Sonunda süresi doluyor.
  3. Kullanıcı eski bir indirilmiş tekrar oynatmayı izlemek istiyorsa, önce "Uyumluluk" düğmesini kullanması gerekir.
  4. Bu ya en son sürüme uzak farklar gibi görünüyor; veya yeniden oynatmanın artık depolanmaması durumunda, onu yükler ve uzaktan kumandayı fark eder.

S2'de çalışmadığım için kesinlikle böyle çalıştığını söyleyemem. Ancak, tekrar yaşıyla ilişkili belirgin bir indirme boyutu eğilimi fark ettim.

Ya bu ya da tekrara varlık yamaları ekler (örneğin, büyü X'in Z etkisi yerine Y etkisi vardır). Paketle ilgili bilgiler varlık yapılandırmasında da depolanırsa, bu düzeltme eki düzeltme eki eski paketleri de anlamanıza olanak tanır.

Kesinlikle müşteri üzerinde tarihsel davranış depolamak olmaz çünkü bu çok hızlı bir şekilde çok büyük olabilir. Özellikle istemci, 10.1.0'dan 10.2.0'a güncelleme yaparken (son yama yerine iki sürüm arasındaki her yamayı indirmeleri gerektiği için).

Google Protobuf, serileştirme katmanı olarak iyi bir fikirdir, çünkü tasarım yoluyla böyle şeyleri destekler.

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.