Bagaimana cara menyinkronkan tindakan seperti melompat di multipemain?


11

Saya adalah pengembang game pemula dan saya telah meneliti tentang game multi-pemain. Saya mengamati bahwa selalu ada latensi, para pemain selalu mendapatkan pembaruan dari tindakan sebelumnya. Tetapi ada teknik seperti perhitungan mati untuk menangani latensi. Saya bisa memprediksi gerakan dan membuat gerakan halus. Tetapi bagaimana saya melakukan tindakan sinkronisasi seperti melompat, berhenti berjalan, dll.

Misalkan, klien A bergerak, ia berada pada kecepatan 100 m pada waktu 10,2 dengan kecepatan 100 m / detik dan mengirimkan informasi ini. Klien B akan menerima informasi ini agak terlambat, biarlah 10.4. Jadi pada klien B, saya dapat menggunakan prediksi dan menempatkan klien A pada jarak 120 m. Tetapi bagaimana jika, klien melompat 110 m pada 10,3. Saya tidak dapat memprediksi itu dan karena saya telah menggunakan prediksi saya tidak dapat menunjukkan lompatan klien di masa lalu.

Saya dapat mengatasi masalah ini dengan tidak mengirimkan aksi lompatan sama sekali. Tetapi bagaimana jika permainan saya memiliki beberapa kekosongan di mana pemain bisa jatuh dan mati. Jadi, Jika saya tidak menyinkronkan aksi lompatan, pemain lain akan mengamati bahwa satu pemain sedang berlari maka ia jatuh batal dan sekali lagi muncul di layar menghancurkan pertunangan visual.

Lompat hanyalah sebuah contoh, mungkin ada banyak skenario di mana prediksi tidak dapat berfungsi. Jadi, Bagaimana cara menghadapinya. Salah satu contohnya bisa berupa game arena pertempuran Online Multi Pemain seperti Awesomenauts.


Saya tidak tahu banyak tentang Multiplayer, jadi saya tidak akan bisa memberikan jawaban yang tepat. Tetapi dari apa yang saya ambil, pengaturan yang ideal adalah bahwa klien Anda akan lebih atau kurang bodoh dan hanya mengirim keyboard, mouse, gamepad atau input apa pun ke server, dan server melakukan itu seluruh gerakan dan dunia memperbarui hal-hal dan mengirimkan posisi dan semua data relevan lainnya kembali ke klien, yang kemudian menampilkan hasilnya. Ini semua menghilangkan prediksi dan hal-hal serupa.
Christian

@ Kristen hei! Terima kasih balasannya. Saya tahu tentang pendekatan ini tetapi ini bisa membuat gameplay tersentak-sentak jika latencynya tinggi dan terlebih lagi saya menggunakan sistem real-time BaaS AppWarp, jadi semua logika saya hanya terletak di sisi klien.
Suyash Mohan

Menggabungkan kedua metode Anda adalah server otoritatif. Klien dan server mensimulasikan, klien mengirim input mereka, server mengirim kembali status otoritatif. Klien menyesuaikan negara mereka agar sesuai dengan negara yang berwenang. Jadi, ketika negara cocok, klien berjalan seperti mereka disimulasikan secara lokal (tanpa lag).
MichaelHouse

Saya baru-baru ini menemukan seri tutorial ini untuk memberikan tips yang baik dalam mengelola latensi, sepertinya akan sesuai dengan minat Anda: tautan
Kris Welsh

Jawaban:


8

Perhitungan mati mungkin bukan ide terbaik dalam kasus ini; Anda harus melakukan interpolasi entitas (memberikan secara efektif pemain lain di masa lalu, yang selalu memberi Anda posisi yang nyata dan valid). Saya telah menulis tentang ini dengan lebih detail di sini . Apakah melihat sedikit pemain di masa lalu dapat diterima atau tidak tergantung pada detail dari apa yang Anda coba lakukan.


4
Saya menggunakan pendekatan ini saat menulis game multiplayer jaringan pertama saya. Sebenarnya saya menggunakan @ ggambett sebagai referensi. Itu bekerja dengan baik untuk saya.
NoobsArePeople2

1

Ada tulisan yang cukup rinci tentang mesin sumber. Akan muncul beberapa kode sumber yang relevan juga tersedia sebagai bagian dari SDK Sumber.

https://developer.valvesoftware.com/wiki/Source_Multiplayer_Networking

Ini menggunakan sejumlah teknik untuk mencoba dan menangani latensi jaringan dalam model server-klien. Poin utama tampaknya adalah bahwa klien lokal menangani input dan acara lainnya secara lokal seolah-olah tidak ada server, dan kemudian berurusan dengan kemungkinan server mengatakan klien melakukan kesalahan nanti.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.