Dasar-dasar permainan multi-pemain online [tertutup]

9

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?

Lowip
sumber
@JoshPetrie pertanyaan ini sah "Pertanyaan utama adalah bagaimana cara mengatur jaringan saya?". Ini bukan tentang haruskah saya menggunakan ini atau itu. OP menggunakan satu dan membutuhkan saran tentang menambahkan teknologi lain yang sudah ia pilih. Ini luas karena jawabannya tidak terletak di mana teknologi harus digunakan tetapi dalam bagaimana perangkat lunak dapat disusun untuk menghindari kembung, mengurangi kelambatan dan meningkatkan keandalan secara independen dari teknologi yang mendasarinya.
Coyote
Itu juga terlalu luas. Pertanyaannya harus diedit (jangan ragu untuk melakukannya, itu sudah cukup lama) untuk menjadi lebih pada topik, maka dapat dibuka kembali.

Jawaban:

6

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

Randolf Richardson
sumber
1
Pertanyaan awal menyebutkan model klien-server, sehingga "situs" yang memblokir semua UDP tidak relevan; itu adalah masalah klien, dan saya ragu banyak klien benar-benar memblokir semua UDP. "Menggunakan TCP adalah kesalahan terburuk yang bisa Anda buat ketika mengembangkan game jaringan! Untuk memahami alasannya, Anda perlu melihat apa yang sebenarnya dilakukan TCP di atas IP untuk membuat semuanya terlihat begitu sederhana!" Lihat gafferongames.com/networking-for-game-programmers/udp-vs-tcp
memang005
@ memang005: Ada pro dan kontra untuk ini - UDP pasti memberikan keunggulan kinerja, tetapi dengan biaya keandalan (di situlah TCP memiliki keunggulan). Adapun pemblokiran UDP, Anda benar tentang itu menjadi masalah klien, tetapi di banyak lingkungan perusahaan dan pendidikan saya mengalami UDP (kecuali untuk port 53) diblokir oleh admin yang tidak mengerti yang menganggap UDP adalah masalah keamanan, dan jadi opsi bagi klien untuk mundur ke TCP setidaknya dapat berarti bahwa pemain dapat mengalami permainan (terutama jika bandwidth jaringan cukup cepat).
Randolf Richardson
@ memang005: Juga, menggunakan campuran UDP dan TCP juga dapat diterima karena TCP dapat digunakan untuk transfer data prioritas rendah, sementara UDP dapat digunakan untuk sisi tindakan kecepatan tinggi. Yang menarik untuk dicatat juga adalah bahwa dengan IPv6 ada opsi baru yang tersedia (yang tidak tersedia dengan IPv4) yang dapat memenuhi kebutuhan game real-time sementara tidak bersifat tanpa koneksi, tapi saya pikir akan memerlukan waktu sebelum IPv6 dapat digunakan oleh game tanpa harus bergantung pada IPv4 (ini sangat disayangkan, jadi kami puas dengan IPv4 sebaik mungkin untuk saat ini).
Randolf Richardson