Làm cách nào tôi có thể tạo trò chơi nhiều người chơi ngang hàng? [đóng cửa]


37

Làm thế nào tôi có thể tạo một trò chơi nhiều người chơi p2p? Tôi muốn có một trò chơi nhiều người chơi không có máy chủ. Nhưng sau đó, làm thế nào tất cả các khách hàng biết nhau?

Tại sao giao thức p2p rất nổi tiếng trong việc truyền tệp mà không phải trong các trò chơi nhiều người chơi?


Điều có thể rất thú vị trong trò chơi p2p, là quản lý để tạo một mã mạng phù hợp với MMO, để cho phép các khía cạnh xã hội tốt hơn: máy chủ sẽ chỉ cần cho các thành phố và các bên có hơn 5 người chơi. Tôi không biết điều gì là khả thi và điều gì không, nhưng hiện tại đó là điều duy nhất thú vị hơn là đồ họa quang học ...
jokoon

Nhưng p2p IS khá phổ biến trong các trò chơi nhiều người chơi! Ai nói là không? Thậm chí một số MMO lớn còn sử dụng p2p
Adam Harte

Câu trả lời:


34

Nhìn chung các trò chơi ngang hàng vẫn có một máy chủ lưu trữ trò chơi. Đó là máy chủ lưu trữ trò chơi đưa trò chơi vào danh sách trò chơi chính và chấp nhận các kết nối mới. Bất cứ khi nào máy chủ trò chơi chấp nhận một khách hàng mới vào trò chơi, nó sẽ thông báo cho tất cả các khách hàng hiện tại về khách hàng mới để họ có thể đảm bảo họ kết nối với khách hàng mới.

Cách đơn giản nhất để thực hiện p2p là với một sảnh. Tất cả khách hàng kết nối với chủ nhà trong sảnh (hoặc phòng trò chuyện). Khi chủ nhà sẵn sàng, người chơi nhấn bắt đầu và tất cả họ vào trò chơi cùng một lúc (thường được sử dụng trong các trò chơi chiến lược). Một cách tiếp cận phức tạp hơn là sử dụng "thả ra" trong đó người chơi có thể tham gia và rời khỏi trò chơi giữa chừng, tuy nhiên điều này phức tạp hơn rất nhiều khi thực hiện trong trò chơi p2p và yêu cầu một tính năng gọi là di chuyển máy chủ.

Một số lượng lớn các trò chơi sử dụng mạng ngang hàng, bao gồm hầu hết các tựa game chiến lược, thể thao và lái xe. Tất cả các trò chơi Xbox360 và PS3 đều sử dụng mạng p2p. Kiến trúc máy khách-máy chủ chủ yếu được sử dụng trong các game bắn súng góc nhìn thứ nhất hoặc MMO.

Client-Server thường dễ thực hiện hơn vì chỉ có 1 máy chưa biết toàn bộ trạng thái trò chơi, các máy khách về cơ bản chỉ là trình kết xuất với một số dự đoán để làm cho mọi thứ trở nên trơn tru.

Khi bạn xây dựng một công cụ p2p, tất cả các khách hàng cần một trạng thái đầy đủ của thế giới trò chơi và tất cả họ đều được yêu cầu giữ đồng bộ.

Để biết thêm chi tiết về kiến ​​trúc p2p và máy khách-máy chủ, tôi khuyên bạn nên đọc bài viết sau: Điều mọi lập trình viên cần biết về mạng trò chơi .

Và nếu bạn chưa quen với mạng nói chung, hãy kiểm tra các bài viết tuyệt vời khác trên trang web đó. Glenn là một thiên tài mạng.


13

Có nhiều lý do p2p không phổ biến trong các trò chơi, chủ yếu là do độ trễ. Mọi người đều chậm như người chơi chậm nhất. Chúng ta không nói về băng thông ở đây, nhưng thời gian ping.

p2p có thể truyền hàng tấn dữ liệu, nhưng với tốc độ ping khá cao, các trò chơi cần truyền một lượng dữ liệu rất nhỏ, với thời gian ping tối thiểu.


13

Có một số khía cạnh thú vị về hệ thống ngang hàng và trò chơi hành động. Tôi đã cố đăng chúng như một bình luận trên blog của Glenn Fiedler, nhưng rõ ràng anh ta không muốn bị chứng minh là sai và thay vào đó đã rút toàn bộ bài báo. Đó là trên Lưu trữ Internet, trong trường hợp bạn muốn đọc nó.

