Saya memiliki 2 hingga 3 klien, yang dapat bertukar pesan melalui Apple Game Center.
Satu-satunya sinkronisasi yang saya butuhkan adalah: memulai permainan pada saat yang sama.
Saya kira ini melibatkan sinkronisasi jam. Bagaimana cara mencapai ini?
networking
multiplayer
game-center
GameCoder
sumber
sumber
now
dan Anda mengirim pesan untuk memulai tepat padanow + halfSecond
saat mereka semua menerima pesan dalam setengah detik, dan selama jam sistem mereka disinkronkan dengan benar, mereka semua akan mulai pada waktu yang sama.Jawaban:
Komentar Steven benar: ini secara teori tidak mungkin dilakukan.
Untungnya, dalam praktiknya Anda bisa mendekati, seperti itulah cara kerja NTP .
Misalnya, lebih baik daripada hanya mengirim pesan ke 3 klien yang mengatakan "mulai sekarang", Anda dapat bertukar beberapa pesan ping sebelumnya untuk mengukur waktu yang dibutuhkan untuk mendapatkan pesan ke klien, dan ketika Anda mengirim pesan awal, alih-alih "mulai sekarang" katakan "mulai dalam X milidetik" dan sesuaikan X untuk waktu yang berbeda yang diambil agar pesan tiba.
misalnya.:
Ini tidak dapat menjamin sinkronisasi karena waktu yang diperlukan untuk mengirim pesan di internet bervariasi, dan karena itu dapat berbeda di setiap arah. Pertama, Anda dapat mengurangi efek dengan melakukan pengukuran beberapa kali dan membaca rata-rata. Yang kedua lebih rumit dan mungkin secara teori tidak mungkin untuk dipecahkan (meskipun saya tidak dapat mengingat buktinya sekarang). Berita baiknya adalah Anda mungkin tidak membutuhkan ketepatan yang begitu banyak.
sumber
Seperti yang disebutkan, ini tidak mungkin, jadi saya akan mencoba pendekatan lain:
Jika Anda tidak memiliki server khusus, pilih satu klien yang berpartisipasi untuk menjadi tuan rumah (ini dapat ditransfer jika perlu).
Tuan rumah sekarang akan melakukan semua logika permainan yang penting, seperti deteksi hit, kontrol AI, penanganan inventaris, dll. Serta pelacakan waktu (yaitu menentukan waktu permainan).
Klien lain hanya akan mencoba untuk tetap sinkron dengan tuan rumah, mencoba memperkirakan atau memperkirakan nilai yang diharapkan. Jika lag bertambah atau ada kehilangan paket, semuanya mungkin berombak, tetapi sepele untuk mengejar ketinggalan, pada dasarnya hanya menunggu pembaruan berikutnya.
Sebagian besar permainan (terutama FPS) menyembunyikan fakta ini dengan melakukan perhitungan lokal mereka sendiri untuk pergerakan pemain sendiri, tembakan yang ditembakkan, dll. Untuk menghindari permainan yang terasa lamban. Semuanya masih diperbaiki berdasarkan data server. Ini dapat menyebabkan beberapa kebingungan, misalnya Anda melihat diri Anda menembak musuh, tetapi pada saat yang sama Anda jatuh mati (tanpa musuh menabrak), tetapi itu masih pendekatan yang jauh lebih baik daripada sinkronisasi penuh.
Jika Anda masih bersikeras untuk menjaga semuanya tetap sinkron, Anda mungkin ingin membuat semacam penghitung langkah atau bingkai, jadi semua klien hanya memproses satu langkah logika, lalu menyinkronkan data mereka, dll. Perlu diingat bahwa ini bisa menjadi bandwidth baik intensif dan laggy, jadi saya tidak akan merekomendasikan melakukan itu kecuali Anda punya banyak data sebaliknya dan gameplay Anda berbasis giliran (misalnya gim gaya Artillery / Worms).
sumber
Saya merekomendasikan sinkronisasi timer sistem pada semua klien dan server dengan menggunakan protokol NTP [Stratum 2], kemudian server mengirim perintah untuk memulai permainan pada waktu yang ditentukan, katakanlah, ketika semua timer mencapai 0:05:00. Pendekatan ini seharusnya memberi Anda 3-4 ms sinkronisasi akurat, saya percaya.
sumber