Thông tin cơ bản về trò chơi nhiều người chơi [đã đóng]


9

Tôi hiện đang làm việc trên trò chơi nhiều người chơi trực tuyến ac # trong thời gian thực. Mục đích là để có kết nối dựa trên máy khách / máy chủ sử dụng giao thức UDP. Cho đến nay tôi đã sử dụng UDP cho các chuyển động của người chơi và TCP cho các sự kiện (người chơi bắn súng, người chơi mất mạng) vì tôi cần chắc chắn dữ liệu đó sẽ đến tất cả người chơi được kết nối với máy chủ. Tôi biết rằng UDP được cho là 'không đáng tin cậy' và một số gói có thể bị mất. Nhưng tôi đã đọc ở khắp mọi nơi để không bao giờ trộn lẫn TCP và UDP vì nó có thể ảnh hưởng đến kết nối.

Câu hỏi chính là tôi nên tổ chức mạng lưới của mình như thế nào?

UDP không có kết nối, tôi nên cứu ai là ai? Tôi có nên lưu địa chỉ ip của khách hàng trong danh sách không?

Tôi nên sử dụng TCP cho các sự kiện quan trọng hoặc sử dụng UDP? Nếu tôi cần sử dụng UDP, làm thế nào tôi có thể chắc chắn rằng dữ liệu sẽ không bị mất?

Bằng cách sử dụng cả TCP và UDP, tôi cần lưu cho mỗi người chơi IP của họ trong danh sách (đối với UDP) và TcpClient được kết nối trong danh sách khác (đối với UDP). Làm thế nào tôi có thể thay đổi điều đó để có hiệu quả hơn?


@JoshPetrie câu hỏi này là hợp pháp "Câu hỏi chính là tôi nên tổ chức mạng của mình như thế nào?". Tôi không nên sử dụng cái này hay cái kia. OP sử dụng một và cần lời khuyên về việc thêm một công nghệ khác mà anh ta đã chọn. Đó là câu trả lời rộng rãi không nằm trong công nghệ nào nên được sử dụng mà là cách thức cấu trúc phần mềm để tránh làm phồng ống, giảm độ trễ và tăng độ tin cậy độc lập với công nghệ cơ bản.
Coyote

Nó cũng quá rộng. Câu hỏi nên được chỉnh sửa (cứ thoải mái làm như vậy, nó khá cũ) để có nhiều chủ đề hơn, sau đó nó có thể được mở lại.

Câu trả lời:


6

UDP có ít chi phí hoạt động hơn, nhưng với chi phí mất các gói mà không biết về nó (một phần của chi phí với TCP đảm bảo rằng các gói bị mất sẽ được gửi lại).

Tuy nhiên, vấn đề lớn khi sử dụng UDP là có nhiều trang web chặn tất cả lưu lượng truy cập UDP (ngoại trừ DNS) vì nhiều quản trị viên tin rằng đó là một thực tiễn bảo mật tốt.

Ngoài ra, đừng cho rằng mỗi người chơi của bạn sẽ có một địa chỉ IP khác nhau - có nhiều tình huống nhiều người dùng chia sẻ cùng một kết nối internet và nếu học sinh bị cuốn vào trò chơi của bạn, bạn có thể đặt cược rằng họ có thể sẽ tìm ra cách cài đặt và chạy nó trong lớp thay vì thực hiện công việc của họ (và bạn có muốn dành thời gian quý báu này cho trò chơi của bạn thay vì của người khác không?).

Khi luồng TCP của bạn mở, nó vẫn khá hiệu quả. Bước tiếp theo là giảm thiểu lượng dữ liệu bạn gửi / nhận và đây là lúc thiết kế giao thức phát huy tác dụng. Nếu bạn chỉ gửi một vài byte cho mỗi lệnh (ví dụ: "di chuyển về phía trước") thay vì, ví dụ, gói cùng một lệnh trong hàng trăm byte mã XML, thì mức tiêu thụ băng thông mạng tổng thể của bạn sẽ thấp hơn và chu kỳ CPU sẽ ít hơn được yêu cầu xử lý thông tin (một vài byte dễ dàng được so sánh với việc tháo gỡ và giải thích và kiểm tra cú pháp một đoạn lớn của XML).

Bạn chắc chắn có thể mở nhiều luồng TCP và sử dụng chúng cho các mục đích khác nhau, chẳng hạn như một cho các lệnh, một cho chuyển đồ họa, một cho trò chuyện dựa trên âm thanh, v.v. Bằng cách đó, nếu bạn chuyển một đồ họa lớn mất 5-10 Vài giây để tải xuống, ít nhất các chuyển động lệnh của người chơi sẽ không bị trễ vì chúng sẽ ở một luồng khác (và bạn có thể hiển thị một sprite mặc định cho đến khi sprite mới tải xuống xong, điều này luôn vui hơn chờ đợi).


1
Câu hỏi ban đầu đã đề cập đến một mô hình máy khách-máy chủ, vì vậy "các trang web" chặn tất cả UDP là không liên quan; đó là vấn đề của khách hàng và tôi nghi ngờ nhiều khách hàng thực sự chặn tất cả UDP. "Sử dụng TCP là sai lầm tồi tệ nhất bạn có thể mắc phải khi phát triển một trò chơi nối mạng! Để hiểu lý do tại sao, bạn cần xem TCP thực sự đang làm gì trên IP để khiến mọi thứ trông thật đơn giản!" Xem gafferongames.com/networking-for-game-programmers/udp-vs-tcp
sự005

@ Thật005: Có những ưu và nhược điểm này - UDP chắc chắn cung cấp lợi thế về hiệu suất, nhưng với chi phí đáng tin cậy (đó là nơi TCP có lợi thế). Đối với việc chặn UDP, bạn hoàn toàn đúng về vấn đề của khách hàng, nhưng trong nhiều môi trường công ty và giáo dục, tôi đã gặp phải UDP (ngoại trừ cổng 53) bị chặn bởi các quản trị viên không biết rằng UDP là vấn đề bảo mật và do đó, tùy chọn cho máy khách dự phòng TCP ít nhất có thể có nghĩa là người chơi có thể trải nghiệm trò chơi (đặc biệt là nếu băng thông mạng đủ nhanh).
Randolf Richardson

@ Thật005: Ngoài ra, sử dụng hỗn hợp UDP và TCP cũng có thể được chấp nhận vì TCP có thể được sử dụng để truyền dữ liệu có mức độ ưu tiên thấp hơn, trong khi UDP có thể được sử dụng cho mặt hành động tốc độ cao. Điều thú vị cũng cần lưu ý là với IPv6 có các tùy chọn mới khả dụng (không có sẵn với IPv4) có thể đáp ứng nhu cầu chơi game trong thời gian thực trong khi không có kết nối về bản chất, nhưng tôi nghĩ rằng sẽ có một thời gian trước IPv6 có thể được sử dụng bởi các trò chơi mà không cần phải dựa vào IPv4 (điều này thật đáng tiếc, vì vậy chúng tôi thực hiện với IPv4 một cách tốt nhất có thể bây giờ).
Randolf Richardson

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.