Jaringan dan pergerakan di UNITY MMORPG

8

Saya pemrograman server khusus di C # menggunakan BeamServer2 DLL. Pada awalnya saya ingin melihat pemain lain bergerak di peta Omuni kami yang sudah dibuat. Ini saya lakukan dengan hanya mengirim posisi Anda ke server setiap frame. Ini berhasil dan saya bisa bermain dengan beberapa teman tetapi gerakan itu tidak laggfree. Jadi saya mulai mencoba untuk menambahkan perataan gerakan dan juga beberapa keamanan sehingga mereka tidak bisa hanya mengirim posisi palsu ke server tanpa server menghentikannya dari menjangkau klien lain.

Apa yang saya lakukan, saya membuat masterClient yang memiliki movementController pada remotePlayer. Ketika klien ingin pindah, dia bergerak secara lokal dan mengirim pesan ke server dengan arah untuk pindah. Server kemudian mengambil kecepatan dan mengirimkannya ke masterClient. MasterClient daripada memindahkan remotePlayer sama seperti remotePlayer bergerak sendiri. Ketika dia berhenti bergerak, dia mengirim pesan dengan posisi di dalamnya. Masterclient akan memeriksa apakah posisi yang ia datangi sedekat posisi yang ia miliki dari klien, jika realistis menurut ping klien, server menempatkannya pada posisi klien.

Ini berfungsi, tetapi saya masih memiliki masalah tunda dan saya tidak yakin bagaimana cara memperbaikinya. Saya harus membuat gerakan memuluskan pada klien tetapi saya menemukan diri saya bahwa saya hanya bisa lerp (x / 2, y / 2, z / 2) ke posisi dan menempatkannya pada posisi nyata frame berikutnya, saya gagal pada saat itu dan saya akan mencoba lagi nanti. Bahkan jika itu ditambahkan, saya tidak yakin apakah lagg diperbaiki.

Ada teknik, saran, pertanyaan, ...? Terima kasih, Diede.

Diede
sumber

Jawaban:

8

Ada banyak masalah / tugas yang terlibat saat pemrograman "no lagging" game jaringan waktu nyata.

  • kecepatan perangkat keras (diperlukan daya prosesor, baik klien maupun server)
  • jarak dan peralatan jaringan (koneksi LAN atau WAN?)
  • bandwidth server (berapa banyak pemain)

Kedua, Anda memiliki "orang jahat" yang selalu mencoba menipu dalam permainan. Jika game Anda go public, maka pertimbangkan apa yang akan terjadi jika saya duduk dan menyuntikkan paket jaringan "palsu". Pertimbangkan jika seseorang memposting "posisi yang tidak terjangkau" atau "kesehatan penuh / amunisi".

Saran saya untuk arsitektur Anda sebagai permulaan, akan menjadi sesuatu seperti ini:

  • Server, mengontrol semua data vital, menghitung dan memvalidasi pergerakan.
  • Klien, menerima data tentang apa yang ditampilkan di layar + beberapa data "berpikir ke depan" pada objek bergerak.

Kebanyakan FPS realtime seperti yang saya tahu, melakukan semacam "kami tahu Anda bergerak ke arah ini dengan kecepatan ini, jadi kami hanya mensimulasikannya sampai kami mendapatkan detail lain dari server"

Jadi klien Anda harus memposting "apa yang diminta" dan bahkan mungkin mulai bergerak sendiri ke arah itu, tetapi mungkin "dipaksa kembali" oleh server jika server menolak perpindahan. Di sini Anda harus berpikir, bagaimana jika klien memposting "coords palsu" di luar peta, atau tiba-tiba "melompat". Server perlu melacak jika posisi baru dimungkinkan dari titik sebelumnya ATAU server hanya menerima pesan yang mengatakan: "KLIEN MOVE FORWARD 200" dan kemudian server memproses apa yang akan dilakukan menurut peta dan data permainan.

Ini akan memberikan beberapa kelambatan, tetapi sekali lagi, jika Anda membiarkan klien menerima data ini dan melakukan beberapa perhitungan sendiri, itu tidak memerlukan pembaruan setiap ms / frame, ia dapat sedikit tertinggal tanpa kelambatan yang terlihat di layar.

