Apa cara terbaik untuk membuat cerita bersambung dan membatalkan tautan pesan jaringan untuk game multipemain C / C ++?

11

Kami menggunakan JSON sekarang dan ingin pindah ke format biner untuk beberapa jenis pesan antara klien dan server.

Haruskah saya membaca struct ke dalam soket? Gunakan buffer proticol / penghematan?

Bagaimana saya harus mewakili array data?

Seperti apa tampilan antarmuka untuk mengemas / membongkar data?

HaltingState
sumber

Jawaban:

12

Asumsi...

  1. Anda berbicara tentang konversi ke buffer byte
  2. Anda menggunakan UDP dan kinerja menjadi masalah

Cobalah untuk menghindari pemborosan ruang dalam paket Anda untuk menentukan struktur. IE mengirim, setidaknya, satu byte untuk menunjukkan jenis paket, lalu anggap saja setiap paket yang diterima mengikuti struktur yang telah ditentukan untuk jenis paket tersebut

Haruskah saya membaca struct ke dalam soket? Gunakan buffer proticol / penghematan?

  • Ya, baca keseluruhan struct JIKA Anda MEMBUTUHKAN seluruh struct
  • Tidak, buat struktur paket sendiri, Ini pasti akan lebih kecil dari serialisasi menggunakan metode ini; Anda harus tahu persis data apa yang harus dimasukkan paket

Bagaimana saya harus mewakili array data?

  • Sebagai array data. Saat menerima, lanjutkan membaca buffer hingga akhir data untuk menghindari pengiriman Hitungan elemen array

Seperti apa tampilan antarmuka untuk mengemas / membongkar data?

  • Anda dapat dengan mudah mengatur banyak metode untuk mengkonversi tipe dasar ke byte, dari sana membangun metode ini untuk mengkonversi tipe kustom juga. Secara spesifik tentang cara melakukan ini dapat ditemukan hampir di mana saja saya yakin (saya menggunakan C # secara pribadi)

Satu hal lagi, ukuran paket adalah kekhawatiran, terutama untuk snapshot: size = PacketSize x entitas x connectedPlayers; Jadi, Anda mungkin memiliki 60 x 10 x 16 = 9,600 byte per paket Kemudian mengirim ini 20 kali per detik: = 192.000 bps = 187 KBps. Ini jelas merupakan kecepatan unggah bandwidth tinggi. Dengan demikian kebutuhan untuk meminimalkan masing-masing faktor yang berkontribusi terhadap ukuran paket jika memungkinkan.

Artikel ini sangat membantu saya: Valve Multiplayer Networking

memang005
sumber
Artikel lain yang saya temukan saat membaca berbagai serialisasi objek dan pertanyaan networking di sini beberapa minggu lalu adalah ini salah satu yang menjelaskan bagaimana mesin Unreal melakukannya. Titik perbandingan yang bagus untuk sumber Valve.
Martin Foot
1
Metode array Anda tidak akan berfungsi dalam kasus umum - di mana 'akhir data'? Bahkan jika pesan Anda dibatasi, itu berarti Anda tidak dapat memiliki lebih dari 1 array per struct. Untuk memperbaikinya, poster asli dapat tetap berpegang pada larik panjang tetap, atau memastikan hanya ada 1 array per struct (di akhir struct), atau mengirim nilai hitungan pada awal array.
Kylotan
Hanya satu tip lagi: Ingatlah untuk memperlakukan endianess, ini bisa sangat mengganggu jika Anda tidak tahu bahwa hal seperti itu ada.
Poin bagus @Kylotan, setuju bahwa dalam kasus-kasus tertentu data tambahan ini tidak dapat dihindari; tetapi jika saya menemukan diri saya menambahkan beberapa array ke satu paket, saya akan mempertimbangkan untuk mengirim beberapa paket sebagai gantinya
memang005
1

Masalah ini telah dipecahkan oleh Google dan Facebook:

  1. Google's Protocol Buffer - Google adalah pengguna C ++ yang besar:

    Protokol Buffer adalah cara pengkodean data terstruktur dalam format yang efisien namun dapat diperluas. Google menggunakan Protokol Buffer untuk hampir semua protokol RPC internal dan format file.

  2. Apache Thrift (sebelumnya oleh Facebook):

    Thrift adalah kerangka kerja perangkat lunak untuk pengembangan layanan lintas-bahasa yang dapat diskalakan. Ini menggabungkan tumpukan perangkat lunak dengan mesin pembuatan kode untuk membangun layanan yang bekerja secara efisien dan mulus antara C ++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C #, Kakao, JavaScript, Node.js, Smalltalk, dan OCaml.

kutu buku yang dibayar
sumber
Protokol Google buffer terlalu lambat untuk game real-time skala besar. Namun saya menemukan mereka cukup bagus untuk membuat prototipe dan jumlah pemain yang lebih kecil karena versinya. Seperti biasa, profiler Anda akan menceritakan kisah nyata.
Patrick Hughes
Yah, mereka cukup baik untuk Google, dan Google skala cukup baik, dan mereka bekerja dengan baik ketika saya menggunakannya. Itu sebabnya saya merekomendasikan mereka.
nerd yang dibayar
Google tidak memerlukan kinerja waktu nyata. Google memang membutuhkan keandalan dan up-time, yang keduanya dilayani dengan baik oleh Protokol Buffer. Kompleksitas dari semua versi fallback dan pembuatan kode boilerplate menambah overhead dan ketika Anda mengirim dan menerima 1000 pembaruan pada interval 50-100msec, ia menambahkan. Profil sebuah buffer Protokol beberapa versi lama terhadap serializer berkode khusus untuk data yang ada. @ memang005 memiliki intinya.
Patrick Hughes
+1, karena walaupun format ini agak terlalu besar dan lambat untuk sebagian besar gim real-time atau bandwidth tinggi (karena mengandung informasi tambahan yang memungkinkan Anda merekonstruksi paket yang kompleks sewenang-wenang), itu tidak berarti bahwa mereka tidak berguna dalam beberapa permainan, mis. yang berbasis giliran. Jika mengoptimalkan setiap sumber daya tidak diperlukan maka format ini dapat menghemat banyak waktu, dan mereka tentu lebih efisien daripada JSON.
Kylotan