Saya mencoba menerapkan sistem fisika klien / server menggunakan Bullet namun saya mengalami masalah dalam hal sinkronisasi.
Saya telah menerapkan status gerakan khusus yang membaca dan menulis transformasi dari objek game saya dan berfungsi secara lokal, tetapi saya telah mencoba dua pendekatan berbeda untuk game jaringan:
- Objek dinamis pada klien yang juga ada di server (mis. Bukan puing acak dan barang tidak penting lainnya) dibuat kinematik. Ini berfungsi dengan baik tetapi objek tidak bergerak dengan sangat lancar
- Objek dinamis pada keduanya tetapi setelah setiap pesan dari server bahwa objek telah bergerak saya mengatur kecepatan linier dan sudut ke nilai-nilai dari server dan memanggil btRigidBody :: continueToTransform dengan transform pada server. Saya juga memanggil btCollisionObject :: activ (true); untuk memaksa objek memperbarui.
Maksud saya dengan metode 2 adalah pada dasarnya melakukan metode 1 tetapi membajak Bullet untuk melakukan prediksi orang miskin alih-alih melakukan sendiri untuk memuluskan metode 1, tetapi ini tampaknya tidak berhasil (karena alasan yang tidak 100% jelas untuk saya bahkan melangkah melalui Bullet) dan benda-benda terkadang berakhir di tempat yang berbeda.
Apakah saya menuju ke arah yang benar? Bullet tampaknya memiliki kode interpolasi sendiri bawaan. Bisakah itu membantu saya membuat metode 1 bekerja lebih baik? Atau kode 2 metode saya tidak berfungsi karena saya sengaja menginjaknya?
EDIT: Masalah lain dengan metode 1 yang baru saya perhatikan adalah bahwa respons tabrakan akan jauh untuk tabrakan terhadap objek yang tidak disinkronkan. Tubuh kinetik semacam menembak barang hingga tak terbatas kadang-kadang karena mereka tidak dapat dilumpuhkan kembali.
Jawaban:
Anda membutuhkan prediksi sisi klien yang tepat .
Anda harus benar-benar membaca secara detail tautan yang diberikan Roy T. dalam komentarnya . Ini menjelaskan apa yang harus dilakukan dengan input pemain & fisika karakter, tetapi prinsipnya tetap sama untuk "fisika berbasis server".
Ini bukan hal sepele untuk diterapkan tetapi dalam beberapa kata, untuk objek game yang perlu disinkronkan:
Jadi ya, Anda sedang menuju ke arah yang benar dengan metode Anda 2. Hanya mengesampingkan nilainya tidak cukup, Anda akan mendapatkan lompatan pada klien, apa yang perlu Anda lakukan adalah lancar & terus-menerus diinterpolasi ke nilai server.
Untuk bug Anda yang sebenarnya, saya tidak terbiasa dengan Bullet, tetapi Anda mungkin kehilangan beberapa nilai misalnya Anda telah mengatur kecepatan linier dan sudut, tetapi apakah Anda sudah mengatur akselerasi?
sumber
Apa yang saya lakukan secara pribadi adalah siapa pun yang menjadi tuan rumah permainan menciptakan dunia phsyics dan menyinkronkan objek dengan klien. Bahkan jika itu skema jaringan P2P saya masih mendasarkan mesin fisika pada salah satu klien pemain.
Fisika lain yang saya gunakan yang murni eye candy bahkan tidak perlu disinkronkan.
Dalam prototipe yang saya buat beberapa waktu lalu yang disebut "boilerzerker", saya menjalankan fisika pada host dan efek partikel (juga menggunakan fisika) tidak disinkronkan di jaringan tetapi independen untuk setiap klien karena mereka eye candy.
sumber
Tidak mungkin untuk mengimplementasikan dunia fisika jaringan sinkron. Perbedaan kecil di langkah N tentu saja perbedaan yang jauh lebih besar di langkah N + 1 Anda tidak bisa menerapkan kekuatan atau impuls untuk tetap menyelaraskan dan terlihat realistis.
Solusi:-
Anda dapat mempertimbangkan untuk menyinkronkan hanya beberapa objek seperti karakter atau mobil balap terutama jika mereka kinematik. Tetapi sebagian besar dunia tidak akan sinkron untuk terlihat realistis.
Anda dapat memiliki satu dunia fisika di server dan menyiarkan posisi dan kecepatan objek ke klien.
sumber