Input sisi server


9

Saat ini dalam permainan saya, klien tidak lain adalah penyaji. Ketika kondisi input diubah, klien mengirim paket ke server dan menggerakkan pemain seolah-olah sedang memproses input, tetapi server memiliki keputusan akhir pada posisi tersebut.

Ini umumnya bekerja dengan sangat baik, kecuali untuk satu masalah besar: jatuh dari tepi. Pada dasarnya, jika seorang pemain berjalan menuju tepi, katakan sebuah tebing, dan berhenti tepat sebelum keluar dari tepi, kadang-kadang sedetik kemudian, ia akan diteleportasi dari tepi. Ini karena paket "Saya berhenti menekan W" dikirim setelah server memproses informasi.

Berikut ini diagram lag untuk membantu Anda memahami apa yang saya maksud: http://i.imgur.com/Prr8K.png

Saya hanya bisa mengirim paket "W Pressed" setiap frame untuk diproses oleh server, tapi itu sepertinya solusi bandwidth-mahal.

Bantuan apa pun dihargai!

Jawaban:


5

Sementara server memiliki keputusan akhir tentang posisi tersebut, ia harus melakukan itu dengan memverifikasi dan memeriksa kewarasan apa yang dikirim oleh klien sebagai input dan posisi. Saya mengatakan ini karena apa yang Anda lakukan adalah memindahkan pemain dengan segera dan harapan yang tercipta dalam kode Anda adalah bahwa klien adalah posisi sebenarnya.

Anda pikir itu umumnya bekerja dengan baik, tetapi ternyata tidak. Catatan: Anda mengatakan bahwa klien Anda tidak lebih dari seorang pemberi render, lalu segera memberikannya kontrol lokal untuk bergerak tanpa pesan server. Anda tidak dapat memiliki keduanya, baik menunggu server untuk memberitahu Anda untuk memindahkan atau mengambil kendali atas posisi Anda dan menggunakan server untuk memverifikasi menipu.

Saya perhatikan bahwa tanggapan Anda mencapai satu detik penuh? Itu 500 ms latensi yang sangat besar untuk semua jenis game aksi. Cobalah untuk mencari tahu mengapa perputaran ini memakan waktu begitu lama, bisa jadi apa saja dari antrian perintah yang dicadangkan dari tidak segera ditangani ke bandwidth yang dibanjiri atau bahkan setan yang menyebabkan banyak paket hilang.

Yang saya pikir harus terjadi adalah itu

client sends a move + position update
server gets it t+latency time later
server verifies and sends out info to all clients
client receives this at (t+latency + latency)

Bagian yang sulit di sini adalah bahwa jika klien menerima pesan tentang dirinya sendiri, sebagian besar harus mengabaikannya kecuali jika pesan itu seperti "langkah tidak valid, pergi ke XYZ sebagai gantinya." Jika pesan itu untuk klien orang lain yang Anda dapatkan info tentangnya maka Anda harus memperkirakan waktu yang tepat sehingga terlihat seperti di mana itu akan berada.


Klien tidak mengirim posisinya sama sekali; hanya memprediksi / menginterpolasi. Itu sebabnya ia jatuh dari tepi ketika berpikir itu ada di tepi. Juga, saya tidak melihat di mana saya mengatakan lag adalah 1 detik, ini lebih seperti 8 ms (pengujian lokal) hingga 100 ms (melalui internet). Saya mengatakan bahwa pemain tersebut akan diatur kembali nanti karena saya secara berkala mengirimkan pembaruan posisi penuh. Apakah saya benar dalam memahami bahwa saya harus mengirim posisi yang menurut klien seharusnya, bersama dengan tombol yang ditekan, dan server harus memverifikasi apakah mungkin?
Thomas

