Logika game di server! Baik atau buruk?

25

Saat ini saya sedang merencanakan permainan multipemain daring yang sederhana. Dan inilah pertanyaannya. Apakah masuk akal untuk membuat logika seluruh permainan di server dan hanya mengirim input dari klien ke server? Yang merupakan pro dan kontra atau ada alasan mengapa saya tidak boleh melakukan itu?

Dominic Bartl
sumber

Jawaban:

37

Anda tidak ingin mengirim input pemain ke server. Apa yang Anda mungkin ingin lakukan adalah mengirim representasi abstrak tentang apa yang pemain ingin lakukan ke server, dan kemudian jalankan logika di sana.

Demikian juga Anda tidak perlu ingin mengirim kembali semua yang perlu dilakukan klien. Misalnya, Anda dapat mengirim semacam pesan yang mengatakan "NPC X meninggal", dan klien menentukan animasi / suara apa yang akan diputar. Hal-hal seperti itu.

Caranya adalah dengan menemukan garis di mana bandwidth dan kekuatan pemrosesan (pada server) dikalahkan dengan mencegah orang dari kecurangan. Biasanya Anda membuat segala jenis keputusan otoritatif yang mengubah game di server saja, dan menyerahkan semua hal visual pendukung kepada klien.

Ada banyak pertanyaan yang lebih spesifik tentang topik ini di seluruh situs. Sebagai contoh:

Haruskah deteksi tabrakan dilakukan di sisi server atau secara kooperatif antara klien / server?

Siapa yang menghitung AI dalam MMO?

Haruskah tuan rumah permainan menjadi otoritas, atau klien bodoh lainnya?

Tetrad
sumber
4
+1 Kalahkan saya untuk itu. Juga, tergantung pada gaya permainan, Anda mungkin ingin / perlu melakukan beberapa prediksi sisi klien.
John McDonald
14

Yah, Anda mendapat jawaban tetapi jawaban Anda yang sebenarnya adalah "coba sendiri". Hal-hal berbeda dari game ke game.

Saya melakukan beberapa permainan multiplayer untuk beberapa kursus desain game jaringan terdistribusi. Yang paling menantang adalah melakukan permainan aksi waktu nyata di mana banyak pemain terlibat dan mengirim masukan seperti neraka. Ketika sampai pada titik itu, semuanya menjadi masalah. Ketika Anda melihat tautan Tetrat pertama yang dikirim, bahkan menentukan kolusi menjadi masalah. Dan Anda akan membaca istilah-istilah seperti lag, interpolasi, ekstrapolasi, prediksi ... Tetapi jika Anda tidak pernah mencoba kode dari awal, Anda hanya akan menerima kata-kata ini dan tidak akan tahu apa artinya sebenarnya.

Rekomendasi saya adalah:

Langkah 1
Mulailah dengan desain berbasis server yang sepenuhnya disahkan untuk saat ini. Seperti yang Anda katakan, kirim saja input pengguna ke server dan biarkan server melakukan segalanya dan klien mendapatkan hasilnya. Game Anda akan bekerja sepenuhnya konsisten. Tetapi ketika Anda melihat klien Anda, Anda akan melihat beberapa kelambatan, beberapa masalah teleportasi, pergerakan tidak lancar ... dll.

Langkah 2
Mulai perbaiki masalah di sisi klien. Masalah teleportasi misalnya. Karakter Anda berada di (0,0) dan server mengatakan sekarang Anda berada di (100,100). Karakter Anda hanya akan teleport ke (100.100) yang tidak bagus. Ada interpolasi. Anda harus memiliki kode di sisi klien yang akan menggeser karakter dari (0,0) ke (100, 100) dengan mulus. Ya, Anda akan memindahkan karakter Anda dari (0,0) ke (100.100) tetapi seberapa cepat? Untuk saat ini Anda bisa menggunakan perbedaan waktu antara setiap pembaruan server. Jika server Anda mengirim 10 paket dalam satu detik yang berarti penundaan 100 ms antara setiap paket.

