Trò chơi thẻ máy khách-máy chủ theo lượt - Unicast (TCP) hoặc Multicast (UDP)


8

Tôi hiện đang lên kế hoạch thực hiện một dự án trò chơi bài nơi khách hàng sẽ liên lạc với máy chủ theo cách đồng bộ và theo lượt bằng cách sử dụng tin nhắn được gửi qua ổ cắm. Vấn đề tôi có là làm thế nào để xử lý tình huống sau:

(Khách hàng thực hiện lần lượt và gửi hành động của mình đến máy chủ)

  1. Khách hàng gửi một thông báo cho máy chủ biết lần lượt di chuyển (ví dụ: chơi thẻ 5 từ tay cần đặt lên bàn)

  2. Máy chủ nhận tin nhắn và cập nhật trạng thái trò chơi (máy chủ sẽ giữ tất cả trạng thái trò chơi).

  3. Máy chủ lặp qua danh sách các máy khách được kết nối và gửi một thông báo để thông báo về sự thay đổi trạng thái của chúng

  4. Tất cả khách hàng làm mới để hiển thị trạng thái

Tất cả đều dựa trên việc sử dụng TCP và nhìn vào nó bây giờ có vẻ hơi giống mẫu của Người quan sát. Lý do có vẻ như đây là một vấn đề đối với tôi là tin nhắn này dường như không giống như những người khác vì tôi muốn gửi nó cho tất cả các khách hàng và dường như không gửi tin nhắn tương tự rất hiệu quả theo cách đó

Tôi đã suy nghĩ về việc sử dụng đa phương tiện với UDP vì sau đó tôi có thể gửi tin nhắn cho tất cả các khách hàng, tuy nhiên điều này có nghĩa là các khách hàng trên lý thuyết có thể nhắn tin cho nhau không? Tất nhiên cũng có khía cạnh đồng bộ, mặc dù điều này có thể được đặt lên trên UDP tôi đoán.

Về cơ bản, tôi muốn biết điều gì sẽ là thực tiễn tốt vì dự án này thực sự là về học tập, và mặc dù nó sẽ không đủ lớn để gặp phải các vấn đề về hiệu suất từ ​​điều này, dù sao tôi cũng muốn xem xét chúng.

Tuy nhiên, xin lưu ý rằng tôi không quan tâm đến việc sử dụng phần mềm trung gian hướng thư như một giải pháp (Tôi có kinh nghiệm sử dụng MOM và tôi quan tâm đến việc xem xét các tùy chọn khác trừ MOM nếu socket TCP là một ý tưởng tồi!).

Câu trả lời:


11

Đừng tối ưu hóa sớm. Giữ cho nó đơn giản. Sử dụng TCP trong trường hợp này là OK và tôi không thấy bất kỳ vấn đề nào với sơ đồ hiện tại của bạn.

UDP thường được sử dụng cho các tình huống quan trọng về hiệu năng như trong trò chơi hành động trực tuyến, vì nó cho phép kiểm soát rõ ràng đối với các gói riêng lẻ thay vì hoạt động trên một lớp trừu tượng của các luồng như TCP. Tuy nhiên, mặc dù bạn có một số mức tăng tốc độ bằng cách kiểm soát chính xác cách bạn muốn gửi dữ liệu, UDP không xử lý mất gói hoặc đặt hàng gói như TCP, trong trường hợp đó bạn phải tự mã hóa nó. Vì vậy, vì đây là một trò chơi bài theo lượt, tôi nghi ngờ bạn sẽ muốn hy sinh độ tin cậy về tốc độ, vì vậy hãy sử dụng TCP.


Cảm ơn câu trả lời của bạn, nó đã rõ ràng và xuất hiện để trả lời tất cả mọi thứ tôi yêu cầu.
LDM91

3

Ngay cả nhiều MMO lớn, phổ biến cũng chỉ sử dụng TCP. Nó sẽ làm mọi thứ bạn cần với tất cả các đặc tính hiệu quả bạn cần.

