Kembali pada hari itu, koneksi TCP melalui dialup / ISDN / broadband lambat menghasilkan permainan yang berombak dan lamban karena satu paket yang dijatuhkan menghasilkan sebuah sinkronisasi ulang. Itu berarti banyak pengembang game harus menerapkan lapisan keandalan mereka sendiri di atas UDP, atau mereka menggunakan UDP untuk pesan yang dapat dijatuhkan atau diterima rusak, dan menggunakan koneksi TCP paralel untuk informasi yang harus dapat diandalkan.
Mengingat rata-rata pengguna memiliki koneksi jaringan yang lebih cepat sekarang, dapatkah game waktu nyata seperti FPS memberikan kinerja yang baik melalui koneksi TCP?
networking
kevin42
sumber
sumber
Jawaban:
Saya akan mengatakan tidak. Informasi spasial objek game harus secepat mungkin, dan untuk itu lebih baik menggunakan UDP, karena keandalannya tidak 100% penting. Bahkan pada koneksi modern, UDP masih cukup lambat sehingga Anda harus membuat beberapa pertimbangan khusus untuk interpolasi dan semacamnya. Bahkan hanya dalam hal jumlah data yang ditransfer, TCP akan menambah overhead yang signifikan untuk ini.
Namun, TCP sangat dapat diterima untuk hal-hal non-realtime, seperti negosiasi multipemain, pesan obrolan, pembaruan skor, dll.
sumber
Karena Flash tidak mendukung UDP, dengan melihat game Flash multi-pemain Anda bisa mendapatkan ide bagus tentang apa yang mungkin terjadi dengan TCP / IP dan apa yang tidak. Pada dasarnya Anda dapat membuat game waktu nyata, asalkan tidak bergantung pada waktu respons yang sangat cepat. Beberapa contoh:
http://www.xgenstudios.com/play/stickarena
http://everybodyedits.com/
Jika Anda memiliki pilihan untuk menggunakan UDP, Anda benar-benar harus melakukannya, tetapi dengan Flash Anda sayangnya tidak mendapatkan opsi itu.
sumber
Tergantung.
Gim seperti World of Warcraft menggunakan TCP untuk komunikasi mereka, karena Anda dapat menghindari banyak masalah dengan menggunakannya. Mungkin ada ping yang lebih tinggi sebagai hasilnya, tetapi untuk banyak game, ini dapat diterima. Anda perlu melakukan interpolasi spasial bahkan ketika Anda menggunakan UDP sebagai protokol Anda.
sumber
Jika arsitektur klien / server Anda bersih, lapisan transport (hampir) tidak masalah.
TCP memiliki beberapa kelemahan, tetapi ini mudah disalahgunakan.
Jadi ya, hanya TCP dan otak yang Anda butuhkan.
Dengan pengaturan jaringan yang umum (proksi, firewall, dll.) Hari ini UDP sangat tidak berguna untuk semua kecuali game lokal (baca: LAN).
sumber
Sangat bisa diterima menggunakan TCP alih-alih UDP - jika Anda mematikan algoritma Nagle .
Setelah Anda mematikan Nagle, Anda memiliki sebagian besar kecepatan UDP dan akan sepenuhnya dapat membuat permainan reaksi kedutan . Memang, saya telah membuat game seperti itu menggunakan TCP di Flash:
http://2dspacemmo.wildbunny.co.uk
Semoga itu bisa membantu!
sumber
Untuk game FPS kami selalu menggunakan UDP. Terutama jika Anda melakukan penembak kedutan di mana ping masalah.
sumber
Itu tergantung pada jenis permainannya.
Beberapa game seperti RTS, bermain jauh lebih baik dari TCP dan biasanya menggunakan TCP setiap saat.
Masalah sebenarnya dengan TCP adalah bahwa jika Anda mendapatkan paket loss - bahkan dalam jumlah kecil - maka koneksi "terhenti" sampai pengiriman ulang terjadi. OS tidak dapat mengirimkan data yang tidak sesuai pesanan ke aplikasi (ini melanggar jaminan TCP, tetapi juga, TCP tidak menunjukkan batas-batas bingkai aplikasi). Kios koneksi berarti bahwa data yang terlambat tiba. Tetapi dalam game (mis.) FPS, data yang ketinggalan zaman tidak berguna.
Dengan UDP, aplikasi dapat memilih apa yang dilakukan dengan data yang terlambat atau rusak. Itu bisa (dan untuk game seperti FPS, biasanya) mengabaikan data lama dan hanya mengambil yang terbaru. Paket yang hilang sesekali tidak menunda paket selanjutnya sama sekali. Jika paket tertunda akhirnya tiba, itu bisa diabaikan oleh permainan.
sumber
Jangan hanya menerima jawaban langsung "ya atau tidak karena saya bilang begitu" ketik di sini karena Anda mungkin membuka diri untuk harus berjuang menghadapi banyak masalah dengan UDP yang sebenarnya tidak perlu Anda hadapi.
Tidak ada jawaban lain di sini yang menyatakan cara yang jelas untuk membuktikan ini.
Ambil beberapa fakta sederhana
Jadi, setiap kali Anda mengirim pesan 1 byte ke bawah, Anda sebenarnya telah mengirim 25 atau 41 byte tergantung protokol yang mengasumsikan header IP juga diperlukan.
sumber:
Saranku
Ambil situasi Anda saat Anda membutuhkan interaksi server klien, perkirakan jumlah klien lalu lakukan perhitungan berdasarkan data yang benar-benar Anda kirim di antara keduanya.
Sebuah contoh
Katakanlah saya mengirim 10 pesan yang masing-masing 1 byte per pembaruan di game saya dan saya memperbarui sekitar 60 fps jadi saya perlu mengirim 60 * 10 = 600 byte per detik data pesan aktual + header yang relevan.
Sekarang tergantung pada permainan saya bisa mengirim itu semua sebagai satu pesan sehingga overhead saya dari lapisan TCP hanya 40 byte (efektif biaya lebih dari UDP 20 byte per detik), tidak memiliki overhead itu adalah potensi biaya 600 byte ( karena saya mungkin harus mengirim ulang seluruh aliran pesan).
Namun jika sangat penting bahwa setiap pesan dikirim dengan sendirinya begitu siap untuk dikirim, saya memiliki 600 pesan (juga 600 byte) + 40 * 600 = 24k senilai overhead TCP atau ~ 14r overhead UDP per detik + 600 byte data pesan.
Sekali lagi, kami mengajukan pertanyaan, seberapa pentingkah pesan-pesan itu, seberapa sering pesan-pesan itu, dan dapatkah mereka dikumpulkan sedemikian rupa untuk mengurangi biaya overhead?
Itu hanya berdasarkan pada sekelompok pesan byte tunggal, biasanya Anda akan melakukan sesuatu yang sangat berbeda tetapi tanpa mengetahui data mentah yang dikirim sulit untuk membuktikan cara baik jika TCP lebih cocok untuk situasi Anda daripada UDP.
Jadi, apakah ini akan berhasil?
Nah, jika Anda memiliki fps yang khas, dan posisinya penting (untuk menghindari kecurangan atau keputusan yang salah), Anda perlu tahu bahwa aliran jaringan Anda dapat diterima, tetapi masing-masing 32 pemain streaming yang 24k + byte pesan bolak-balik (jadi 768KB / s + messages) ... sekitar 10mb / s jalur broadband hanya untuk header individu berdasarkan pengiriman setidaknya 1 pesan per frame dari setiap klien ke semua klien lain melalui server.
Anda jelas tidak akan membuat kode server dan klien Anda untuk bekerja seperti itu dan ukuran pesan sangat mungkin jauh lebih besar dan mungkin sedikit lebih jarang dari 1 byte per frame dalam kebanyakan situasi sehingga sulit untuk mengatakan tanpa melihat dunia nyata "ini adalah data yang perlu saya kirim" contoh.
Kasus saya
Saya telah membuat panggilan dalam kasus saya bahwa itu adalah overhead yang masuk akal tapi itu didasarkan pada bagaimana saya membangun aliran pesan saya jadi saya tidak memiliki biaya besar dibandingkan dengan beberapa desain.
TCP berfungsi dengan baik dan saya memiliki server MMO skala besar dan kerangka kerja klien tetapi saya tidak perlu melakukan streaming banyak data yang pernah membingkai atau banyak paket kecil karena saya dapat melakukan batch panggilan saya.
untuk yang lain: TCP tidak akan berfungsi, dan mereka hanya dapat menggunakan UDP tetapi harus menerima bahwa itu tidak akan memberi mereka jaminan tentang apa yang mereka dapatkan (jaminan pemesanan / kedatangan).
Pertimbangan lainnya
Banyak mesin gim yang memiliki kode buruk menangani semua yang ada di utas utama pada cpu sehingga cpu sering kali hanya diberi waktu yang sangat sedikit untuk menangani kode jaringan, implementasi yang layak baik dari servis dan klien akan sepenuhnya async dan mungkin mendorong dan tarik pesan dalam batch.
Ada beberapa perpustakaan jaringan yang bagus di luar sana, tetapi seperti yang terlihat di sini, banyak yang tampaknya berpendapat bahwa UDP "lebih baik", faktor pertama dalam kebutuhan Anda terlebih dahulu dan mungkin tidak demikian, dan menemukan perpustakaan yang tidak Faktor dalam hal-hal seperti yang Anda lakukan dapat mengakibatkan pengaturan TCP yang berkode buruk dibandingkan dengan varian UDP di lib yang sama (saya hanya mengatakan saya telah melihat ini, dan tes beban telah membuktikannya).
Bangun sesuatu pertama-tama basis teknis dari data yang ingin Anda kirimkan dan ujilah kemudian lakukan perhitungan untuk meningkatkannya, uji beban kasus terburuk dengan mengerahkan ke cloud dan minta 50 komputer menjalankan klien pengujian untuk melihat apakah ia dapat menangani batas Anda 32 pemain per game (atau batas apa pun yang mungkin Anda miliki).
sumber
Saya tidak berpikir begitu ... Game di mana transfer data sangat sering (saat mouse bergerak atau tombol turun), harus menggunakan UDP. Ini akan tertinggal bahkan di LAN jika TCP digunakan.
sumber