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.
sumber
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.
sumber
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.
sumber
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.
sumber