Bagaimana saya bisa membuat game multiplayer peer-to-peer? [Tutup]

37

Bagaimana saya bisa membuat game multiplayer p2p? Saya ingin memiliki game multiplayer tanpa server. Namun, bagaimana semua klien saling kenal?

Mengapa p2p-protocol sangat terkenal dalam transfer file tetapi tidak dalam game multi-pemain?

Tuomas Hietanen
sumber
Apa yang bisa sangat menarik dalam permainan P2P, adalah mengelola untuk membuat netcode yang sesuai dengan MMO, untuk memungkinkan aspek sosial yang lebih baik: server hanya diperlukan untuk kota dan pesta dengan lebih dari 5 pemain. Saya tidak tahu apa yang layak dan apa yang tidak, tetapi saat ini adalah satu-satunya hal yang lebih menarik dari grafik fotorealistik ...
jokoon
Tapi p2p IS cukup populer di game multi-pemain! Siapa bilang bukan? Bahkan beberapa MMO besar menggunakan p2p
Adam Harte

Jawaban:

34

Game peer to peer umumnya masih memiliki host game. Ini adalah host permainan yang memposting game ke daftar master game dan menerima koneksi baru. Setiap kali tuan rumah permainan menerima klien baru ke permainan, ia memberi tahu semua klien yang ada tentang klien baru sehingga mereka dapat memastikan mereka terhubung ke klien baru.

Cara paling sederhana untuk mengimplementasikan p2p adalah dengan lobi. Semua klien terhubung ke tuan rumah di lobi (atau ruang obrolan). Ketika tuan rumah siap pemain menekan mulai dan mereka semua memasuki permainan pada saat yang sama (biasanya digunakan dalam permainan strategi). Pendekatan yang lebih kompleks adalah dengan menggunakan "drop-in drop-out" di mana pemain dapat bergabung dan meninggalkan mid game, namun ini jauh lebih kompleks untuk diimplementasikan dalam game p2p dan memerlukan fitur yang disebut migrasi host.

Sejumlah besar permainan menggunakan jaringan peer to peer, termasuk sebagian besar strategi, olahraga, dan gelar mengemudi. Hampir semua game Xbox360 dan PS3 menggunakan jaringan p2p. Arsitektur client-server sebagian besar digunakan dalam first person shooter atau game MMO.

Client-Server umumnya lebih mudah diimplementasikan karena hanya 1 mesin yang belum mengetahui seluruh kondisi permainan, klien pada dasarnya hanya penyaji dengan beberapa prediksi untuk membuat segalanya terlihat mulus.

Saat Anda membangun mesin p2p, semua klien membutuhkan keadaan penuh dari dunia game dan mereka semua diharuskan untuk tetap sinkron.

Untuk detail lebih lanjut tentang p2p dan arsitektur client-server, saya sarankan Anda membaca artikel berikut: Apa yang Perlu Diketahui Setiap Programmer Tentang Game Networking .

Dan jika Anda baru mengenal jejaring secara umum, cek artikel hebat lainnya di situs itu. Glenn adalah seorang jenius jaringan.

lloydw
sumber
13

Ada banyak alasan p2p tidak populer di game, sebagian besar karena lag. Setiap orang selambat pemain paling lambat. Kami tidak berbicara tentang bandwidth di sini, tetapi waktu ping.

p2p dapat mentransfer banyak data, tetapi melakukannya dengan ping yang cukup tinggi, gim harus mengirimkan data yang sangat kecil, dengan waktu ping yang minimal.

Nate
sumber
13

Ada beberapa aspek menarik tentang sistem peer-to-peer dan game aksi. Saya mencoba mempostingnya sebagai komentar di blog Glenn Fiedler, tetapi ternyata dia tidak suka terbukti salah dan malah menarik seluruh artikel. Ada di Internet Archive, kalau-kalau Anda ingin membacanya.

Dia tidak membiarkan komentarnya online, jadi saya akan kutip di sini:

Saran Peer-to-Peer dari posting pertama sebenarnya merupakan titik awal yang menarik, meskipun kadang-kadang agak naif: Kemungkinan pertama adalah menggabungkan sistem dengan model klien / server standar dengan prediksi seperti yang diuraikan dalam posting Anda tentang jaringan game. Ping P2P yang lebih rendah akan secara dramatis mengurangi jeda prediksi antar pemain tergantung pada lokasinya: Efeknya mungkin tidak akan terlihat bagi sebagian besar gamer AS, tetapi di sini di Eropa ping yang berisi 200+ normal di sebagian besar server dan koneksi langsung akan mengurangi prediksi lag ke server Eropa.

Pendekatan P2P sejati tanpa server sedikit lebih kompleks: Perhatian utama dengan jaringan desentralisasi adalah memastikan konsistensi, terutama jika simulasi dapat mengalami efek kupu-kupu karena waktu perintah yang sedikit berbeda yang dikirim melalui jaringan atau masalah floating point. Ini dimungkinkan dengan membangun jaringan setiap objek (pemain, NPC, ...) setidaknya secara berkala. Bahkan tidak perlu melakukannya untuk semua objek sekaligus, dan setiap klien dapat memiliki objek tertentu. Jaringan cukup banyak objek dalam waktu tertentu harus meredam perbedaan yang membangun antara setiap sinkronisasi suatu objek cukup untuk menjadi tidak relevan bahkan untuk interval sinkronisasi satu detik atau lebih.

