Bagaimana saya bisa menyinkronkan dua pemain balap?

8

Saya sedang mengerjakan game seluler Unity, seperti versi multipemain dari Temple Run . Saya melihat latensi jaringan yang fluktuatif (umumnya 200-500 ms) karena platform seluler.

Dua karakter pemain ditampilkan berjalan di jalur yang sama dan harus melakukan tindakan sederhana (melompat, slide, powerup, dll.) Untuk melewati rintangan.

Ketika pesan datang terlambat, permainan menganggap pemain jarak jauh melewati rintangan. Ini biasanya bekerja dengan baik, tetapi jika seorang pemain terbunuh oleh sebuah rintangan, saya ingin pemain jarak jauh itu tampak mati pada rintangan / posisi yang sama dengan pemain lokal. Karena latensi, pemain jarak jauh tampaknya telah melewati rintangan sebelum pesan mengumumkan kematian mereka bahkan tiba.

Bagaimana saya bisa membuat para pemain disinkronkan?


Saya mencoba memindahkan pemain jarak jauh kembali ke posisi mati pemain lokal segera setelah pesan kematian tiba, terlihat canggung secara visual dan mungkin menimbulkan masalah sinkronisasi lainnya.

Zohaib Javed
sumber

Jawaban:

10

Analisa masalah

Komunikasi waktu nyata melalui koneksi latensi tinggi jelas tidak mungkin.

Anda dapat tentu saja mencoba ilusi (seperti yang Anda lakukan dengan membuat pemain terpencil tampaknya telah berlalu kendala ketika itu belum diketahui). Ketika ilusi itu gagal (seperti milik Anda ketika pemain jarak jauh tidak benar-benar melewati rintangan, tetapi malah mati ) tidak ada yang bisa dilakukan lagi.

masalah

Dalam kasus (seperti di sini) di mana kegagalan ilusi terlihat sangat buruk , mungkin lebih mudah untuk menerima fakta dan hanya melakukan yang terbaik untuk mewakili situasi sebagaimana adanya.

Solusi potensial

Bagaimana kalau benar - benar memperlambat pemain lain jika keputusan mereka membutuhkan waktu untuk disebarkan?

sebuah solusi

Setiap pemain melihat gambar yang lain, tetapi gambar itu melambat ketika mendekati rintangan yang pesan keputusannya masih ada di udara. Hanya setelah pesan diterima mereka tampaknya melewati atau gagal hambatan. Setelah rintangan, gambar kemudian mempercepat lagi untuk mengejar, memperlambat lagi untuk yang berikutnya, jika perlu.

Pada koneksi latensi rendah, keputusan tiba segera dan memperlambat dan mempercepat akan diabaikan. Pada koneksi latensi tinggi, ini akan membuat pemain lain tampak tertinggal, tetapi memastikan bahwa keadaan permainan yang lebih penting dari "yang telah melewati rintangan ini" konsisten untuk kedua pemain.

Anko
sumber
Terima kasih untuk balasan Anda. Kami telah mencoba solusi potensial yang telah Anda usulkan tetapi tidak menemukannya layak karena alasan berikut: 1. Alasan pertama adalah kecepatan tinggi permainan saya. Untuk menutup jendela 200ms saya harus memperlambat pemutar jarak jauh ke 1 / 4th kecepatan yang menyebabkan anomali visual yang sangat tidak menyenangkan dan terlihat khususnya dalam kasus di mana pemain di mana berjalan berdampingan. 2.Sejak latensi berfluktuasi, Sangat sulit untuk menghitung pengurangan kecepatan untuk pemain jarak jauh yang akan menjamin bahwa pesan akan tiba sebelum melintasi rintangan.
Zohaib Javed
2
@ZahaibJaved Seringkali satu-satunya solusi nyata adalah menyembunyikan latensi melalui animasi. Alih-alih melambat ketika mereka datang ke rintangan, pertimbangkan untuk berhenti sepenuhnya di tepi dan melakukan animasi "bersiap-siap untuk melompat" yang membutuhkan waktu satu detik penuh untuk bermain. Setelah paket "apakah mereka berhasil" datang, lakukan lompatan aktual dan lerp maju ke posisi sebenarnya.
BlueRaja - Danny Pflughoeft
Maaf atas balasan yang tertunda. Jadi solusi yang saya terapkan adalah di awal cutscene dimainkan di mana semua pemain dapat dilihat. Pemain lokal selalu di posisi pertama. Setelah cutscene selesai. Saya hanya memindahkan semua pemain jarak jauh di belakang sehingga mereka dapat memiliki waktu untuk menerima informasi bahwa pemain lokal meninggal karena hambatan tertentu atau meluncur atau melompat dengan benar di jalan. Dan pada akhirnya ada jalan lurus di mana saya hanya menyinkronkan pemain lagi. Sehingga hasilnya ditampilkan dengan benar.
Zohaib Javed
4

Untuk melengkapi jawaban Anko, Anda dapat mengubah sedikit desain game Anda dengan menambahkan konsekuensi dari rintangan yang gagal setelah kegagalan, misalnya, hasil lompatan yang gagal mendarat di genangan lumpur yang mendiskualifikasi pemain. Dengan cara ini pemain lain memperhatikan kegagalan dengan melihat yang lain jatuh dalam lumpur, sementara pemain yang gagal melihatnya segera.

Berikut ini adalah posting blog yang bagus tentang masalah ini (bukan yang baru-baru ini tetapi cukup menarik): Manajemen Waktu dan Sinkronisasi Darrin West .

Vaillancourt
sumber
1

Apakah penting bagi pemain lokal untuk mengetahui posisi pasti dari kematian pemain jarak jauh? Katakanlah pemain jarak jauh tidak bisa melompati salah satu hambatan Anda, dan karenanya mati.

Pemain yang mati akan melihat kematian mereka segera, dan akan melanjutkan dari lokasi kecelakaan. Tidak ada yang ajaib di sini.

Pemain lokal (yang masih hidup dan menendang) akan melihat pemain jarak jauh berhasil melewati rintangan. Pemberitahuan kematian akan masuk. Pemain jarak jauh akan tersandung pada kaki mereka, jatuh, dan perlahan-lahan menghilang. Lain kali Anda tahu posisi pemain jarak jauh, pemain akan menghilang ke posisi tepat itu, berjalan normal kembali. Dalam pengaturan seperti itu, pemain akan menyadari latensi, tetapi latensi akan direpresentasikan sebagai elemen permainan (tersandung ke bawah) daripada pemain yang dengan tiba-tiba muncul dan menghilang.

Jika kecepatan kedua pemain konstan, lintasan lari sudah ditentukan sebelumnya, dan waktu yang diperlukan untuk pulih dari jatuh diketahui, Anda bisa menghilangkan bagian yang memudar / menghilang sepenuhnya. Bayangkan seorang pemain jarak jauh sekarat di salah satu rintangan. Representasi lokalnya masih berjalan ketika pemberitahuan masuk. Pemain ditampilkan tersandung segera. Butuh waktu bagi mereka untuk bangun dan mulai berlari lagi. Sebenarnya, dibutuhkan banyak waktu seolah-olah mereka terlihat sekarat di rintangan. Dengan demikian, ketika mereka berdiri dan berjalan lagi, posisi lokal dan jarak jauh disinkronkan.


sumber