Mungkin Anda bahkan dapat membagi peta menjadi "ubin virtual" (jika ini adalah permainan vektor) sehingga Anda memiliki cara cepat untuk menghitung di mana objek harus berada selanjutnya.

World of Warcraft / Battlefield / Counterstrike

Saya percaya WOW juga melakukannya dengan cara ini. Anda menekan tombol, server menerima gerakan Anda "berharap" dan membalas dengan "Anda bergerak sekarang" dan kemudian klien menunjukkan ini + server mensimulasikan posisi baru di server dalam semacam "sesi sesi klien". Ini adalah "jumlah maksimum permainan pemain pr" semakin buruk, karena server Anda harus melacak semua orang dan pada dasarnya melakukan ini sebagai "turnbased" - tetapi begitu cepat sehingga terlihat realtime.

Begitu...

Foreach (Client in GameSessionList)
{
   ParseInput();
   ParseMovement(); // including collission test
   ResponseSend(); // new positions+movement data for client and objects/other players
}
BerggreenDK
sumber
3
Terlepas dari manfaat jawabannya, apakah ada alasan untuk bersikap kasar?
Konrad
Saya mendapat kesan bahwa di sebagian besar game FPS, klien dan server melakukan tabrakan secara independen, dan server mengoreksi klien jika mereka terlalu banyak bervariasi, daripada klien yang hanya mensimulasikan.
Magus
Saya tidak tahu bagaimana setiap FPS melakukannya. Tapi ya, mis. seri BF memiliki sesuatu yang mereka sebut Netcode yang artinya mereka melakukan perhitungan secara lokal dan mengirimkan hasilnya ke server yang kemudian memverifikasi dan mendistribusikan hasilnya (seperti yang telah saya katakan). Ini mungkin ada hubungannya dengan mereka "partikel" / detail yang sangat besar yang perlu ditransfer sebaliknya. Sedangkan WOW adalah dunia yang lebih statis dan Anda tidak memiliki tabrakan antara karakter (dalam mode normal) jadi tidak apa-apa untuk membiarkan Anda "meluncur" melalui orang lain.
BerggreenDK
2

Bagian yang menantang dalam kompensasi lag adalah bahwa Anda akan mendapatkan pembaruan dari klien yang rusak. Perintah klien laggy yang dikirim pada waktu T mungkin sangat baik tiba setelah perintah klien non-laggy dikirim pada T + 40ms. Menerapkan perintah dalam urutan yang Anda dapatkan akan menyebabkan semua jenis kejijikan. Melakukannya dengan benar di sisi lain melibatkan waktu belitan kembali dan memutar ulang semua perintah yang telah dikeluarkan sejak itu.

Tidak ada cara mudah untuk mengatasi hal ini, tetapi ada beberapa solusi yang valid. Anda dapat menemukan yang relatif mudah dijelaskan di sini .

Ada banyak penelitian di bidang ini, lihat-lihat!

drxzcl
sumber
1

Saya akan membuat klien seperti itu adalah permainan non-jaringan. Yaitu, apa pun yang Anda lakukan, Anda melakukannya secara langsung pada klien. Kemudian tambahkan, sejajar dengan itu, kode jaringan Anda. Kode ini akan mendapatkan data perpindahan. Sederhana seperti dari koordinasi, arah dan kecepatan. Itu hanya mengirimkan ini ke server yang memvalidasi. Server mengirimkan Anda posisi ok atau baru.

Jadi Anda memiliki semua kode klien Anda berjalan seperti itu sendirian di dunia. Maka itu hanya menerima data koreksi baru dari server atau ok. Jika Anda menekan maju dan tahan selama sepuluh detik, maka server hanya akan menerima satu data itu. Anda mungkin mempertimbangkan mengirim / menerima data setiap detik meskipun Anda hanya menahan tombol maju, atau jika Anda menekan lonjakan lag Anda mungkin berjalan selamanya.

Espen
sumber