Anh ấy đã không để bình luận lên mạng, vì vậy tôi sẽ trích dẫn ở đây:

Đề xuất ngang hàng từ bài đăng đầu tiên thực sự là một điểm khởi đầu thú vị, mặc dù đôi khi nó hơi ngây thơ: Khả năng đầu tiên là kết hợp hệ thống với mô hình máy khách / máy chủ tiêu chuẩn với dự đoán như được nêu trong bài đăng của bạn về mạng trò chơi. Ping P2P thấp hơn sẽ làm giảm đáng kể độ trễ dự đoán giữa các người chơi tùy thuộc vào vị trí của họ: Hiệu ứng có thể sẽ không hiển thị đối với hầu hết các game thủ Hoa Kỳ, nhưng ở đây, ở Châu Âu, việc ping hơn 200 là bình thường trên hầu hết các máy chủ và kết nối trực tiếp sẽ làm giảm dự đoán độ trễ so với máy chủ châu Âu.

Một cách tiếp cận P2P thực sự mà không cần máy chủ thì phức tạp hơn một chút: Mối quan tâm chính với các mạng phi tập trung là đảm bảo tính nhất quán, đặc biệt là nếu mô phỏng có thể bị hiệu ứng cánh bướm do thời gian của các lệnh được gửi qua mạng hoặc các vấn đề dấu phẩy động hơi khác nhau. Điều này có thể bằng cách kết nối trạng thái của từng đối tượng (người chơi, NPC, ...) ít nhất theo định kỳ. Thậm chí sẽ không cần thiết phải làm điều đó cho tất cả các đối tượng cùng một lúc và mỗi khách hàng có thể sở hữu một số đối tượng nhất định. Kết nối đủ các đối tượng trong một thời gian nhất định sẽ làm giảm sự khác biệt tích tụ giữa mỗi lần đồng bộ hóa của một đối tượng đủ để trở nên không liên quan ngay cả trong các khoảng thời gian đồng bộ hóa trong một giây trở lên.

Vấn đề thứ hai với các hệ thống P2P là bảo mật, nhưng có thể giải quyết bằng một sửa chữa tương đối nhỏ trong trường hợp này: Các khách hàng có thể sử dụng mô phỏng vật lý của họ để thu thập thông tin về mức độ lỗi trên từng đối tượng vật lý. Vật lý được điều khiển luôn dẫn đến một lỗi lớn hơn, do đó, khách hàng chỉ cần "bỏ phiếu" để ngắt kết nối khỏi đồng nghiệp kiểm soát một đối tượng đáng ngờ. Ngoài ra, thông báo điều khiển cho các đối tượng phi vật lý được chuyển tiếp giữa các máy khách dựa trên mức độ quan trọng của chúng: Các bản cập nhật của người chơi có thể được chuyển tiếp ngẫu nhiên, các bản cập nhật quan trọng và không thường xuyên phải luôn được gửi, nhưng vẫn gửi đến một người chơi ngẫu nhiên. Bằng cách này, người chơi sẽ phải kiểm soát một phần lớn các máy khách được kết nối để có thể gian lận theo bất kỳ cách đáng chú ý nào.

[...]

Bạn có thể tìm thấy chủ đề tôi đang tham khảo tại http://www.devmaster.net/forums/showthread.php?t=14640 .

Tôi nghĩ rằng ai đó đã đề cập đến các vấn đề tường lửa ngang hàng có trong một trong các chủ đề từ bài viết. Một giải pháp khả thi sẽ là một cú đột phá của NAT:
- Tổng quan về cú đấm của NAT
- Giao tiếp ngang hàng qua các trình dịch địa chỉ mạng

Không có tỷ lệ thành công 100%, vì vậy bạn nên nói với người chơi mở một cổng.


+1 cho người duy nhất trả lời câu hỏi, cảm ơn bạn vì điều đó. Một câu hỏi: bạn đã đề cập đến sự khác biệt về hiệu ứng cánh bướm trong trạng thái mất kiểm soát (Tôi đã thấy điều này xảy ra trong một số trò chơi Interplay được viết kém). Chúng ta nên làm gì khi phát hiện ra trạng thái khác nhau giữa các máy? Lấy Starcraft làm ví dụ, điều gì sẽ xảy ra nếu máy tính của tôi tin rằng một đơn vị đã chết, nhưng máy tính của đối thủ của tôi tin rằng một đơn vị khác đã chết? Làm thế nào để chúng ta quyết định từ của ai?
BlueRaja - Daniel Pflughoeft

