Arsitektur game peer-to-peer terbaik

10

Pertimbangkan pengaturan tempat klien game:

  1. memiliki sumber daya komputasi yang cukup kecil (perangkat seluler, smartphone)
  2. semuanya terhubung ke router umum (LAN, hotspot dll)

Pengguna ingin memainkan game multi-pemain, tanpa server eksternal.

Salah satu solusinya adalah meng-host server otoritatif pada satu ponsel, yang dalam hal ini juga merupakan klien. Mengingat poin 1 solusi ini tidak dapat diterima, karena sumber daya komputasi telepon tidak memadai.

Jadi, saya ingin merancang arsitektur peer-to-peer yang akan mendistribusikan beban simulasi game di antara klien. Karena poin 2 sistem tidak perlu menjadi kompleks berkaitan dengan optimasi; latensi akan sangat rendah. Setiap klien dapat menjadi sumber data otoritatif tentang dirinya dan lingkungan terdekatnya (misalnya peluru.)

Apa yang akan menjadi pendekatan terbaik untuk merancang arsitektur seperti itu? Adakah contoh yang diketahui dari protokol peer-to-peer tingkat LAN?

Catatan:

Beberapa masalah dibahas di sini , tetapi konsep yang tercantum di sana terlalu tinggi bagi saya.

Keamanan

Saya tahu bahwa tidak memiliki satu server otoritatif adalah masalah keamanan, tetapi tidak relevan dalam kasus ini karena saya bersedia mempercayai klien.

Edit:

Saya lupa menyebutkan: itu akan menjadi permainan yang agak cepat (penembak).

Juga, saya sudah membaca tentang arsitektur jaringan di Gaffer on Games .

Dawid
sumber

Jawaban:

10

Lihatlah artikel ini tentang arsitektur jaringan Age of Empires II.

Mereka berhasil membuat game multipemain yang berjalan hebat di Pentium 90 dengan 16 MB RAM dan koneksi modem 28,8 kB / s. Mereka melakukan ini dengan meminta setiap pemain menjalankan simulasi mereka sendiri, tetapi menyinkronkan perintah mereka.

Mereka punya beberapa trik pintar di sana, saya sangat merekomendasikannya.

knight666
sumber
5

Saya telah melakukan ini untuk game balap PSP komersial, yang bekerja baik melalui jaringan ad hoc, dan melalui hotspot nirkabel. (Atau ke server statis di Internet, jika diinginkan)

Karena poin 2 sistem tidak perlu menjadi kompleks berkaitan dengan optimasi

Dalam pengalaman saya, ini tidak benar. Perangkat nirkabel (terutama yang portabel kecil) tidak seperti komputer dengan koneksi jaringan kabel - smartphone dan konsol game nirkabel cenderung memiliki antarmuka jaringan yang lambat untuk tujuan permainan.

Jangan salah paham - throughput mereka biasanya baik (yaitu, jumlah data per detik; bagus untuk streaming film atau lain-lain), tetapi latensi pengiriman paket tertentu bisa sangat buruk, dan bisa jadi sangat bervariasi sehingga sulit untuk memperkirakan berapa lama setiap paket akan dikirimkan. Variasi ini menjadi lebih buruk karena lebih banyak perangkat nirkabel yang dikemas bersama dalam satu area umum, karena sinyalnya mulai saling mengganggu. Sebagai akibatnya, cukup banyak waktu saya dihabiskan untuk mengurangi jumlah paket yang perlu dikirim, jadi kami akan memiliki lebih sedikit tabrakan paket. (Perhatikan bahwa ini agak kurang masalah dalam kasus hotspot jaringan bertenaga yang terlibat, daripada meminta perangkat berbicara satu sama lain secara langsung melalui jaringan ad hoc)

Sebagai contoh optimasi semacam ini, game balap kami berlangsung di dunia yang memiliki lampu lalu lintas. Ribuan dari mereka. Dan kami perlu memastikan bahwa sinyal mereka selaras antara semua pemain dalam sesi jaringan. Alih-alih mencoba mengirim paket untuk memberi tahu semua orang yang lampu berada dalam keadaan apa, kami menetapkan jadwal statis untuk semua lampu lalu lintas, dan kemudian hanya memastikan bahwa semua klien menyetujui "waktu permainan" saat ini. Karena mereka semua tahu waktu permainan, dan semua status lampu lalu lintas dapat ditentukan dari waktu permainan, kami menyinkronkan semua data keadaan itu tanpa benar-benar mengirim data khusus apa pun. Perubahan ini membuat perbedaan besar untuk kinerja jaringan kami.

Apa yang dikatakannya, membangun sinkronisasi jam yang andal antara beberapa perangkat nirkabel (dengan waktu ping yang sangat bervariasi karena hilangnya paket) merupakan tantangan besar. Senang berbicara lebih banyak tentang itu jika Anda tertarik.

