Saya menerapkan server game yang mendukung huru-hara seperti Star Control . Jadi, Anda memiliki kapal yang terbang dan menembak, dengan kecepatan / akselerasi / peredam fisika super sederhana untuk mendorong gerakan.
Saya telah membaca Valve, Gafferon dan Gambetta dan menerapkan algoritma Gambetta untuk prediksi klien:
Prediksi klien berfungsi pada kapal pemain dengan memperbarui posisinya dari server saat datang dan kemudian menerapkan kembali input yang belum diproses oleh server ke kapal pemain.
Sayangnya, itu tidak berfungsi dengan baik untuk permainan saya. Saya percaya itu ada hubungannya dengan fakta bahwa contoh Gambetta tidak memperhitungkan objek akun yang sudah bergerak, atau perintah yang diperbarui pada langkah demi langkah. (Dengan "langkah" Maksudku bingkai). Jadi dalam permainan saya, pemain menekan untuk mempercepat kapal (yang sudah bergerak), yang terus bergerak pada klien, mengirimkan perintah ke server dan biasanya menerima snapshot dunia dari server pada langkah berikutnya. Saya mendapatkan sesuatu yang lebih seperti:
Perintah pemain berjalan di klien langkah 3 , tetapi di server hanya berjalan di server langkah 5 . Pada saat snapshot dunia diterima oleh klien pada langkah klien 6 , prediksi tersebut hilang, terutama dalam kecepatan yang lebih cepat.
Inti masalahnya adalah bahwa klien menjalankan perintah pada langkah 5 , tetapi server menjalankannya pada langkah 6 . Saya berpikir tentang mungkin mengirim langkah klien dengan perintah, dan meminta server memutar kembali dan menjalankan kembali perintah dengan langkah waktu klien. Itu mungkin mengarah pada banyak masalah lain - seperti apa yang terjadi pada perintah yang diterima sejak rollback, atau bagaimana menipu klien dapat mengeksploitasi dengan mengubah langkah yang dikirim.
Membaca dan menonton video seperti ini dari Google menyebutkan pendekatan yang berbeda, di mana Anda secara bertahap mengubah posisi pemain agar sesuai dengan snapshot dalam beberapa langkah.
Pertanyaan saya:
Bisakah Anda membuat algoritma Gambetta bekerja dengan gerakan langkah konstan? Atau apakah secara konseptual tidak kompatibel dengan game saya?
Apakah interpolasi bertahap atas langkah-langkah cara yang benar untuk pergi kemudian? Jika demikian, bagaimana Anda menginterpolasi objek yang sudah bergerak dari posisi klien agar sesuai dengan yang baru saja diterima dari server?
Dapatkah metode ini, interpolasi bertahap dan algoritma Gambetta bekerja bersama-sama, atau mereka saling eksklusif?