Saya sedang melakukan permainan fisika serba cepat yang merupakan hoki meja. Dengan dua palu dan satu keping. Game ini berjalan di iphone / ipad dan saya melakukan bagian multiplayer melalui GameCenter.
Beginilah cara sistem jaringan bekerja. Klien yang membintangi pertandingan, akan ditetapkan sebagai server dan yang menerima permintaan pertandingan adalah klien.
'Server' memiliki fisika berjalan dan responsnya segera dan klien juga memiliki fisika mereka berjalan sehingga terlihat mulus di antara pertukaran pesan. Apa yang saya lakukan sebagai server, adalah bahwa saya mengirim ke klien kecepatan keping saya dan posisi saya dan klien menyesuaikan kecepatan kepingnya / posisi yang terkait dengan server untuk tetap menyelaraskannya. Jika tidak, fisika akan tidak sinkron dan mengacaukannya.
Ketika latensi jaringan baik, di bawah 100ms hasilnya cukup bagus, saya mendapat permainan yang lancar dimainkan di sisi klien dan perilaku aneh minimum. Masalahnya terjadi ketika lag sekitar 150 hingga 200 ms. Dalam hal itu, kebetulan bahwa keping klien saya sudah mengenai sisi yang terbalik dan terbalik tetapi ia menerima pesan penundaan dari server dan itu sedikit mundur menyebabkan perasaan aneh pada perilaku bola.
Saya sudah membaca beberapa hal tentang itu:
Wikipedia pada Sinkronisasi Jam
Jadi, bagaimana saya bisa menyelesaikan ini? Sejauh yang saya baca opsi terbaik yang saya miliki adalah melakukan sinkronisasi jam di server / klien dengan timestamp sehingga ketika saya mendapatkan pesan penundaan terkait jam saya, saya abaikan saja dan biarkan simulasi klien melakukan pekerjaan. Apakah kalian setuju dengan itu? Dan karena saya mengirim data tidak dapat diandalkan (UDP) saya mungkin mendapatkan pesan tertunda atau pesan rusak.
Jika itu adalah pendekatan terbaik, bagaimana cara menerapkan sinkronisasi jam. Saya sudah membaca langkah-langkah tentang bagaimana tetapi saya tidak cukup memahaminya.
Dikatakan bahwa:
- Klien mencap waktu lokal saat ini pada paket "permintaan waktu" dan mengirim ke server.
- Setelah diterima oleh server, server akan mencap waktu server dan kembali
- Setelah diterima oleh klien, klien mengurangi waktu saat ini dari waktu yang dikirim dan membaginya dengan dua untuk menghitung latensi. Ini mengurangi waktu saat ini dari waktu server untuk menentukan delta waktu client-server dan menambahkan setengah-latensi untuk mendapatkan delta jam yang benar. (Sejauh ini algothim ini sangat mirip dengan SNTP)
- Klien mengulangi langkah 1 hingga 3 lima kali atau lebih, berhenti beberapa detik setiap kali. Lalu lintas lain mungkin diizinkan untuk sementara, tetapi harus diminimalkan untuk hasil terbaik. Hasil penerimaan paket diakumulasikan dan diurutkan dalam latensi terendah hingga latensi tertinggi. Median latensi ditentukan dengan memilih sampel titik tengah dari daftar yang dipesan ini.
- Semua sampel di atas sekitar 1 standar-deviasi dari median dibuang dan sisa sampel rata-rata menggunakan rata-rata aritmatika.
Mengikuti contoh ini saya akan memiliki ini:
Mari kita berpura-pura permainan telah dimuat dan waktu klien saya adalah 0 sekarang, jadi saya kirim ke server bahwa waktu saya adalah 0.
Pesan membutuhkan 150ms untuk sampai ke server tetapi jam server sudah dimulai dan 1 detik di depan klien. Ketika server menerima pesan, waktunya akan menjadi: 1.15 dan mengirimkan waktu itu ke klien, apakah kita baik-baik saja? Mari kita berpura-pura lag kita konstan pada 150 ms.
Sekarang klien menerima waktu 1,15 dan mengurangi waktu saat ini dari waktu yang dikirim dan membaginya menjadi dua untuk menghitung latensi. Wich adalah: 0,3 - 0 = 0,3 / 2 -> 150ms.
Ini mengurangi waktu saat ini dari waktu server untuk menentukan delta waktu klien-server dan menambahkan setengah-latensi untuk mendapatkan delta jam yang benar:
Waktu klien: 0,3 Waktu server 1,15
0,3 - 1,15 = 0,85 + latensi (0,15) = 1
Bagaimana itu disinkronkan? Apa yang saya lewatkan?
Ini pertama kalinya saya mengalami multipemain dan pengalaman jaringan, jadi saya agak bingung.
Terima kasih.
Jawaban:
Algoritma yang dipasang benar, tetapi dalam contoh Anda, Anda lupa tentang waktu yang dibutuhkan untuk paket server untuk sampai ke klien, jadi:
Sekarang seperti yang Anda lihat, jika klien mengubah jam ke 1,15, itu akan menjadi 0,15 di belakang server, inilah mengapa Anda harus menyesuaikan untuk Ping (alias Round Trip Time [RTT]). Berikut ini perhitungan waktu delta penuh yang dilakukan pada banyak langkah:
Ini memberi kita waktu delta yang benar yaitu 1,00 detik
sumber