"Kadang-kadang sedetik kemudian, dia akan diteleportasi" menyiratkan penundaan besar, dari sanalah aku mendapat waktu. Untuk permainan aksi responsif ya, klien bermain dan server bermain di belakang dalam waktu dan membiarkan klien tahu apakah itu melakukan sesuatu yang ilegal. Anda akan melihat dalam permainan multipemain daring yang sebagian besar Anda lihat orang lain menggeser posisi (yang berasal dari server) sementara posisi Anda sendiri jarang sekali berubah dari koreksi server langsung. Orang lain melihat Anda mengubah posisi, dll ...
Patrick Hughes

Tidak bisakah ini masih menyebabkan pemain jatuh dari tepi pada server? Kecuali saya mengirim paket setiap frame, server masih bisa berpikir bahwa pemain bergerak sekitar 32ms. (Saya hanya mengirim paket setiap tiga frame). Atau apakah Anda menyarankan agar saya tidak mensimulasikan input pada server sama sekali, tetapi hanya memeriksa apakah posisinya dalam batas input yang ditekan?
Thomas

Karena server hanya mengoreksi gerakan tidak valid yang dilaporkan oleh klien, itu tidak akan pernah mengirimkan "Anda jatuh dari tebing" kecuali klien itu sendiri melaju tepat di tepi. Dalam umpan balik ini, serverlah yang mengoreksi dirinya sendiri terhadap pandangan klien tentang dunia dan tempatnya di dalamnya. Gerakannya akan terasa segar dan responsif terhadap pemain. Tindakan lain seperti berinteraksi dengan objek dunia akan melibatkan menunggu server untuk memberi tahu klien apa yang baru saja terjadi, klik kotak dan menunggu respons, tetapi kita hanya berbicara tentang gerakan di sini.
Patrick Hughes

Itu terdengar sangat mirip dengan apa yang saya lakukan saat ini; mengirim posisi ke server dan meminta server memvalidasi apakah pemain dapat pindah ke posisi itu. Itu tampaknya menjadi pendekatan yang lebih heuristik, dan menurut saya tidak akan hampir efektif karena server memutuskan, titik. Apakah mengirim cap waktu dengan setiap paket berfungsi? Saya pikir itu akan menghapus masalah ini. Saya percaya bahwa Halo dan game yang menggunakan mesin Sumber menggunakannya.
Thomas

0

Saya mengerti pertanyaan Anda sebagai:

Server mendapat paket ketika saya mulai menekan tombol 'maju' dan paket lain ketika saya akhirnya merilis tombol 'maju'. Oleh karena itu, gerakan aktual di server dimulai dan berakhir sekitar 100 milidetik 'terlambat' dalam permainan aktual vs apa yang diekspresikan pemain di sisi klien. Jadi jika pemain ingin bergerak 10 detik, ia mungkin berakhir bergerak 10x detik sebagai gantinya x >= 1online.

Ini adalah strategi desain yang buruk karena tidak mengekspresikan keinginan pemain di dunia game seperti yang diinginkan pemain, menciptakan pengalaman pengguna yang agak buruk.

Solusi yang saya sarankan adalah mengirim paket (sesering mungkin) yang menunjukkan berapa banyak langkah yang dilakukan pemain dan ke arah mana. Server kemudian memperbarui dunia game dengan lokasi pemain baru jika melewati pemeriksaan kebenaran. Jadi pemain dapat bergerak dengan presisi tinggi dan menghindari jatuh dari tepian tinggi.

Alternatifnya adalah dengan mengingat posisi pemain di detik terakhir dan memperbaiki posisi dalam retrospeksi saat tombol dilepaskan. Kedengarannya seperti itu akan menciptakan efek karet gelang di masa lalu (hanya untuk alasan yang berbeda)

Jadi pada dasarnya Anda perlu mengirim paket tombol mana yang ditekan dan berapa waktu permainan sebenarnya tombol itu ditekan dan kemudian, tombol mana yang dilepaskan dan pada waktu yang tepat.


Seperti yang saya katakan kepada Patrick, saya pikir solusi akan lebih dari pendekatan heuristik; alih-alih server menjadi "The Man", server malah memeriksa validitas data klien. Ini tentu saja, harus membuat beberapa kelonggaran sehingga kelambatan atau masalah jaringan lainnya tidak membuat false positive.
Thomas
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.