Langkah 3
Sekarang gim Anda sudah bagus untuk jaringan cepat di mana ada keterlambatan (1-50) ms. Tapi itu akan hancur jika ada paket yang hilang, latensi tinggi atau kalkulasi membutuhkan waktu lama di server ... dll. Dalam situasi itu Anda akan melihat ketika Anda menekan panah kiri, Anda akan melihat karakter Anda bergerak ke kiri dengan penundaan 200 ms. Penundaan antara paket Anda pergi ke server, waktu perhitungan dan kembali kepada Anda dengan posisi terakhir Anda. Ini buruk, kelemahan terburuk dari desain resmi server. Pemain ingin karakternya bergerak ke kiri begitu dia menekan ke kiri, Anda tidak bisa membuatnya menunggu. Untungnya klien juga memiliki kode yang sama dengan server, jadi mengapa tidak segera jalankan di klien dan perbaiki hasil akhir dengan jawaban dari server? Itulah dasar prediksi input. Klien menekan kiri, kode di sisinya akan memindahkannya ke kiri, setelah beberapa waktu katakanlah 200 ms, posisi sebenarnya berasal dari server dan klien memperbaiki posisinya dengan itu. Jika semuanya berjalan dengan baik, klien tidak akan melihat apa pun, "langkah 2" juga akan membantu kami dalam hal ini.

Nah, net memiliki banyak tutorial dan hal-hal tentang hal ini. Tapi ada 2 yang sangat saya sukai:

Sangat bagus, mencakup bintik-bintik gelap: Jaringan Multiplayer Engine-Source Engine
Jenis sejarah, menyenangkan untuk dibaca dan layak: 1500 Pemanah di 28,8 ,

tesla
sumber
3

Pro:

  • pendekatan ini lebih merupakan bukti pembajakan
  • Anda dapat menerapkan pembaruan dengan lebih mudah
  • komunitas terpusat

Cons:

  • persyaratan bandwidth besar
  • beberapa pengguna dapat membenci pendekatan itu (privasi dan hal-hal lain)
  • masalah dengan gameplay lokal (pihak LAN), singleplayer
neciu
sumber
Masalah dengan gameplay LAN dapat dihindari dengan menyediakan biner server khusus atau memungkinkan salah satu klien untuk bertindak sebagai server. Solusi yang memperbaiki masalah pemain tunggal dan LAN adalah dengan meng-host server secara transparan di komputer klien (jika itu hanya permainan pemain tunggal, seharusnya tidak ada perbedaan yang signifikan dalam daya komputasi antara pendekatan ini dan biner tradisional). Ini mungkin tidak bekerja untuk semua jenis game
3Doubloons
2

Logika sisi server juga menciptakan masalah skalabilitas - Anda harus melakukan semua pekerjaan untuk semua klien di server Anda - ayat memungkinkan setiap klien melakukan bagiannya sendiri dari total pekerjaan.

ddyer
sumber
Lucu ketika saya mengajukan pertanyaan serupa di sini pada tahun 2016, semua orang hanya mengatakan kepada saya "jangan pernah mempercayai klien".
newguy
Itu tergantung pada permainan, tetapi klien menipu diri mereka sendiri bukan masalah serius, dan klien menipu terhadap klien lain, jujur,; apa pun yang mungkin dilakukan server untuk tidak mempercayai klien, klien yang jujur ​​dapat melakukannya.
ddyer
2

Tergantung pada game apa yang ingin Anda buat dan bagian mana dari game tersebut. Jika mengembangkan RTS (atau game apa pun dengan model penguncian), maka Anda hanya boleh mengirim input dan langkah simulasi mana yang diterima.

Jika Anda ingin melakukan shooter, Anda bisa menggunakan fungsi input dan abstrak. Jika Anda menggunakan Unreal Tournament 3 sebagai kasusnya, mereka menciptakan multipemain terutama melalui panggilan fungsi yang direplikasi.
Untuk gerakan mereka mengambil input pemain (dikompresi menjadi bit tunggal untuk setiap aksi) delta rotasi, akselerasi & cap waktu dan mengirimkannya ke server.
Untuk keperluan lain seperti senjata yang disinkronkan ketika Anda menembak (AFAIK, belum melihat bagian ini secara mendalam).
Untuk nilai yang lebih statis / kurang sering berubah seperti kesehatan mereka mengirim variabel ke klien atau server tergantung pada apa yang ditentukan programmer.

Dan untuk game non-RTS, ingat prediksi klien.

Peter Ølsted
sumber