Fisika tidak disinkronkan dengan benar melalui jaringan saat menggunakan Bullet


11

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:

  1. 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
  2. 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.


Beberapa hal yang mungkin membantu Anda mendapatkan jawaban: Bahasa / mesin apa yang Anda gunakan? Jenis koneksi apa itu? Seberapa buruk defisit sinkronisasi, dibandingkan dengan ping ke server?
Fibericon

2
Opsi kedua tidak berfungsi karena Anda hanya mengatur kecepatan ke nilai server setelah beberapa frame sehingga di antara setiap paket ada beberapa frame di mana hal-hal dapat melayang. Saya akan merekomendasikan membaca semua posting Gaffer tentang fisika permainan, Anda mungkin harus terlebih dahulu membaca 'memperbaiki catatan waktu Anda' tetapi di sini adalah artikel terakhir yang berbicara tentang fisika jaringan gafferongames.com/game-physics/networked-physics
Roy T.

Saya menggunakan mesin yang dikembangkan sendiri di C ++. Namun saya cukup yakin defisit sinkronisasi tidak seburuk itu, mungkin 1 frame over ping jika saya harus menebak tetapi saya masih melakukan sebagian besar pengujian LAN saja. Saya akan memeriksa artikel-artikel itu dan ya Anda benar bahwa kecepatan dimatikan. Namun semuanya jauh , seperti peti di seberang peta. Tidakkah seharusnya secara eksplisit mengatur transformasi membuat sesuatu secara umum sesuai akhirnya? (Bahkan jika itu belum cantik, jiggles, dll.)
Lucas

Saya membaca posting Gaffer dan itu informatif tetapi tampaknya sebagian besar berurusan dengan pergerakan pemain, yang merupakan sesuatu yang sudah saya kerjakan. Saya telah membaca dan sepertinya kode metode 2 saya praktis identik dengan metode yang digunakan dalam mesin Unreal . Mereka tidak memberikan banyak detail tetapi itu membuat saya bertanya-tanya apakah idenya bagus tetapi penggunaan saya pada Bullet salah.
Lucas

Bacaan yang menarik, yang sebagian terkait dengan topik Anda: gamasutra.com/view/feature/3094/… . Ini tentang rts dan bukan tentang fisika, tetapi mereka sampai pada titik, di mana mereka harus menyinkronkan simulasi di server dan klien. Cara mereka melakukannya? Mereka menjalankan simulasi independen pada klien dan server, tetapi server mengirimkan paket yang memastikan, bahwa simulasi klien tidak menyimpang dan diperbaiki, jika itu terjadi ...
tom van green

Jawaban:


4

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:

  • Jalankan fisika di server dan klien;
  • Server mengirimkan pembaruan secara berkala;
  • Klien secara terus-menerus & dengan lancar menyesuaikan kembali dunia fisikanya dengan nilai server.

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?


Terima kasih! Ini membuat saya merasa lebih baik bahwa saya berada di jalur yang benar. Saya akan memeriksa kode saya dengan sisir gigi halus sekarang. Mungkin beberapa notifikasi tidak dipecat atau seperti yang Anda katakan saya kehilangan nilai karena metode 2 seharusnya (secara tidak sengaja) bekerja.
Lucas

3

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.


Terima kasih, ya itu salah satu cara untuk melakukannya. Namun itu tidak menghasilkan respons tabrakan yang bagus pada klien untuk hal-hal yang dilakukan klien dan juga hal-hal menarik tidak akan selalu berinteraksi dengan benar karena tidak dapat mendorong kembali pada hal-hal server (setidaknya dalam catatan waktu itu). Saya merasa seperti ini harus dimungkinkan karena mesin seperti Unreal dan Source tampaknya melakukannya.
Lucas

eye candy tidak perlu disinkronkan, itu bisa dihitung per klien. respons pada klien dihitung di server, koordinat untuk klien hanya dihitung dan dikirim kembali, Anda tidak mengirim panggilan balik ke klien mengatakan itu bertabrakan, yang mungkin akan tampak mengerikan.
tsturzl

2

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:-

  1. 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.

  2. Anda dapat memiliki satu dunia fisika di server dan menyiarkan posisi dan kecepatan objek ke klien.


Anda dapat mencoba memainkan beberapa permainan jaringan dengan fisika untuk melihat bahwa dunia tidak sinkron. mis. Need For Speed ​​World adalah gratis dan memiliki multiplayer dan fisika dasar. (kotak di jalan dan benda-benda yang bisa dirusak)
Max

Saya tidak yakin saya benar-benar mengikuti Anda. Saya cukup yakin ini dimungkinkan karena banyak permainan memungkinkan pemain untuk melempar peti (misalnya). Sepertinya pilihan Anda 2 mirip dengan opsi saya 2, tetapi saya tidak bisa membuat Bullet dengan bersih mengambil objek ke posisi server mereka. Mungkin itu masalah root saya?
Lucas

1
Tidak. Biasanya itu ilusi sinkron. Jika Anda membandingkan layar maka Anda akan melihat bahwa ketika Anda memantulkan kotak maka kotak terbang ke arah yang berbeda. atau kotak bukan fisika sama sekali (hanya animasi ed). Jumlah kotak berbeda. Ketika saya mengatakan animasi, maksud saya tidak ada animasi fisika di belakang gerakan. Mereka tidak melakukan berbagai trik untuk membuat gambar terlihat agak sinkron tetapi dunia fisika tidak sinkron. Anda harus melihat dan membandingkan bagaimana mereka bergerak di berbagai permainan.
Maks
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.