Saya telah membaca Valve + Gafferon dan ratusan halaman dari Google, tetapi untuk alasan apa pun saya tidak bisa memahami prediksi klien.
Menurut pemahaman saya, masalah dasarnya adalah:
- Klien A mengirimkan input di
T0
- Server menerima input di
T1
- Semua klien menerima perubahan di
T2
Pada T2
Namun, menggunakan prediksi klien, klien A adalah sekarang di posisi yang tepat untuk T4
.
Bagaimana Anda memastikan bahwa Klien A, ketika memprediksi bahwa server akan menerima permintaan perpindahan, tidak akan berada di depan server? Jelas sepanjang waktu mereka di depan, ini menghasilkan gertakan kembali ke tempat server terakhir melihat mereka. Dengan semua koreksi yang telah saya coba, ini masih terlihat ketika Anda berhenti, karena server berhenti di belakang Anda
sumber
Saya belum benar-benar menerapkan ini (jadi mungkin ada beberapa masalah yang tidak segera saya lihat), tetapi saya pikir saya akan mencoba membantu.
Inilah yang Anda katakan sedang terjadi:
Mungkin akan berguna untuk berpikir dalam hal waktu server. (Mungkin) sangat mirip dengan cara interpolasi bekerja.
Setiap perintah dikirim dengan waktu server. Waktu server ini diketahui pada awal pertandingan dengan menanyakan tanda centang server, mengkompensasi waktu ping. Pada klien Anda memiliki jumlah tick lokal Anda sendiri, dan setiap perintah yang Anda kirim dikonversi ke tick server (ini adalah operasi pengurangan sederhana)
Selain itu, klien selalu merender "di masa lalu". Jadi Anda berasumsi bahwa dunia yang dilihat klien adalah, katakanlah, 100 ms di belakang waktu server sebenarnya.
Jadi mari kita ulangi contoh Anda dengan waktu server (ditunjuk oleh S).
Klien mengirimkan input pada T0 dengan waktu server S0 (yang saya duga sebenarnya adalah "representasi klien dari waktu server dikurangi waktu interpolasi"). Klien tidak menunggu respons dari server dan segera bergerak.
Server menerima input di T1. Server menggambarkan posisi otoritatif klien pada waktu server S0 yang diberikan oleh klien. Mengirimnya ke klien.
Klien menerima posisi otoritatif di T2 (masih dengan penunjukan waktu server S0). Klien melacak sejumlah waktu lalu senilai peristiwa sebelumnya (mungkin hanya antrian dari semua prediksi yang belum dikonfirmasi).
Jika posisi / kecepatan / prediksi apa pun yang dikirim server pada S0 berbeda dari apa yang klien simpan di S0, klien menangani ini entah bagaimana. Baik dengan menjentikkan pemain kembali ke posisi masa lalu mereka, atau menstimulasi kembali input sebelumnya, atau mungkin sesuatu yang belum saya pikirkan.
sumber
Sebenarnya ada implementasi open-source di github yang menunjukkan bagaimana ini dilakukan. Lihat Lance.gg
github repo: https://github.com/lance-gg/lance
Kode prediksi klien diimplementasikan dalam modul yang disebut
src/syncStrategies/ExtrapolateStrategy.js
Selain ekstrapolasi, ada dua konsep yang saya tidak lihat disebutkan di atas:
sumber
Klien A selalu di depan server - tetapi tidak masalah. Anda hanya perlu mengembalikan klien jika server mengatakan ada masalah dengan posisi yang dilaporkan, di mana klien menjalankan kembali semua perubahan yang telah dibuat sejak kesalahan dengan nilai-nilai yang dikoreksi, untuk membawanya ke keadaan yang kompatibel. dengan server.
Untuk melakukan ini, klien perlu mengingat beberapa keadaan terakhir dan pembaruan masa lalu. Ini mungkin hanya beberapa nilai sederhana seperti posisi, kecepatan, orientasi, hal semacam itu. Server secara berkala akan mengirimkan pemberitahuan bahwa berbagai pembaruan klien adalah sah, artinya sekarang dapat dilupakan dari klien. Namun jika server melaporkan bahwa pembaruan tidak valid, keadaan klien memutar kembali ke titik itu dan perubahan di masa depan diterapkan ke keadaan yang dimodifikasi itu.
Ada beberapa tautan tambahan di bagian bawah artikel Valve yang layak dibaca - ini adalah salah satunya: https://developer.valvesoftware.com/wiki/Prediction
sumber
t=4
) menerima info tentangt=2
, sehingga mengatur ulang negara untukt=2
kemudian menjalankan kembali pembaruan untuk membawa objek darit=2
ket=4
?