Bagaimana cara membuat server game sederhana untuk game multi-pemain?

9

Saya ingin membuat server gim multipemain sederhana untuk gim sederhana:

Permainan ini seharusnya mirip dengan Command & Conquer, Anda memiliki beberapa tank dan beberapa prajurit. Anda dapat memilih satu prajurit dan klik pada peta, ke tempat prajurit itu harus pergi. Jika prajurit itu datang ke suatu daerah di mana dia tidak bisa pergi, dia berjalan berkeliling. Dan tentara dapat ditembak jatuh oleh musuh.

Bagaimana saya harus menyusun server game, dan apa yang harus dilakukan pada klien?

Yaitu jika seorang prajurit bergerak dari X ke Y tetapi di sekitar bangunan Z, saya kira server harus dapat menghitung dengan tepat di mana tentara itu berada (jika ada musuh yang menembaknya), dan klien juga harus mengetahui posisi untuk melukis prajurit itu.

Apa yang harus dilakukan di server dan saya pikir saya harus desing protokol untuk ini. Saya pikir server harus melacak keadaan permainan dan waktu. Adakah yang punya saran tentang cara melakukan ini? atau dapat merekomendasikan beberapa bacaan?

Jonas
sumber

Jawaban:

12

Secara umum itu adalah subjek yang sangat kompleks. Anda memiliki dua tujuan yang saling bertentangan (setidaknya jika Anda tidak berencana menjalankan setiap game di server khusus):

  1. Anda ingin sebanyak mungkin dilakukan di server, baik untuk mencegah kecurangan dan untuk memastikan semua klien melihat hal yang sama.
  2. Tetapi Anda juga ingin segala sesuatunya adil, yang berarti jika satu orang melakukan ping 0 kali ke server sementara yang lain memiliki kelambatan jaringan, ketika keduanya mengeluarkan perintah ke unit mereka pada saat yang sama, pemain "server" memiliki keuntungan .

Saya tidak bisa mengatakan bagaimana menyelesaikannya untuk RTS. Apa yang kami lakukan untuk memecat FPS kami adalah memiliki server menyimpan keadaan dunia yang lengkap beberapa waktu lalu dan membiarkan timestamp klien setiap pengambilan gambar. Ketika pesan jaringan untuk "Saya memecat!" mencapai server, server dapat memutar kembali dunia dan melakukan tes tabrakan dll pada dunia "karena mencari klien ketika tembakan itu ditembakkan".

Jika Anda berencana memiliki banyak unit, Anda juga akan memiliki masalah yang berpotensi memiliki terlalu banyak pemrosesan untuk ditangani oleh server. Jika Anda tidak terlalu khawatir tentang peretasan atau kecurangan, saya sarankan melakukan pathfinding pada klien, dan mengirimkan hasilnya ke server.

Namun, opsi lain adalah memilih peer2peer sebagai gantinya, membiarkan setiap klien menangani pembaruan untuk tim lokal, tetapi itu kemudian membuka pertanyaan tentang bagaimana menentukan siapa yang memukul apa dan seterusnya.

Bergantung pada seberapa kompleksnya proyek ini dan seberapa banyak usaha yang Anda ingin habiskan untuk itu, saran terbaik saya adalah memutuskan sesuatu yang awal dan mulai mengerjakannya untuk mengujinya.

slicedlime
sumber
1
Sebenarnya ada tiga (atau mungkin lebih) tujuan yang saling bertentangan. Yang ketiga adalah kinerja, menjaga dan memperbarui keadaan game realtime sepenuhnya di server menggunakan banyak sumber daya.
Bart van Heukelom
2
Oh, dan Anda dapat dengan mudah memecahkan # 2 dengan memperkenalkan lag buatan yang sama dengan rata-rata lag pemain lain. Nah, jika Anda bisa menyebut "menjadikannya buruk untuk semua orang" solusi, itu.
Bart van Heukelom
@Bart: sebagian benar, tetapi tentu saja harus ada batasan pada berapa banyak lag yang Anda perkenalkan secara artifisial, atau koneksi yang lebih lambat dapat secara konstan memaksa koneksi yang lebih cepat untuk terlalu banyak ketinggalan, yang jelas sekarang adalah yang Anda inginkan.
o0 '.
Menemukan jalan terbaik tidak ada masalah jika dilakukan pada klien, selama dia telah menemukan itu mengirimkan solusi ke server, yang - seperti halnya semua gerakan - memeriksa apakah itu benar.
o0 '.
2

Pada dasarnya ada dua pendekatan:

  1. Klien tepercaya
  2. Klien tidak tepercaya

Klien tepercaya sedikit lebih kompleks, tetapi memiliki keuntungan bahwa Anda dapat membongkar banyak perhitungan Anda dari server. Biaya pengoperasian server adalah salah satu masalah terbesar untuk gim multipemain dan akan secara serius mengurangi skalabilitas Anda.

Pendekatan yang baik (untuk pemula) adalah membiarkan setiap pemain menangani kliennya sendiri. Pada langkah selanjutnya Anda dapat menggunakan siklus cadangan untuk membiarkan pemain klien memverifikasi tindakan klien lainnya. Server seharusnya tidak perlu melakukan lebih dari bertukar pesan, menjaga sinkronisasi dan memastikan kegigihan (mis. Database).

Jika Anda berencana melakukan semacam lobi atau obrolan, maka peganglah masing-masing topik ini di server tambahan. Ini akan membuat segalanya jauh lebih mudah di jalan.

Andreas
sumber
Terima kasih, itu informatif. Saya pikir saya akan pergi untuk klien yang tidak dipercaya, dan harus melakukan pekerjaan di server. Saya tidak akan memiliki banyak pemain di awal.
Jonas
1
"Saya tidak akan memiliki banyak pemain ..." Saya tidak bisa menghitung jumlah pengembang yang memberi saya garis itu dan kembali enam minggu kemudian dengan: "Saya punya 5000 pemain yang ingin membayar untuk memainkan permainan saya, tetapi saya tidak bisa mengukur :( ". Ingatlah itu!
Andreas
9
"Klien tepercaya" bukanlah pendekatan, itu kesalahan.
o0 '.