@BlueRaja Starcraft thực sự không phải là một ví dụ tốt cho điều này, vì động cơ của nó mang tính quyết định 100%. Bạn chỉ phải truyền các lệnh của người chơi một cách đáng tin cậy với dấu thời gian và các máy tính chia sẻ cùng một chương trình sẽ luôn đồng ý về trạng thái hiện tại. Một cách tốt để giảm sự khác biệt là đánh dấu thời gian từng bản cập nhật trạng thái với gametime (khung vật lý hoặc đánh dấu) và lưu trữ một vài trong số các khung này trên máy nhận. (Hầu hết các game FPS cho điều này, ví dụ là CS: S và TF2.) Ngoài ra, không sử dụng số dấu phẩy động cho bất kỳ điều gì quan trọng, vì việc triển khai chúng có thể khác nhau.
Tamschi

Nếu một công cụ có tính xác định 100% (Có thư viện vật lý đảm bảo điều này.) Và sử dụng bộ nhớ đệm khung để đồng bộ hóa trạng thái trên các máy tính, hiệu ứng cánh bướm trở thành 0. (Miễn là bạn có thể đảm bảo kết nối đáng tin cậy.) lợi thế là bạn có thể tương đối dễ dàng xác định các khách hàng gian lận, vì cách duy nhất để có được kết quả khác nhau là có mã khác nhau. Lưu ý rằng điều này có thể không khả dụng cho mọi khía cạnh của trò chơi, tùy thuộc vào hiệu suất mạng; Các mảnh vỡ thường không được đồng bộ hóa vì lý do này. Trò chơi tốc độ nhanh thường không thể đồng bộ hóa mọi thứ.
Tamschi

Bởi vì các bài viết trên blog từ đó biến mất khỏi bộ nhớ cache của Google, ở đây nó là trên Internet Archive: web.archive.org/web/20091120214817/http://gafferongames.com/...
fernozzle

9

Một ví dụ điển hình về trò chơi 'ngang hàng thực sự' sẽ là một trò chơi chiến lược thời gian thực như Starcraft.

Trong một trò chơi có hàng trăm đơn vị / tên lửa đang chuyển động, việc liên tục gửi các vị trí / trạng thái đơn vị qua mạng cho tất cả người chơi khác là không thực tế, do đó, một giải pháp ở đây là cho tất cả người chơi chạy mô phỏng (chính xác).

Khi một người chơi thực hiện một hành động, lệnh / lệnh ('di chuyển zergling sang X, Y') có thể được gửi cho tất cả người chơi khác, để được thực hiện bởi tất cả các trường hợp mô phỏng một phần giây sau đó.

Trong tình huống này, nếu bất kỳ người chơi nào ngắt kết nối, trò chơi có thể tiếp tục - vì không cần máy chủ / máy chủ để chạy trò chơi, những người chơi còn lại có thể tiếp tục.

Tuy nhiên, việc giữ cho các trò chơi được đồng bộ hóa là không tầm thường, bạn phải sử dụng dấu thời gian cố định để cập nhật logic trò chơi và phải rất cẩn thận với việc sử dụng và gieo các trình tạo số ngẫu nhiên, để đảm bảo rằng các mô phỏng sẽ không bị phân kỳ!


5

Sẽ là một chút thiếu thận trọng khi tuyên bố rằng nó không nổi tiếng với các trò chơi khi hầu hết các trò chơi Chiến lược thời gian thực (sê-ri Star Craft, Sê-ri lệnh và chinh phục) và nhiều trò chơi FPS (Call of Duty: Modern Warfare 2) sử dụng nó.

