Saat ini saya sedang mengerjakan game multiplayer ac # online secara real-time. Tujuannya adalah untuk memiliki koneksi berbasis klien / server menggunakan protokol UDP. Sejauh ini saya telah menggunakan UDP untuk pergerakan pemain dan TCP untuk acara (penembakan pemain, kehilangan nyawa pemain) karena saya perlu memastikan data tersebut akan sampai ke semua pemain yang terhubung ke server. Saya tahu bahwa UDP dikatakan 'tidak dapat diandalkan' dan beberapa paket mungkin hilang. Tapi saya sudah membaca di mana-mana untuk tidak pernah mencampur TCP dan UDP karena dapat mempengaruhi koneksi.
Pertanyaan utamanya adalah bagaimana cara mengatur jaringan saya?
UDP tidak terhubung, bagaimana saya harus menyelamatkan siapa itu siapa? Haruskah saya menyimpan alamat ip klien dalam daftar?
Haruskah saya menggunakan TCP untuk acara-acara penting atau menggunakan UDP? Jika saya perlu menggunakan UDP, bagaimana saya bisa memastikan bahwa data tidak akan hilang?
Dengan menggunakan TCP dan UDP, saya perlu menyimpan untuk setiap pemain IP mereka dalam daftar (untuk UDP) dan TcpClient yang terhubung dalam daftar lain (untuk UDP). Bagaimana saya bisa mengubahnya agar lebih efektif?
sumber
Jawaban:
UDP memiliki lebih sedikit overhead, tetapi dengan biaya kehilangan paket tanpa mengetahuinya (bagian dari overhead dengan TCP memastikan bahwa paket yang hilang dapat dikirim ulang).
Namun, masalah besar dengan menggunakan UDP adalah bahwa ada banyak situs yang memblokir semua lalu lintas UDP (kecuali untuk DNS) karena banyak administrator percaya itu adalah praktik keamanan yang baik.
Juga, jangan berasumsi bahwa setiap pemain Anda akan memiliki alamat IP yang berbeda - ada banyak situasi di mana banyak pengguna berbagi koneksi internet yang sama, dan jika anak-anak sekolah ketagihan pada permainan Anda, Anda dapat bertaruh bahwa mereka mungkin akan mencari cara menginstal dan menjalankannya selama kelas alih-alih melakukan pekerjaan mereka (dan bukankah Anda lebih suka bahwa mereka menghabiskan waktu yang berharga ini di gim Anda, bukan di tempat orang lain?).
Setelah aliran TCP Anda terbuka, itu masih cukup efisien. Langkah selanjutnya adalah meminimalkan jumlah data yang Anda kirim / terima, dan di sinilah desain protokol ikut berperan. Jika Anda hanya mengirim beberapa byte untuk setiap perintah (misalnya, "bergerak maju") alih-alih, misalnya, membungkus perintah yang sama dalam ratusan byte kode XML, maka keseluruhan konsumsi bandwidth jaringan Anda akan lebih rendah dan lebih sedikit siklus CPU akan diperlukan untuk memproses informasi (beberapa byte dengan mudah dibandingkan versus pembongkaran dan menafsirkan dan memeriksa sintaks sebagian besar XML).
Anda tentu dapat membuka beberapa aliran TCP dan menggunakannya untuk tujuan yang berbeda, seperti satu untuk perintah, yang lain untuk transfer grafik, yang lain untuk obrolan berbasis audio, dll. Dengan begitu, jika Anda mentransfer grafik besar yang membutuhkan 5-10 detik untuk diunduh, setidaknya gerakan perintah pemain tidak akan ketinggalan karena mereka akan berada di aliran yang berbeda (dan Anda dapat menampilkan sprite default hingga sprite baru selesai diunduh, yang selalu lebih menyenangkan daripada menunggu).
sumber
Ini bukan jawaban langsung untuk pertanyaan Anda, tetapi gafferongames memiliki beberapa artikel yang sangat bagus tentang permainan jaringan: http://gafferongames.com/networking-for-game-programmers/what-every-programmer-needs-to-know-about -game-networking /
sumber