UDP đòi hỏi rất nhiều sự phức tạp, đa tuyến đòi hỏi sự phức tạp hơn nữa và bạn sẽ không nhận được gì từ chúng. Nếu bạn chỉ quan tâm đến việc học, bằng mọi cách hãy tự mình tạo ra một bản demo công nghệ, nhưng đừng nghĩ rằng bản thân dự án sẽ tốt hơn vì nó.

Nếu bạn hoàn toàn thích sử dụng UDP, thì nhiệm vụ đầu tiên của bạn về cơ bản là sẽ thực hiện lại TCP trên UDP, chỉ để đảm bảo rằng bạn thực sự hiểu cách xử lý tất cả các vấn đề mà TCP giải quyết cho bạn: tắc nghẽn kiểm soát, truyền lại gói bị mất, xử lý trùng lặp bị trì hoãn, đặt hàng gói, bắt tay kết nối đáng tin cậy, trình tự ngắt kết nối đáng tin cậy, v.v.

Không nhất thiết phải giải quyết tất cả những vấn đề đó, nhưng nó đòi hỏi sự hiểu biết sâu sắc về mạng, giao thức IP và cách giải quyết những vấn đề đó.

Từ đó, xây dựng thư viện để cung cấp các tính năng mà TCP thiếu là nơi niềm vui thực sự bắt đầu. Sử dụng luồng tin nhắn được ghép kênh qua luồng gói, kiểm soát tắc nghẽn hiệu quả hơn, xử lý giới hạn tốc độ, đa kênh, cấu hình kênh (cho dù kênh có yêu cầu tin nhắn theo thứ tự hay không, cho phép các gói bị rơi, v.v.), v.v.

Tôi sẽ đề nghị bạn đọc loạt bài viết sau đây. Nó không hoàn hảo và đưa ra một vài tuyên bố rất đáng nghi ngờ (bắt đầu bằng câu hỏi "không bao giờ sử dụng TCP trong trò chơi"), nhưng các chi tiết kỹ thuật của nó rất hữu ích cho các lập trình viên mạng mới: http://gafferongames.com/networking-for-game- lập trình viên / udp-vs-tcp /


1
Trong phần giới thiệu về bài viết đó, tác giả đã nêu: "Sự lựa chọn bạn đưa ra hoàn toàn phụ thuộc vào loại trò chơi bạn muốn kết nối. Vì vậy, từ thời điểm này, và trong phần còn lại của loạt bài viết này, tôi sẽ cho rằng bạn muốn để kết nối một trò chơi hành động. Bạn biết các trò chơi như Halo, Battlefield 1942, Quake, Unreal, CounterStrke, Team Fortress, v.v. "
XiaoChuan Yu

Ah, tôi đã bỏ lỡ điều đó khi tôi đọc lướt nó để chắc chắn rằng nó tốt như tôi nhớ nó. Xấu của tôi, xin lỗi
Sean Middleditch

-1 cho "Nếu bạn hoàn toàn thích sử dụng UDP, thì nhiệm vụ đầu tiên của bạn về cơ bản là sẽ thực hiện lại TCP trên UDP" , IMO rất sai. Hữu ích hơn nhiều để học UDP thực sự làm những việc mà UDP được chọn.
o0 '.

@Lohoris: Điều đó không có ích và thậm chí không chính xác. Bạn PHẢI có khả năng gửi tin nhắn được bảo đảm theo thứ tự ngay cả với UDP. Bạn cần có thể gửi các tin nhắn không được bảo đảm theo thứ tự. Bạn cần có thể gửi các tin nhắn không theo thứ tự. Đơn giản nhất là bắt đầu với hành vi giống như TCP vì nó yêu cầu thực hiện tất cả các tính năng cần thiết và dễ kiểm tra nhất, và ngay cả bản thân nó vẫn cung cấp các tính năng hữu ích như kiểm soát trực tiếp hơn về sử dụng băng thông và độ trễ.
Sean Middleditch

@seanmiddleditch sai. Không có gì sai khi sử dụng cả UDP và TCP trong cùng một trò chơi, do đó bạn không cần phải thực hiện phân phối được bảo đảm qua UDP.
o0 '.
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.