Kiat untuk berkomunikasi antara game browser JS dan server node.js? [Tutup]


7

Saya bermain-main dengan beberapa game gua selebaran kanvas sederhana dan saya ingin membuatnya multiplayer akhirnya. Rencananya adalah menggunakan Node.js di sisi server.

Data yang dikirim akan terdiri dari posisi masing-masing pemain, arah, kecepatan dan semacamnya. Gerakan pemain adalah fisika gaya sederhana, jadi saya harus bisa memperkirakan gerakan sebelum pembaruan berikutnya dari server.

Adakah kiat atau praktik terbaik di sisi komunikasi? Saya kira soket web adalah caranya. Haruskah saya mengirim informasi di setiap lintasan loop game atau dengan interval yang ditentukan? Juga, saya tidak keberatan jika itu tidak bekerja dengan browser lama.

Jawaban:


10

Baru-baru ini saya membuat crossover asteroid / geometri dengan Node.js / JavaScript:
http://github.com/BonsaiDen/NodeGame-Shooter

Ini memiliki Server gemuk yang memproses permainan dan klien tipis yang pada dasarnya hanya dilihat. Klien melakukan interpolasi dan beberapa hal agar terlihat mulus.

Anda mungkin ingin melihat dua file ini, yang berisi logika jaringan yang mendasarinya, serta model aktor dan klien:
http://github.com/BonsaiDen/NodeGame-Shooter/blob/master/client/nodegame.client. js
http://github.com/BonsaiDen/NodeGame-Shooter/blob/master/server/nodegame.js

Seluruh permainan didasarkan pada Aktor yang menangani "pembaruan acara" mereka (barang-barang yang dikirim ke klien) sendiri, sebagian besar. Dimungkinkan juga untuk menyembunyikan aktor dari klien tertentu untuk menerapkan, misalnya, tembus pandang.

Satu juga dapat merekam game dan hanya memberi makan pesan ke klien untuk memutarnya.

Sejauh teknologi berjalan:
WebSockets adalah cara untuk pergi ke sini. Saya juga melakukan penyandian biner khusus untuk JS yang, sambil menyerah pada hal-hal seperti lebih dari 2 tempat desimal di pelampung, sekitar 50% lebih kecil dari JSON (dan 2x lebih cepat di bawah V8 daripada penyandian JSON asli )


Terima kasih! NodeGame Shooter itu terlihat cukup menarik, saya harus meluangkan waktu dengan kodenya.
Petteri Hietavirta

8

Saya sarankan untuk memisahkan hal-hal.

Dalam Stendhal yang merupakan MORPG 2D yang ditulis dalam Java, kami melakukan hal-hal berikut dan berhasil dengan baik:

  • Klien menggunakan loop cepat untuk menggambar. Itu animasi yang halus dan beberapa prediksi untuk meminimalkan lag.
  • Server menggunakan loop untuk memproses semua logika game. Dalam kasus kami, ini bisa menjadi jauh lebih lambat daripada loop gambar. Sementara klien membuat beberapa prediksi, server selalu menang.

Komunikasi antara klien dan server dilakukan dengan menggunakan tindakan dan persepsi:

  • Tindakan yang dilakukan oleh pengguna seperti "pindah" dikirim ke server ketika terjadi. Server mengantri dan memprosesnya dalam loopnya sendiri.
  • Persepsi dikirim dari server ke klien untuk memperbarui pandangan mereka tentang dunia.

Kami melakukan beberapa "trik" untuk mendapatkan kinerja tambahan:

  • Kami memiliki dua jenis pesan persepsi: Yang penuh digunakan saat masuk dan pemain bergabung dengan zona. Dan pembaruan tambahan digunakan setelah itu. Ini menghemat banyak bandwidth jaringan.
  • Kami membagi pesan persepsi menjadi bagian publik dan pribadi: Semua pemain di zona yang sama berbagi bagian publik yang sama sehingga kami menghemat waktu pemrosesan karena serialisasi ternyata menjadi leher botol di Jawa (bukan JavaScript).

Ah ha! Antri tindakan untuk loop daripada memprosesnya pada waktu panggilan, hanya apa yang saya butuhkan!
MetaGuru

3

Gunakan socket.io , ini adalah perpustakaan abstraksi WebSockets yang berguna yang menyediakan cadangan untuk browser yang tidak mendukungnya.

Juga, jika Anda menggunakan model online seperti itu, saya akan merekomendasikan untuk memindahkan pemrosesan game ke server. Dengan begitu Anda hanya perlu mengkomunikasikan perubahan grafis dan input mouse / keyboard. Ini juga membantu sedikit untuk mencegah kecurangan.

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.