Masalah kedua dengan sistem P2P adalah keamanan, tetapi itu dapat diselesaikan dengan perbaikan yang relatif kecil dalam kasus ini: Klien dapat menggunakan simulasi fisika mereka untuk mengumpulkan informasi tentang tingkat kesalahan pada setiap objek fisika. Fisika yang dimanipulasi selalu menghasilkan kesalahan yang lebih besar, sehingga klien hanya akan "memilih" untuk memutuskan sambungan dari rekannya yang mengendalikan objek yang mencurigakan. Selain itu, pesan kontrol untuk objek non-fisika diteruskan antara klien berdasarkan kepentingannya: Pembaruan pemain dapat diteruskan secara acak, pembaruan penting dan jarang harus selalu dikirim, tetapi masih ke pemain acak. Dengan cara ini seorang pemain harus mengendalikan sebagian besar klien yang terhubung untuk dapat menipu dengan cara apa pun yang terlihat.

[...]

Anda dapat menemukan utas yang saya referensikan di http://www.devmaster.net/forums/showthread.php?t=14640 .

Saya pikir seseorang menyebutkan masalah firewall peer-to-peer ada di salah satu utas dari artikel. Solusi yang memungkinkan adalah NAT-Punchthrough:
- Tinjauan umum NAT Punchthrough
- Komunikasi Peer-to-Peer di Seluruh Jaringan Alamat Penerjemah

Tidak ada tingkat keberhasilan 100%, jadi Anda harus memberitahu para pemain untuk tetap membuka port.

Tamschi
sumber
+1 untuk satu-satunya orang yang menjawab pertanyaan, terima kasih untuk itu. Satu pertanyaan: Anda menyebutkan perbedaan efek kupu-kupu di negara bagian menggelinding di luar kendali (saya telah melihat ini terjadi di beberapa game Interplay yang ditulis dengan buruk). Apa yang harus kita lakukan ketika kita menemukan keadaan berbeda antara mesin? Mengambil Starcraft sebagai contoh, bagaimana jika komputer saya percaya satu unit mati, tetapi komputer lawan saya percaya unit lain mati? Bagaimana kita memutuskan kata siapa yang akan diambil?
BlueRaja - Danny Pflughoeft
@BlueRaja Starcraft sebenarnya bukan contoh yang baik untuk ini, karena mesinnya 100% deterministik. Anda hanya perlu secara andal mengirimkan perintah pemain dengan stempel waktu dan komputer yang berbagi program yang sama akan selalu menyetujui kondisi saat ini. Cara yang baik untuk mengurangi perbedaan adalah dengan mencatat waktu masing-masing dan setiap pembaruan keadaan dengan gametime (fisika-frame atau centang) dan untuk men-cache beberapa frame ini pada mesin penerima. (Kebanyakan game FPS untuk ini, contohnya adalah CS: S dan TF2.) Juga, jangan gunakan angka floating point untuk hal-hal penting, karena implementasinya mungkin berbeda.
Tamschi
Jika sebuah mesin 100% deterministik (Ada perpustakaan fisika yang menjamin hal ini.) Dan menggunakan frame-caching untuk menyinkronkan keadaan di seluruh komputer, efek kupu-kupu menjadi 0. (Selama Anda dapat menjamin koneksi yang andal.) Tambahan keuntungannya adalah Anda relatif dapat dengan mudah mengidentifikasi klien curang, karena satu-satunya cara untuk mendapatkan hasil yang berbeda adalah dengan memiliki kode yang berbeda. Perhatikan bahwa ini mungkin tidak dapat dilakukan untuk setiap aspek permainan, tergantung pada kinerja jaringan; Puing-puing sering tidak disinkronkan karena alasan ini. Game serba cepat seringkali tidak dapat menyinkronkan semuanya.
Tamschi
Karena posting blog sejak itu menghilang dari cache Google, ini dia di Internet Archive: web.archive.org/web/20091120214817/http://gafferongames.com/…
fernozzle
9

Sebuah contoh yang baik dari gameplay 'peer-to-peer sejati' akan menjadi gim strategi waktu-nyata seperti Starcraft.

Dalam permainan dengan ratusan unit / proyektil bergerak, tidak praktis untuk berulang kali mengirim posisi unit / status melalui jaringan ke semua pemain lain, jadi satu solusi di sini adalah semua pemain menjalankan simulasi (persis sama) dalam sinkronisasi.

Ketika satu pemain melakukan aksi, perintah / perintah ('pindahkan zergling ke X, Y') dapat dikirim ke semua pemain lain, untuk dieksekusi oleh semua contoh simulasi, sepersekian detik kemudian.

