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:
Klien A mengirimkan input pada T0
Server menerima input di T1
Semua klien menerima perubahan di T2
Namun pada T2, menggunakan prediksi klien, Klien A sekarang pada posisi yang sesuai dengan T4.
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.