Bagaimana Anda mendesain sistem record / replay untuk game yang sering berubah?

10

Saya bekerja di MMORPG gratis dan saya punya masalah.

Saya (dengan orang lain) mengembangkan sistem perekaman video untuk permainan. Idenya pada dasarnya: kami merekam semua paket yang dikirim & diterima dengan stempel waktu, ditambah beberapa data lokal dari klien, dan kemudian membuangnya dalam file. Untuk memutar video, kami hanya meniru semua yang ada di file. Kami juga memiliki opsi untuk mengekspor video ke avi dengan ffmpeg.

Masalahnya adalah: ketika kita mengubah antar versi game, sulit untuk mempertahankan kompatibilitas mundur untuk video (perintah ditambahkan / dihapus, perubahan fungsi, dll). Apakah ada cara yang baik untuk menangani masalah ini? alih-alih memiliki banyak pemain yang berbeda dan memilih yang tepat untuk setiap versi file video?

Akan sangat membantu untuk mengetahui bagaimana gim lain menangani situasi ini.

Terima kasih atas bantuannya, maaf untuk bahasa Inggris saya.

Marco
sumber
Sama seperti beberapa makanan tambahan untuk googling / riset: Cara Anda melakukannya adalah persis bagaimana Permainan Gempa id merekam Demo, dengan menangkap Paket Server. Sejauh yang saya tahu mereka tidak pernah menyelesaikan masalah kompatibilitas.
Michael Stum
Saya telah mengubah judul pertanyaan ini - ini bukan tentang MMO, kecuali bahwa MMO adalah game yang paling sering berubah.

Jawaban:

8

Aturan dasar kami adalah untuk tidak pernah mengubah jenis paket yang ada. Semuanya ditambahkan di akhir yang sudah ada, atau perintah baru. Ini juga membuat jauh lebih kecil kemungkinan bagi dua orang untuk saling menginjak pekerjaan masing-masing.

pembuat kode
sumber
Dalam permainan ini, ini terjadi .. Paket ditambahkan, dihapus, dipindahkan (misalnya, beberapa waktu lalu, kami telah memutuskan untuk memindahkan semua paket terkait GM-Perintah ke "paket tambahan", ini mungkin akan terjadi lagi ketika kami menulis ulang sistem serikat .. Mengedit perintah / fungsi (mengubah fungsinya) lebih kecil kemungkinannya, tetapi bukan itu intinya. Anda mengatakan bahwa mulai sekarang, kita seharusnya tidak menghapus paket apa pun, menghapus perintah hanya membiarkannya sisi server yang tidak dapat dijangkau? Terima kasih untuk jawaban Anda!
Marco
1
Yap, tinggalkan dan tinggalkan mereka di sana. Akhirnya barang lama bisa dihapus, tapi itu biasanya setelah satu atau dua tahun.
coderanger
1
Juga, beberapa perencanaan tambahan akan membantu. Semakin baik Anda merencanakan paket Anda sekarang, semakin sedikit perubahan yang perlu Anda lakukan di masa depan.
Kylotan
Masalahnya adalah game selalu berubah. Kami menambahkan paket baru hampir setiap bulan (kami menambahkan fitur baru). Namun, kita harus melakukan banyak perubahan pada fitur penulisan ulang paket lama dan sebagainya .. Tapi saya kira kita dapat meninggalkan metode di sana dan menunggu satu tahun untuk menghapusnya.
Marco
3
Menggunakan tipe paket yang lebih umum akan banyak membantu Anda di sini. Anda tidak perlu menambahkan pesan baru untuk setiap fitur baru yang Anda terapkan.
Kylotan
5

Ini tidak masuk akal, terutama pada PC, bahwa mereka hanya versi kode gameplay dan menabrak versi ketika mereka membuat perubahan yang mempengaruhi sistem replay. Jika file replay ditandai dengan versi kode gameplay yang dibuat dan klien masih memiliki akses ke versi itu, maka file tersebut akan berfungsi dengan baik.

U62
sumber
Begitulah cara saya melihat ini dilakukan dalam praktek, menyimpan nomor versi dengan log game. Maka tentu saja Anda juga harus menyimpan versi perangkat lunak sebelumnya untuk memutar ulang log sebelumnya, misalnya dalam repositori kode sumber, tetapi Anda mungkin harus tetap melakukannya.
Ian Schreiber
Terima kasih atas jawaban Anda, gim ini gratis (berlisensi GPL), jadi siapa pun dapat mengakses versi gim lama, dan bahkan mengkompilasi klien sehingga tidak ada masalah untuk memiliki semua versi gim yang berbeda. Ini sangat digunakan, tidak semua server alternatif menggunakan versi terbaru, ada server yang menjalankan versi dari tahun 2004 ..
Marco
@ Mars: Saya curiga cara kerja SC2 adalah bahwa ia menempatkan hampir semua kode dalam DLL. Saat memuat replay, itu memeriksa versi, dan memuat DLL untuk versi itu, dan berjalan. Ini sedikit lebih rumit, tetapi pengguna hanya perlu satu instal, dan satu exe dapat menjalankan semua replay yang lama.
Mooing Duck
1

Salah satu cara mengatasi hal ini adalah di sepanjang permainan yang disebut "Heroes of Newerth." (yang berubah setiap +/- 2 minggu) Dari apa yang dapat saya katakan kepada mereka:

  1. Gunakan patch yang berbeda untuk game dan replay.
  2. Semua replay disimpan di cloud. Mereka akhirnya kedaluwarsa.
  3. Jika pengguna ingin menonton tayangan ulang lama yang diunduh, mereka harus menggunakan tombol "Compatize" terlebih dahulu.
  4. Sepertinya ini jauh berbeda dengan versi terbaru; atau jika replay tidak lagi disimpan, unggah dan kemudian lakukan diff jarak jauh.

Karena saya tidak bekerja di S2, saya jelas tidak bisa mengatakan itu pasti cara kerjanya. Namun, saya perhatikan tren ukuran unduhan yang ditandai terkait dengan usia pemutaran ulang.

Entah itu, atau mereka menambahkan tambalan entitas ke replay (misalnya mantra X memiliki efek Y, bukan efek Z). Jika informasi terkait paket juga disimpan dalam konfigurasi entitas, hot-patching entitas ini akan memungkinkan Anda untuk memahami paket yang lebih lama.

Saya pasti tidak akan menyimpan perilaku historis pada klien karena itu bisa menjadi sangat besar dengan sangat cepat. Terutama ketika klien memperbarui dari misalnya 10.1.0 ke 10.2.0 (karena mereka perlu mengunduh setiap tambalan antara dua versi, bukan tambalan terakhir).

Google Protobuf adalah ide bagus sebagai lapisan serialisasi karena mendukung hal-hal seperti ini secara desain.

Jonathan Dickinson
sumber