Đừng chỉ chấp nhận một câu trả lời thẳng thắn "có hoặc không vì tôi đã nói như vậy" vì bạn có thể tự mở ra để phải chiến đấu với hàng loạt vấn đề với UDP mà thực sự bạn không cần phải đối mặt.
Không có câu trả lời nào khác ở đây nêu cách rõ ràng để chứng minh điều này.
Lấy một số sự thật đơn giản
- Một tiêu đề IP là 20 byte cho dù bạn sử dụng giao thức nào.
- Các tiêu đề UDP là 4 byte
- Tiêu đề TCP là 20 byte
Vì vậy, mỗi lần bạn gửi tin nhắn 1 byte xuống dòng bạn thực sự đã gửi 25 hoặc 41 byte tùy thuộc vào giao thức giả sử tiêu đề IP cũng cần thiết.
nguồn:
Lời khuyên của tôi
Hãy xem tình huống của bạn khi bạn cần tương tác máy chủ của khách hàng, ước tính số lượng khách hàng sau đó thực hiện phép toán dựa trên dữ liệu bạn thực sự gửi giữa 2 người.
Một ví dụ
Hãy nói rằng tôi gửi 10 tin nhắn mỗi byte 1 bản cập nhật trong trò chơi của mình và tôi đang cập nhật khoảng 60 khung hình / giây vì vậy tôi cần gửi 60 * 10 = 600 byte mỗi giây dữ liệu tin nhắn thực tế + các tiêu đề có liên quan.
Bây giờ tùy thuộc vào trò chơi, tôi có thể gửi tất cả dưới dạng một tin nhắn để chi phí của tôi từ lớp TCP chỉ là 40 byte (chi phí hiệu quả trên UDP là 20 byte mỗi giây), không có chi phí đó là chi phí tiềm năng là 600 byte ( bởi vì tôi có thể phải gửi lại toàn bộ dòng tin nhắn).
Tuy nhiên, điều cực kỳ quan trọng là mọi tin nhắn đều được gửi ngay lập tức, ngay lập tức nó sẵn sàng được gửi, tôi có 600 tin nhắn (cũng là 600 byte) + 40 * 600 = 24k tổng phí TCP hoặc ~ 14k chi phí UDP mỗi giây + 600 byte dữ liệu tin nhắn.
Một lần nữa, chúng tôi đặt câu hỏi, những thông điệp đó quan trọng như thế nào, mức độ thường xuyên của chúng và chúng có thể được xử lý theo cách nào đó để giảm chi phí không?
Điều đó chỉ dựa trên một loạt các thông điệp byte đơn, thông thường bạn sẽ làm một cái gì đó rất khác nhưng không biết dữ liệu thô được gửi đi khó chứng minh bằng cách nào nếu TCP phù hợp hơn với tình huống của bạn so với UDP.
Vì vậy, nó sẽ làm việc?
Chà, nếu bạn có một khung hình / giây điển hình và vị trí rất quan trọng (để tránh các quyết định gian lận hoặc không chính xác), bạn cần biết rằng luồng mạng của bạn là có thể thực hiện được, nhưng 32 người chơi mỗi luồng phát trực tiếp 24k + byte tin nhắn (vì vậy 768KB / s + tin nhắn) ... đó là khoảng 10mb / s băng thông rộng chỉ dành cho các tiêu đề riêng lẻ dựa trên việc gửi ít nhất 1 tin nhắn trên mỗi khung hình từ mỗi máy khách đến tất cả các máy khách khác thông qua máy chủ.
Bạn rõ ràng sẽ không mã hóa máy chủ và máy khách của mình để hoạt động theo cách đó và kích thước thư rất có thể lớn hơn rất nhiều và có thể ít hơn 1 byte mỗi khung hình trong hầu hết các tình huống nên khó có thể nói rằng không nhìn thấy thế giới thực "Đây là dữ liệu tôi cần gửi" ví dụ.
Trường hợp của tôi
Tôi đã thực hiện cuộc gọi trong trường hợp của mình rằng đó là một chi phí hợp lý nhưng điều đó dựa trên cách tôi xây dựng các luồng thông điệp của mình để tôi không có chi phí quá lớn so với một số thiết kế.
TCP hoạt động tốt và tôi có khung máy chủ và máy khách MMO có thể mở rộng nhưng tôi không cần truyền nhiều dữ liệu từng khung hoặc nhiều gói nhỏ vì tôi có thể thực hiện các cuộc gọi của mình.
đối với những người khác: TCP sẽ không làm và họ chỉ có thể sử dụng UDP nhưng phải chấp nhận rằng họ sẽ không đảm bảo cho họ về những gì họ nhận được (đảm bảo đặt hàng / đến).
Những ý kiến khác
Nhiều công cụ trò chơi được mã hóa kém xử lý mọi thứ trên luồng chính trên cpu, vì vậy cpu thường chỉ dành một lượng thời gian rất nhỏ để xử lý mã mạng, việc triển khai tốt cả phục vụ và máy khách sẽ hoàn toàn không đồng bộ và có thể đẩy và kéo tin nhắn theo đợt.
Có một số thư viện mạng tốt ngoài kia nhưng như đã thấy ở đây, nhiều người dường như có ý kiến rằng UDP "tốt hơn", yếu tố chính trong nhu cầu của bạn trước tiên và đó có thể không phải là trường hợp đó, và tìm một thư viện không yếu tố trong cách bạn làm có thể dẫn đến thiết lập TCP được mã hóa kém so với biến thể UDP trong cùng một lib (tôi chỉ nói rằng tôi đã thấy điều này và các thử nghiệm tải đã chứng minh điều đó).
Xây dựng một cái gì đó trước tiên là một cơ sở kỹ thuật của dữ liệu bạn muốn gửi và kiểm tra nó sau đó thực hiện phép toán để mở rộng nó, trường hợp tải nặng nhất kiểm tra nó bằng cách triển khai lên một đám mây và có 50 máy tính chạy máy khách thử nghiệm để xem liệu nó có thể xử lý không giới hạn của bạn là 32 người chơi mỗi trò chơi (hoặc bất kỳ giới hạn nào bạn có thể có).