Bagaimana cara menyinkronkan klien dan server saat mengirim perubahan kecepatan pemain?

10

Saya menerapkan prediksi sisi klien. Sebagian besar penjelasan menganggap klien mengirim pesan seperti " Gerakkan pemain saya naik 1 posisi ". Bagaimana jika saya mengirim pesan seperti " Setel kecepatan pemain saya ke x "?

grafik penjelasan;  menunjukkan pesan terkirim dan posisi yang dihitung pada klien dan server dari waktu ke waktu

Pada klien, pemain menetapkan kecepatannya sendiri (berdasarkan prediksi sisi klien) sebelum server melakukannya, sehingga keduanya tidak sinkron. Masalah ini tetap ada bahkan mempertimbangkan latensi rata-rata.

Bagaimana saya bisa mengatasi ini?

Blu3
sumber

Jawaban:

8

Anda harus mengirim data yang berlebihan, yang di sini berarti mengirim posisi dan kecepatan. Bahkan jika Anda tidak sinkron, fakta bahwa Anda memiliki posisi dan kecepatan memungkinkan Anda untuk memperbaiki lintasan menggunakan fungsi interpolasi.

Kemudian menggunakan beberapa trik seperti animasi yang tertunda, akselerasi, dll. Memungkinkan untuk menyembunyikan latensi.

Sunting: Saya berasumsi bahwa server itu otoritatif.

Thvvyn
sumber
Terima kasih atas jawaban anda. Ya, Server otoritatif tetapi bahkan jika saya mengirim data yang berlebihan dengan kecepatan saya, klien dapat memperbaiki kesalahannya tetapi saya sering membaca hal-hal seperti "Jika klien / server menggunakan kode bersama untuk entitas mereka, kesalahan prediksi tidak akan pernah benar-benar terjadi" tetapi dalam kasus saya, mereka akan SELALU terjadi sedikit yang akan menyebabkan kegagapan di seluruh.
Blu3
1
@ user13842 klien akan selalu keluar dari sinkronisasi, Anda harus memperbaiki posisi dan kecepatan sisi klien, seperti kata Thelvyn, sesuai dengan server yang mengirim Anda. dengan cara itu Anda tidak mendapatkan gerakan gagap kecuali klien Anda benar-benar tidak selaras maka Anda harus mengambil nilai karena koreksi akan memakan waktu terlalu lama.
dreta
Ini adalah alasan utama untuk menggunakan fungsi interpolasi. Anda tidak dapat menghindari latensi, jadi Anda harus memperbaiki gerakan dengan cara yang halus. Klien dan server mensimulasikan dunia tetapi klien harus mendengarkan server dan melakukan koreksi. Beberapa teknik yang digunakan dalam jaringan Source Engine: developer.valvesoftware.com/wiki/Source_Multiplayer_Networking
Thelvyn
itu disebutkan secara singkat di google talk ini juga, itu harus mendapatkan ide di youtube.com/watch?v=Prkyd5n0P7k#t=18m47s
dreta
Saya telah menemukan solusi lain untuk masalah khusus ini. Saya menambahkan waktu klien menerapkan inputnya dengan setiap paket. Berarti # 1 akan punya waktu: 0 dan yang kedua: 100. Sekarang Server tahu bahwa klien menekan tombolnya tepat waktu: 100 dan tidak sebelumnya.
Blu3