Làm cách nào để cấu trúc một máy chủ trò chơi đơn giản cho trò chơi nhiều người chơi?


9

Tôi muốn tạo một máy chủ trò chơi nhiều người chơi đơn giản cho một trò chơi đơn giản:

Trò chơi được cho là tương tự như Command & Conquer, bạn có một vài xe tăng và một vài binh sĩ. Bạn có thể chọn một người lính và hơn là nhấp vào bản đồ, nơi người lính nên đi. Nếu người lính đến một khu vực mà anh ta không thể đi, anh ta sẽ đi bộ xung quanh. Và binh lính có thể bị kẻ thù bắn hạ.

Tôi nên cấu trúc máy chủ trò chơi như thế nào và nên làm gì ở máy khách?

Tức là nếu một người lính chuyển từ X sang Y nhưng xung quanh tòa nhà Z, tôi đoán máy chủ phải có thể tính toán chính xác vị trí của người lính (trong trường hợp kẻ thù bắn vào anh ta) và khách hàng cũng phải biết vị trí cho vẽ người lính.

Những gì nên được thực hiện tại máy chủ và tôi nghĩ rằng tôi phải bỏ một giao thức cho việc này. Tôi nghĩ rằng máy chủ phải theo dõi trạng thái trò chơi và thời gian. Có ai có đề xuất về cách làm điều này? hoặc có thể đề nghị một số đọc?

Câu trả lời:


12

Nói chung đó là một chủ đề rất phức tạp. Bạn có hai mục tiêu mâu thuẫn (ít nhất là nếu bạn không có kế hoạch chạy mọi trò chơi trên một máy chủ chuyên dụng):

  1. Bạn sẽ muốn càng nhiều càng tốt được thực hiện trên máy chủ, cả hai để ngăn chặn gian lận và để đảm bảo tất cả các khách hàng nhìn thấy những điều tương tự.
  2. Nhưng bạn cũng muốn mọi thứ được công bằng, điều đó có nghĩa là nếu một người có ping 0 lần đến máy chủ trong khi những người khác bị lag mạng, khi cả hai đưa ra lệnh cho các đơn vị của họ cùng một lúc, trình phát "máy chủ" có lợi thế .

Tôi không thể nói chính xác làm thế nào để giải quyết điều đó cho một RTS. Những gì chúng tôi làm cho việc bắn FPS của mình là để máy chủ lưu lại trạng thái thế giới hoàn chỉnh một lúc và để máy khách đánh dấu thời gian mỗi lần bắn. Khi tin nhắn mạng cho "Tôi đã sa thải!" Đến máy chủ, máy chủ có thể quay trở lại thế giới và thực hiện các thử nghiệm va chạm, v.v. trên thế giới "vì nó tìm kiếm máy khách khi phát bắn".

Nếu bạn dự định có nhiều đơn vị, bạn cũng sẽ gặp vấn đề về khả năng xử lý quá nhiều cho máy chủ. Nếu bạn không quá lo lắng về việc hack hoặc gian lận, tôi khuyên bạn nên thực hiện tìm đường trên máy khách và gửi kết quả của việc đó đến máy chủ.

Tuy nhiên, một lựa chọn khác có thể là truy cập ngang hàng trên đó, để mỗi khách hàng xử lý các bản cập nhật cho các nhóm địa phương, nhưng điều đó sẽ mở ra câu hỏi làm thế nào để xác định ai trúng cái gì và cứ thế.

Tùy thuộc vào mức độ phức tạp của dự án này và bao nhiêu nỗ lực bạn sẵn sàng dành cho nó, đề nghị tốt nhất của tôi sẽ là quyết định một cái gì đó sơ bộ và bắt đầu làm việc với nó để kiểm tra nó.


1
Trên thực tế có ba (hoặc có thể nhiều hơn) các mục tiêu xung đột. Thứ ba là hiệu năng, việc giữ và cập nhật trạng thái của một trò chơi thời gian thực đầy đủ trên máy chủ sử dụng rất nhiều tài nguyên.
Bart van Heukelom

2
Ồ, và bạn có thể dễ dàng giải quyết # 2 bằng cách giới thiệu độ trễ nhân tạo bằng với độ trễ trung bình của người chơi khác. Chà, nếu bạn có thể gọi "làm cho nó xấu cho mọi người" là một giải pháp, đó là.
Bart van Heukelom

@Bart: một phần đúng, nhưng tất nhiên nên có giới hạn về độ trễ mà bạn giới thiệu một cách giả tạo, hoặc các kết nối chậm hơn có thể liên tục buộc các kết nối nhanh hơn bị trễ quá nhiều, đó chắc chắn là điều bạn muốn.
o0 '.

Tìm đường dẫn tốt nhất sẽ không có vấn đề gì nếu được thực hiện trên máy khách, miễn là một khi anh ta tìm thấy nó sẽ gửi giải pháp đến máy chủ, điều này - như với tất cả các chuyển động - kiểm tra xem nó có đúng không.
o0 '.

2

Về cơ bản có hai cách tiếp cận:

  1. Khách hàng đáng tin cậy
  2. Khách hàng không tin cậy

Máy khách đáng tin cậy phức tạp hơn một chút, nhưng có lợi thế là bạn có thể giảm tải rất nhiều tính toán của mình từ máy chủ. Chi phí vận hành máy chủ là một trong những vấn đề lớn nhất đối với các trò chơi nhiều người chơi và sẽ làm giảm nghiêm trọng khả năng mở rộng của bạn.

Một cách tiếp cận tốt (cho người mới bắt đầu) là để cho mỗi khách hàng của người chơi xử lý các đơn vị riêng của mình. Trong bước tiếp theo, bạn có thể sử dụng các chu kỳ dự phòng để cho phép khách hàng của người chơi xác minh các hành động của khách hàng khác. Máy chủ không cần phải làm nhiều hơn là trao đổi tin nhắn, giữ đồng bộ hóa và đảm bảo tính bền bỉ (ví dụ: cơ sở dữ liệu).

Nếu bạn có kế hoạch để có một số loại tiền sảnh hoặc trò chuyện thì hãy xử lý từng chủ đề này trong một máy chủ bổ sung. Nó sẽ làm cho mọi thứ dễ dàng hơn nhiều xuống đường.


Cảm ơn, đó là thông tin. Tôi nghĩ rằng tôi sẽ đi cho các khách hàng không đáng tin cậy, và phải làm công việc trên máy chủ. Tôi sẽ không có nhiều người chơi lúc đầu.
Jonas

1
"Tôi sẽ không có nhiều người chơi ..." Tôi không thể đếm số nhà phát triển đưa cho tôi dòng đó và quay lại sáu tuần sau với: "Tôi có 5000 người chơi này muốn trả tiền để chơi trò chơi của mình, nhưng tôi không thể mở rộng quy mô :( ". Hãy ghi nhớ điều đó!
Andreas

9
"Khách hàng đáng tin cậy" không phải là một cách tiếp cận, đó là một sai lầm.
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.