Cara menangani gerakan acak waktu nyata dengan prediksi sisi klien

10

Saya sedang membangun game multipemain waktu nyata yang menjalankan loop 'fisika' yang sama pada klien dan server. Saya menggunakan perilaku pengembara 'mengembara' yang merupakan gerakan acak penting. Klien dan server menghasilkan angka acak yang berbeda saat menjalankan algoritma pengembaraan.

Saya bertanya-tanya bagaimana saya bisa menjaga gerakan tampak acak secara alami tetapi menggunakan beberapa konstanta yang akan memastikan klien dan server sampai pada kesimpulan yang sama.

kevzettler
sumber
4
Membuat urutan acak yang sama dari urutan nomor acak semu itu mudah. Yang sulit adalah menyinkronkan penggunaan urutan itu. Anda harus membuat logika permainan Anda deterministik, bukan dalam arti bahwa Anda tidak menggunakan urutan acak, tetapi untuk menggunakan urutan acak dengan cara deterministik. Cara termudah untuk mencapai hal ini biasanya untuk menghindari konkurensi dalam loop logika game, namun dimungkinkan untuk memiliki konkurensi selama utas tidak bergantung pada waktu dan pengurutan PRNG ketika meminta PRNG untuk nilai acak. Ini dia naga.
Lie Ryan

Jawaban:

14

Anda dapat menggunakan benih acak . Pilih nilai 32-bit yang sama di server dan klien (atau server dapat mengirimkannya ke klien di awal). Gunakan itu sebagai benih untuk generator acak. Anda dapat mengirim seed aktual dari server ke klien dengan pembaruan status permainan. Jika Anda tidak ingin mengirimnya, Anda harus yakin bahwa klien dan server menghasilkan nomor acak yang sama dengan generator acak ini.

Apa yang harus Anda ketahui sebelum Anda memutuskan untuk tidak mengirim seed sebenarnya ke klien:

  • Anda akan memiliki masalah dengan pemusnahan karakter pada klien (berarti tidak memproses karakter jauh di dalam kabut perang pada klien). Jika Anda ingin membuat karakter culling keputusan terbaik akan mengirim semua status karakter (dengan seed aktual) dari server ke klien ketika klien harus memproses karakter. Jadi, server harus memutuskan kapan klien harus memproses karakter dan kapan tidak. Pastikan Anda menggunakan generator acak terpisah untuk setiap karakter.
  • Masalah yang sama akan terjadi pada penginapan AI.
  • Nomor acak dari generator acak ini harus dibuat hanya dalam pembaruan dengan delta waktu tetap. Jika Anda ingin menggunakan angka acak untuk interpolasi AI sebelum merender, Anda harus menggunakan generator acak terpisah (tidak ada render di server, jadi jangan pedulikan benih apa yang akan Anda gunakan).
  • Jika Anda ingin menggunakan platform yang berbeda untuk klien dan server (C ++ dan Java, misalnya), Anda harus menerapkan (atau menemukan) generator acak lintas platform. Itu bukan masalah besar, karena generator acak mudah diimplementasikan.
Bupati Kostya
sumber
3

Jika server dan klien menyetujui seed, kebanyakan algoritma pengacakan akan menghasilkan nilai yang sama.

Lince Assassino
sumber