Abaikan responsif. Pada LAN, ping tidak signifikan. Di internet, 60-100ms pulang pergi adalah berkah. Berdoalah kepada para dewa lag agar Anda tidak mendapatkan paku> 3K. Perangkat lunak Anda harus dijalankan dengan jumlah pembaruan / detik yang sangat rendah untuk ini menjadi masalah. Jika Anda memotret selama 25 pembaruan / detik, maka Anda memiliki waktu maksimum 40ms antara saat Anda menerima paket dan menindaklanjutinya. Dan itu adalah kasus single-threaded ...
Rancang sistem Anda untuk fleksibilitas dan kebenaran. Inilah ide saya tentang cara menghubungkan subsistem jaringan ke dalam kode permainan: Pesan. Solusi untuk banyak masalah bisa berupa "pesan". Saya pikir pesan menyembuhkan kanker pada tikus lab sekali. Pesan menghemat saya $ 200 atau lebih pada asuransi mobil saya. Namun serius, olahpesan mungkin merupakan cara terbaik untuk melampirkan subsistem apa pun ke kode game sambil tetap mempertahankan dua subsistem independen.
Gunakan olahpesan untuk komunikasi apa pun antara subsistem jaringan dan mesin game, dan untuk hal tersebut di antara dua subsistem. Olahpesan antar subsistem bisa sesederhana gumpalan data yang dilewatkan oleh pointer menggunakan std :: list.
Cukup minta antrian pesan keluar dan referensi ke mesin game di subsistem jaringan. Gim ini dapat membuang pesan yang ingin dikirim ke antrian keluar dan mengirimnya secara otomatis, atau mungkin ketika beberapa fungsi seperti "flushMessages ()" dipanggil. Jika mesin permainan memiliki satu antrian pesan bersama yang besar, maka semua subsistem yang diperlukan untuk mengirim pesan (logika, AI, fisika, jaringan, dll.) Semua dapat membuang pesan ke dalamnya di mana lingkaran permainan utama kemudian dapat membaca semua pesan dan kemudian bertindak sesuai.
Saya akan mengatakan bahwa menjalankan soket pada utas lain baik-baik saja, meskipun tidak diperlukan. Satu-satunya masalah dengan desain ini adalah bahwa umumnya asynchronous (Anda tidak tahu persis kapan paket sedang dikirim) dan yang dapat membuatnya sulit untuk debug dan membuat masalah terkait waktu muncul / hilang secara acak. Namun, jika dilakukan dengan benar, tak satu pun dari ini harus menjadi masalah.
Dari level yang lebih tinggi, saya akan mengatakan jaringan yang terpisah dari mesin game itu sendiri. Mesin game tidak peduli tentang soket atau penyangga, ia peduli tentang acara. Peristiwa adalah hal-hal seperti "Pemain X melepaskan tembakan" "Sebuah ledakan di game T terjadi". Ini dapat ditafsirkan oleh mesin game secara langsung. Di mana mereka dihasilkan (skrip, tindakan klien, pemain AI, dll) tidak masalah.
Jika Anda memperlakukan subsistem jaringan Anda sebagai sarana untuk mengirim / menerima acara, maka Anda mendapatkan sejumlah keuntungan dari sekadar memanggil recv () pada soket.
Anda dapat mengoptimalkan bandwidth, misalnya, dengan mengambil 50 pesan kecil (panjang 1-32 byte) dan membuat subsistem jaringan mengemasnya menjadi satu paket besar dan mengirimkannya. Mungkin itu bisa menekan mereka sebelum mengirim jika itu masalah besar. Di sisi lain, kode tersebut dapat mengompres / membongkar paket besar menjadi 50 peristiwa terpisah lagi untuk dibaca oleh mesin game. Ini semua bisa terjadi secara transparan.
Hal-hal keren lainnya termasuk mode permainan pemain tunggal yang menggunakan kembali kode jaringan Anda dengan memiliki klien murni + server murni yang berjalan di mesin yang sama berkomunikasi melalui pesan dalam ruang memori bersama. Kemudian, jika gim pemain tunggal Anda beroperasi dengan benar, klien jarak jauh (yaitu multiplayer sejati) juga akan beroperasi. Selain itu, itu memaksa Anda untuk mempertimbangkan terlebih dahulu data apa yang dibutuhkan oleh klien karena permainan pemain tunggal Anda akan terlihat benar atau benar-benar salah. Padu dan padu, jalankan server DAN menjadi klien dalam game multi pemain - semuanya bekerja dengan mudah.