Mengirim status perbedaan (delta) dan koneksi yang tidak dapat diandalkan


8

Kami sedang membangun game multipemain waktu nyata, di mana setiap pemain bertanggung jawab untuk melaporkan kondisinya pada setiap iterasi dari loop game.

Pembaruan negara disiarkan menggunakan UDP yang tidak dapat diandalkan .

Untuk meminimalkan pengiriman data negara, kami membuat sistem yang hanya akan mengirim delta (data status apa pun yang diubah).

Namun metode ini cacat, karena paket yang hilang akan berarti bahwa pemain lain tidak akan menerima delta, membuat permainan berperilaku dengan cara yang tidak terduga.

Sebagai contoh:

Asumsikan bahwa keadaan terdiri dari: {positionX, positionY, health}

Frame 1  - positionX changed --> send a packet with positionX only.
Frame 2 - health changed // lost !
Frame 3 - positionY changed --> send a packet with positionY only.

// Pemain lain tidak tahu tentang perubahan kesehatan.

Bagaimana cara mengatasi masalah ini? mengirim seluruh data tidak selalu layak.

Jawaban:


7

Meskipun Anda mengirim data menggunakan UDP, Anda masih perlu menambahkan dalam bentuk keandalan Anda sendiri untuk menangani situasi seperti ini. UDP hanya memberi Anda fleksibilitas untuk melakukan apa yang Anda inginkan, daripada berurusan dengan format komunikasi TCP yang dapat diandalkan tetapi kurang fleksibel. Pesan konfirmasi, atau paket pengakuan semacam harus digunakan ketika penerimaan informasi diperlukan, jika klien Anda tidak memiliki cara untuk mengetahui apakah data yang dikirim perlu dikirim ulang. Misalnya, jika Anda mengirim informasi penting, dan tidak melihat respons dalam jangka waktu tertentu yang mengonfirmasi penerimaan data itu, kirim ulang.


2
Kalahkan aku untuk itu. Namun, harus dicatat bahwa nilai yang cukup volatile, seperti posisi dan data fisika lainnya, tidak perlu dijamin. Bahkan jika kebetulan ada yang salah pada frame yang diberikan, bagaimanapun juga akan diperbaiki frame berikutnya.
jmegaffin

1
Poin bagus, ini paling sering terlihat dalam permainan ketika tiba-tiba sebuah karakter bergerak ke lokasi baru dengan sangat cepat (atau teleport bersama-sama di sana). Sebagian besar permainan menanganinya dengan beberapa cara berbeda, tetapi tujuannya sama. Server hanya memperbarui posisi entitas, dan klien Anda segera memperbarui, atau memperbaruinya dengan waktu delta yang sangat tinggi selama beberapa frame.
Evan

3

Anda juga dapat mengatasi masalah dengan mengirim pembaruan status penuh dari server ke klien, katakan setiap detik. Jika klien tidak menerima paket, itu akan berperilaku salah sampai menerima pembaruan keadaan penuh. Kemudian akan disinkronkan lagi.


3

Banyak game menggunakan UDP dan TCP / IP untuk mengirim / menerima data dan tergantung pada seberapa sering data dikirim, protokol yang berbeda digunakan.

Sebagai contoh:

UDP: pembaruan posisi, dan hal lain yang berpotensi dikirim / diterima beberapa kali per detik.

TCP / IP: tindakan inventaris, tindakan mantra / kemampuan, (sebagian besar tindakan yang dilakukan pengguna)

Itu benar-benar tergantung pada jumlah lalu lintas dari setiap item. Jika Anda menemukan Anda mengirim pembaruan HP cukup sering maka mungkin mereka perlu berada di UDP.


1
TCP umumnya tidak digunakan untuk apa pun yang membutuhkan ketepatan waktu nyata karena kemampuannya untuk menyebabkan lonjakan jeda besar.
TheNickmaster21

Baik jika Anda ingin memastikan bahwa paket Anda sampai di sana. Hal-hal seperti pembaruan posisi tidak baik untuk itu tetapi jika Anda ingin memastikan pengguna menekan tombol pada waktu tertentu TCP menangani semua pengecekan kesalahan dan hal-hal lain yang harus Anda terapkan untuk UDP untuk menghindari kehilangan paket.
UnderscoreZero

Poin yang valid; Saya lebih suka memodifikasi UDP.
TheNickmaster21

1

Jika Anda membaca ulasan kode sumber Quake 3 , ia menjelaskan model jaringan yang sangat mirip dengan desain Anda, tetapi dengan solusi untuk paket yang dijatuhkan.

Pada dasarnya, dalam model Anda, Anda mengirim delta ke kondisi yang sebelumnya langsung. Dalam model quake3, Anda mengirim delta terhadap kondisi acknolwedged terakhir dari rekan.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.