Setiap klien dapat menjadi sumber data otoritatif tentang dirinya dan lingkungan terdekatnya (misalnya peluru.)

Inilah yang kami lakukan, dan itu bekerja dengan baik untuk kami dalam situasi kami (mobil). Bagian yang bermasalah, tentu saja, adalah ketika sebuah objek berhenti menjadi lebih dekat dengan pemain 'a' daripada pemain 'b', dan kepemilikannya kemudian ditransfer dari satu pemain ke pemain lainnya.

Ini sebenarnya negosiasi yang sangat kompleks antara pemain, di mana permainan 'a' mengusulkan ke permainan 'b': "Saya pikir objek ini lebih dekat dengan Anda. Anda harus mengendalikannya." Dan kemudian permainan 'b' dapat menerima, atau mungkin menolak, berdasarkan pada pandangannya sendiri tentang situasi. Perbedaan dalam kondisi permainan yang dirasakan antara 'a' dan 'b', dan perubahan waktu antara saat permintaan dan respons dikirim dan diterima membuat ini merupakan negosiasi kecil yang tidak menyenangkan untuk menjadi andal, dan dapat dengan mudah berubah menjadi permainan "kentang panas", dengan kepemilikan benda memantul terus-menerus di antara banyak pemain. Dan bahkan ketika itu berfungsi dengan baik, jika dilihat dari sudut pandang permainan 'c', ada '

Intuisi saya adalah bahwa pendekatan "kepemilikan benda" semacam ini mungkin terlalu rumit untuk benda kecil yang berumur pendek seperti peluru. Kami menggunakannya untuk mobil lalu lintas dan pembalap AI, yang cenderung tinggal dalam simulasi untuk waktu yang relatif lama. Sepertinya pendekatan yang lebih berkinerja, jika Anda mau mempercayai klien, akan memiliki permainan masing-masing pemain memiliki posisi mereka dan proyektil mereka, dan menyatakan kapan pemain itu telah terkena oleh proyektil orang lain. (Jadi sebagai "game A", saya bertanggung jawab untuk mengatakan di mana proyektil pemain A dan pemain A berada, tetapi pemain B bertanggung jawab untuk mengatakan apakah saya telah menekan pemain B). Dengan beberapa perhitungan mati yang baik, Anda harus bisa mendapatkan perilaku yang cukup masuk akal dari sistem seperti ini.

Trevor Powell
sumber
1

Saya sarankan Anda menggunakan arsitektur step step to peer.

Anda mulai dengan menghitung frame game Anda setelah game dimulai. Satu klien merender frame 1 lalu mengirim pesan siap ke klien lain dan menunggu untuk menerima pesan siap dari klien lain.

Sekarang semua klien bisa menggunakan frame ke-2. Render bingkai, kirim dan terima perintah, perbarui dunia, perbarui fisika dan ... setelah itu saling mengirim pesan.

Solusi ini sangat baik untuk permainan LAN dan semua klien Anda akan disinkronkan.

dengan jenis jaringan ini, Anda dapat memastikan semua klien Anda sinkron sehingga Anda dapat menguji cara terbaik yang sesuai dengan kebutuhan Anda.

Cara pertama hanya mengirim input ke orang lain dan setiap klien mensimulasikan berjalan, menembak, mendeteksi tabrakan, dll. Cara kedua adalah setiap klien mengirim informasi tentang karakternya kepada orang lain seperti posisi, rotasi, keadaan, bingkai animasi dan lain-lain sehingga klien lain hanya menghitung barang-barang mereka dan mengirimkannya melalui jaringan tetapi cara pertama lebih aman.

kochol
sumber
1
Jawaban ini tampaknya tentang lingkaran permainan. Saya pikir OP bertanya tentang sistem distribusi beban; khususnya, siapa yang mensimulasikan apa dan bagaimana klien berkomunikasi. Bisakah Anda menjelaskan lebih detail? Saya tertarik dengan masalah ini juga.
Wackidev
@Wideidev dengan jenis jaringan ini, Anda dapat memastikan semua klien Anda sinkron sehingga Anda dapat menguji cara terbaik yang sesuai dengan kebutuhan Anda. Cara pertama hanya mengirim input ke orang lain dan setiap klien mensimulasikan berjalan, menembak, mendeteksi tabrakan, dll. Cara kedua adalah setiap klien mengirim informasi tentang karakternya kepada orang lain seperti posisi, rotasi, keadaan, bingkai animasi dan lain-lain sehingga klien lain hanya menghitung barang-barang mereka dan mengirimkannya melalui jaringan tetapi cara pertama lebih aman.
kochol
Jadi tolong masukkan itu dalam jawaban Anda. Saat ini saya tidak berpikir itu menjawab pertanyaan. Juga, harap hapus komentar duplikat pertama. Terima kasih. Mengenai ide itu sendiri, bukankah opsi pertama yang Anda daftarkan memerlukan simulasi untuk menjadi deterministik?
Wackidev