Điều đó nói lên cách người ta tìm hiểu về trò chơi tùy thuộc vào dịch vụ mai mối / vận động hành lang mà bạn sử dụng hoặc tạo. Nhưng ngay cả khi một người tìm hiểu về trò chơi, vẫn có thể có một hoặc nhiều người ngang hàng bình đẳng hơn những người khác. Hãy xem xét trường hợp của 3 khách hàng muốn chơi, một đằng sau một nat mở, 2 đằng sau các trò chơi nghiêm ngặt (Đóng). Các đồng nghiệp nat mở có thể lấy kết nối từ hai người kia. Nhưng 2 nghiêm ngặt không thể kết nối trực tiếp với nhau, chúng sẽ yêu cầu mở nat để chuyển tiếp các gói. Nếu đồng nghiệp tự nhiên mở ra khỏi trò chơi, thì cần phải tìm một rơle khác hoặc trò chơi sẽ bị gián đoạn.


2

bạn cũng có thể muốn kiểm tra Badumna (www.badumna.com), nơi tự nhận là một giải pháp mạng ngang hàng cho các trò chơi trực tuyến. Nó dường như thực hiện đồng bộ hóa trạng thái trò chơi theo cách phân tán và theo trang web của họ có phiên bản Flash sắp ra mắt.


1

Bạn có thể muốn chạy với một người chơi (Chúng tôi sẽ gọi anh ấy / cô ấy là "Máy chủ") như một máy chủ không có thẩm quyền. Bạn sẽ có tất cả những người chơi khác liên lạc với những gì họ đang làm với người chủ của chúng tôi và chủ nhà sẽ chuyển tiếp tin nhắn đến những người chơi khác.

Bạn cũng có thể muốn thông qua một danh sách những máy tính nào được kết nối với trình phát lưu trữ để nếu chúng thả một máy chủ mới có thể được chọn bằng cách nào đó và bắt đầu liên lạc với những người chơi còn lại.

Tài liệu về smartfoxserver có thể giúp bạn ra ngoài và / hoặc cuối cùng bạn cũng muốn sử dụng nó cho trò chơi của mình. Bạn chỉ cần nhúng nó vào trò chơi khách của mình thay vì có một chương trình máy khách và máy chủ riêng biệt.


1
Điều này dường như ít hơn với một thiết lập p2p và nhiều hơn một máy chủ / máy khách ngẫu hứng.
deft_code

@caspin Đây là hầu hết nếu không phải tất cả các trò chơi p2p đều chạy. Một người chơi được chỉ định là chủ nhà, và những người còn lại kết nối với anh ta.
Tấn côngHobo

2
@Hobo: đó không phải là p2p, đó máy khách / máy chủ, bất kể bạn gọi nó như thế nào.
o0 '.

1

Tôi có một chút quan tâm về vấn đề này. Bạn đang nói rằng có rất nhiều vấn đề khi tạo trò chơi p2p thay vì mô hình máy khách-máy chủ cổ điển. Nhưng tôi khá chắc chắn rằng p2p giống như máy khách-máy chủ nhưng mọi người ngang hàng đều có cơ hội trở thành máy chủ. Về LAG nếu bạn thêm một máy nữa làm máy chủ thì có nhiều xác suất mà nhiều máy khách ở xa máy chủ hơn, nhưng sử dụng p2p không có thêm máy nào trong sảnh bạn có thể quản lý các bài kiểm tra độ trễ và tạo các nhóm với ping tối thiểu. Về việc tạo lưu lượng truy cập, như tôi đã học, bạn phải yêu cầu khách hàng truyền ít hơn ít hơn tôi có nghĩa là khách hàng phải tính tất cả các khách hàng khác sẵn sàng.


gta4 trên xbox 360 là p2p nên có thể và hầu như không có độ trễ

-1

Nếu bạn đang tạo một mmorpg tương đối đơn giản với yêu cầu hệ thống thấp, tôi khuyên bạn nên tạo một chương trình nội bộ tạo ra "tần số" dựa trên nội dung của thư mục trò chơi và các tệp bao gồm những gì. Điều này sẽ khiến những người có cùng "tần số" phát trên cùng một kênh. Các khách hàng được điều chỉnh, thao tác hoặc bình thường sẽ được tách ra. Điều này sẽ chỉ hoạt động cho các bản hack hoặc mod bản địa, nhưng tôi chắc chắn rằng nó bao gồm tất cả những kẻ gian lận "ngu ngốc". Kết hợp với phương pháp kiểm tra lỗi mà một người đề cập có nghĩa là ít hoặc không cần kiểm duyệt. Theo như các cổng, chỉ cần nó bao gồm cổng 52225 với một quá trình nền giữ cho nó được cắm trên các bộ định tuyến mà không cần cổng kích hoạt.

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.