Dalam situasi ini, jika ada pemain yang terputus, permainan dapat berlanjut - karena tidak perlu server / host menjalankan permainan, pemain yang tersisa dapat melanjutkan.

Namun, menjaga permainan dalam sinkronisasi tidak sepele, Anda harus menggunakan tanda waktu tetap untuk pembaruan logika game, dan harus sangat berhati-hati dengan penggunaan dan penyemaian generator angka acak, untuk memastikan bahwa simulasi tidak akan berbeda!

bluescrn
sumber
5

Akan sedikit tidak jujur ​​untuk mengklaim bahwa itu tidak terkenal untuk permainan ketika kebanyakan game Strategi Waktu Nyata (seri Star Craft, Seri Command and Conquer) dan banyak game FPS (Call of Duty: Modern Warfare 2) menggunakannya.

Yang mengatakan bagaimana seseorang belajar tentang permainan adalah hingga layanan perjodohan / lobi yang Anda gunakan atau buat. Tetapi bahkan sekali orang belajar tentang permainan, masih mungkin ada satu atau lebih teman yang lebih setara dari yang lain. Pertimbangkan kasus 3 klien yang ingin bermain, satu di belakang nat terbuka, 2 di belakang ketat (Tertutup) nats. Open nat peer dapat mengambil koneksi dari dua lainnya. Tetapi 2 ketat tidak dapat terhubung langsung satu sama lain, mereka akan memerlukan nat terbuka untuk menyampaikan paket. Jika nat peer terbuka turun dari gim, maka estafet lain perlu ditemukan atau gim tersebut akan terganggu.

Doug-W
sumber
2

Anda mungkin juga ingin memeriksa Badumna (www.badumna.com) yang mengklaim sebagai solusi jaringan peer-to-peer untuk game online. Tampaknya melakukan sinkronisasi keadaan permainan secara terdistribusi dan menurut situs web mereka ada versi Flash yang akan datang.

John
sumber
1

Anda mungkin ingin menjalankan dengan satu pemain (Kami akan memanggilnya "Tuan Rumah") sebagai server yang tidak resmi. Anda akan membuat semua pemain lain mengomunikasikan apa yang mereka lakukan di ujung mereka dengan tuan rumah kami, dan tuan rumah akan menyampaikan pesan ke pemain lain.

Anda mungkin juga ingin memberikan daftar komputer yang terhubung ke pemain hosting sehingga jika mereka menjatuhkan host baru dapat dipilih dan mulai berkomunikasi dengan pemain yang tersisa.

Dokumentasi untuk smartfoxserver dapat membantu Anda dan / atau akhirnya Anda ingin menggunakannya untuk game Anda. Anda baru saja menanamkannya ke dalam permainan klien Anda alih-alih memiliki program klien dan server yang terpisah.

lathomas64
sumber
1
Ini kelihatannya kurang dari pengaturan P2P dan lebih dari server / klien dadakan.
deft_code
@caspin Ini adalah yang paling jika tidak semua game p2p dijalankan. Satu pemain ditunjuk sebagai tuan rumah, dan sisanya terhubung dengannya.
AttackingHobo
2
@ Hobo: itu bukan p2p, itu adalah klien / server, tidak peduli bagaimana Anda menyebutnya.
o0 '.
1

Saya sedikit tertarik dengan masalah ini. Anda mengatakan ada banyak masalah dengan membuat game p2p alih-alih model client-server klasik. Tapi saya cukup yakin bahwa P2P adalah seperti client-server tetapi setiap rekan memiliki kesempatan untuk menjadi server. Tentang LAG jika Anda menambahkan satu mesin lagi sebagai server, ada lebih banyak peluang yang jauh dari klien, tetapi menggunakan p2p tidak ada mesin tambahan di lobi, Anda dapat mengelola tes latensi dan membuat grup dengan ping minimal. Tentang menghasilkan lalu lintas, karena saya telah belajar Anda harus meminta klien untuk mengirimkan lebih sedikit daripada yang saya maksud klien harus mencari semua klien lain yang mau berarti.


sumber
gta4 pada xbox 360 p2p jadi mungkin dan hampir tidak ada lag
-1

Jika Anda membuat mmorpg yang tampak sederhana dengan persyaratan sistem yang rendah, saya sarankan untuk membuat program internal yang menciptakan "frekuensi" berdasarkan pada isi folder gim dan apa isi file-file tersebut. Ini akan membuat orang dengan "frekuensi" yang sama bermain di saluran yang sama. Klien yang dimodifikasi, dimanipulasi, atau normal akan dipisahkan. Ini hanya akan berfungsi untuk peretasan atau mod asli, tapi saya yakin ini mencakup semua curang "bodoh". Dikombinasikan dengan metode pengecekan kesalahan yang disebutkan oleh satu orang berarti sedikit atau tidak perlu moderasi. Sejauh port pergi, hanya perlu menutup port 52225 dengan proses latar belakang yang tetap terhubung pada router tanpa memicu-port.

Devin Foret
sumber