Saya sedang mengerjakan penembak top-down 2D dan melakukan yang terbaik untuk menyalin konsep yang digunakan dalam game berjejaring seperti Quake 3.
- Saya memiliki server otoritatif.
- Server mengirimkan snapshot ke klien.
- Snapshots berisi cap waktu dan posisi entitas.
- Entitas diinterpolasi di antara posisi snapshot sehingga gerakan terlihat mulus.
- Karena kebutuhan, interpolasi entitas terjadi sedikit "di masa lalu" sehingga kami memiliki beberapa snapshot untuk interpolasi.
Masalah yang saya hadapi adalah "sinkronisasi jam".
- Demi kesederhanaan, mari kita berpura-pura sejenak bahwa tidak ada latensi saat mentransfer paket ke dan dari server.
- Jika jam server lebih cepat 60 detik dari jam klien, maka cap waktu snapshot akan lebih dari 60000 ms dari cap waktu lokal klien.
- Oleh karena itu, snapshot entitas akan mengumpulkan dan duduk selama sekitar 60 detik sebelum klien melihat entitas tertentu melakukan gerakannya, karena dibutuhkan waktu yang lama untuk clock klien untuk mengejar ketinggalan.
Saya telah berhasil mengatasinya dengan menghitung perbedaan antara server dan jam klien setiap kali snapshot diterima.
// For simplicity, don't worry about latency for now...
client_server_clock_delta = snapshot.server_timestamp - client_timestamp;
Ketika menentukan seberapa jauh ke dalam interpolasi entitas, saya hanya menambahkan perbedaan pada waktu klien saat ini. Masalah dengan ini, bagaimanapun, adalah bahwa hal itu akan menyebabkan jerkiness karena perbedaan antara dua jam akan tiba-tiba berfluktuasi karena snapshot tiba lebih cepat / lebih lambat daripada yang lain.
Bagaimana saya bisa menyinkronkan jam cukup dekat sehingga satu-satunya keterlambatan yang dapat dipahami adalah bahwa yang hard-coded untuk interpolasi, dan apa yang disebabkan oleh latensi jaringan biasa?
Dengan kata lain, bagaimana saya bisa mencegah interpolasi dari mulai terlambat atau terlalu cepat ketika jam secara signifikan tidak tersinkronisasi, tanpa memperkenalkan jerkiness?
Sunting: Menurut Wikipedia , NTP dapat digunakan untuk menyinkronkan jam melalui internet dalam hitungan beberapa milidetik. Namun, protokolnya tampak rumit, dan mungkin berlebihan untuk digunakan dalam game?