Apakah protokol TCP cukup baik untuk game multipemain real-time?

57

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?

kevin42
sumber

Jawaban:

36

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.

Sean Edwards
sumber
7
Sean cukup banyak uang. Jika, secara kebetulan, Anda sedang mengembangkan game di C # /. NET (Anda tahu Anda mau!), Saya telah menemukan Perpustakaan Jaringan Lidgren ( code.google.com/p/lidgren-library-network ) sebagai perangkat yang cantik pilihan bagus. Bahkan menyediakan pesan, pesan yang dapat diandalkan melalui UDP, jika Anda membutuhkannya.
Mike Strobel
2
Tidak bijaksana untuk mencampur TCP dan UDP; sebagai hasil dari cara TCP melakukan kontrol aliran, itu dapat menyebabkan hilangnya paket. (sumber: isoc.org/INET97/proceedings/F3/F3_1.HTM )
Jason Kozak
4
Penting juga untuk diingat bahwa dalam beberapa kasus pengguna akhir Anda akan duduk di belakang ISP yang memblokir lalu lintas UDP, memiliki pengaturan router yang mencegah lalu lintas UDP, atau sebaliknya berada dalam situasi di mana penggunaan UDP kurang dari ideal. Jika demikian, jika game Anda dapat mendukungnya, kemampuan untuk kembali ke komunikasi TCP cukup praktis.
Charles Ellis
titik + lain untuk UD adalah bahwa paketnya berorientasi secara alami, Anda harus meniru ini dalam TCP jika diperlukan (boilderplatecode), sayangnya protokol yang lebih modern tidak didukung oleh windows (ini menyebalkan)
Quonux
11

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.

Iain
sumber
8

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.

Christopher
sumber
1
Bukan hanya ping. Ada alasan mengapa tidak ada tabrakan pemain-pemain di WoW. Akan terlalu sulit untuk melakukannya dengan baik. WoW dapat menggunakan TCP karena di mana Anda berdiri tidak masalah. Menargetkan dan menyerang tidak tergantung pada posisi nyata dari monster atau pemain musuh. Jika Anda peduli tentang hal-hal ini, maka TCP akan merusak pengalaman bermain.
Nuoji
6

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

Andreas
sumber
7
Jika Anda downvote, silakan tinggalkan komentar mengapa. Kami menggunakan TCP dan tidak pernah memiliki satu masalah dengannya.
Andreas
3
Saya gagal melihat relevansi pengaturan jaringan yang umum dalam hal ini. Firewall pada umumnya mengganggu server hosting saja, tetapi bahkan terlepas dari protokol, sedangkan proxy sebenarnya meningkatkan risiko paket tertunda atau jatuh, membuat UDP jauh lebih berguna daripada di jaringan lokal. Kelemahan UDP sebagian besar dapat diatasi dengan melakukan pemeriksaan integritas sendiri, tetapi Anda tidak dapat mengambil fitur dari TCP untuk membuatnya lebih cepat.
Marcks Thomas
1
Anda perlu menyebutkan Nagles . Saya selalu lupa bahwa akar penyebab mengapa TCP itu jahat (paket buffer Nagle di client / server, pada dasarnya "menahan" mereka dari gim Anda dan memperkenalkan penundaan tambahan).
bobobobo
Ada beberapa alasan mengapa Anda harus menggunakan UDP bukan TCP jika latensi menjadi masalah. Jika Anda tidak peduli tentang latensi dan / atau Anda dapat melakukan prediksi sisi klien yang cukup, maka TCP bisa cukup. Dalam hal game waktu nyata. Lupakan TCP.
Nuoji
6

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!

kelinci liar
sumber
Aplikasi non-operasional di tautan Anda, Pak.
Insinyur
Tautan benar-benar diputar, Pak. Saya mendapatkan tes server Apache.
Gustavo Maciel
4

Untuk game FPS kami selalu menggunakan UDP. Terutama jika Anda melakukan penembak kedutan di mana ping masalah.

Corv1nus
sumber
4

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.

MarkR
sumber
Perhatikan bahwa implementasi Anda harus menangani aspek membuang paket yang tertunda, karena UDP akan memperlakukannya sebagai datagram yang diterima.
Guvante
3

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

  • Header IP adalah 20 byte, apa pun protokol yang Anda gunakan.
  • Header UDP adalah 4 byte
  • Header TCP adalah 20 byte

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

Perang
sumber
2

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.

Shashwat
sumber