Làm thế nào để viết một trò chơi mạng? [đóng cửa]


73

Dựa trên lý do tại sao rất khó để phát triển MMO? :

Phát triển trò chơi nối mạng không phải là nhỏ; có những trở ngại lớn để vượt qua không chỉ độ trễ, mà còn ngăn chặn gian lận, quản lý nhà nước và cân bằng tải. Nếu bạn không có kinh nghiệm viết một trò chơi nối mạng, đây sẽ là một bài tập học tập khó khăn.

Tôi biết lý thuyết về ổ cắm, máy chủ, máy khách, giao thức, kết nối và những thứ như vậy.

Bây giờ tôi tự hỏi làm thế nào một người có thể học viết một trò chơi mạng:

  • Làm thế nào để cân bằng các vấn đề tải?
  • Làm thế nào để quản lý trạng thái trò chơi?
  • Làm thế nào để giữ cho mọi thứ được đồng bộ?
  • Làm thế nào để bảo vệ thông tin liên lạc và khách hàng từ kỹ thuật đảo ngược?
  • Làm thế nào để giải quyết các vấn đề về độ trễ?
  • Những thứ nào nên được tính cục bộ và những thứ trên máy chủ?
  • ...

Có bất kỳ cuốn sách hay, hướng dẫn, trang web, bài viết thú vị hoặc câu hỏi khác liên quan đến điều này?

Tôi đang tìm kiếm câu trả lời rộng, nhưng những câu trả lời cụ thể cũng tốt để tìm hiểu sự khác biệt.


4
Vâng, có sách, hướng dẫn, trang web, bài viết thú vị và các câu hỏi khác liên quan đến điều này.
Ricket

2
Tôi đã thêm tiền thưởng để đẩy câu hỏi mà không sửa đổi nó và cung cấp cho người dùng lý do để trả lời vì câu hỏi này xứng đáng có câu trả lời, do đó người trả lời tốt nhất có được danh tiếng cho công việc của họ nhưng không có câu trả lời nào trả lời câu hỏi.
Tamara Wijsman

Câu trả lời:


61

Ngoài bài viết được liên kết trong các câu trả lời khác, tôi có thể nói một chút về kinh nghiệm của Dự án Arianne .

Làm thế nào để giữ cho mọi thứ được đồng bộ?

Chúng tôi đã xây dựng khung Marauroa, xung quanh khái niệm hành động và nhận thức: Hành động được gửi từ máy khách đến máy chủ mang theo đầu vào của người dùng như (đi bên trái, tấn công quái vật # 47, nói 'xin chào'). Và nhận thức được gửi từ máy chủ đến các khách hàng nói với họ về tình trạng của thế giới chặt chẽ xung quanh họ. Những nhận thức được gửi mỗi lượt. Tùy thuộc vào trò chơi, chúng tôi sử dụng thời gian lần lượt từ 30ms đến 300ms.

Chúng tôi có hai loại nhận thức : Một nhận thức đầy đủ được gửi khi đăng nhập và khi người chơi vào một khu vực (khu vực) mới. Sau đó, các nhận thức khác biệt được gửi đi chỉ bao gồm các thuộc tính được sửa đổi (ví dụ: vị trí) của các đối tượng được sửa đổi, và tất nhiên các đối tượng mới và bị loại bỏ.

Làm thế nào để giải quyết các vấn đề về độ trễ?

Chúng tôi tin tưởng mạnh mẽ vào các máy chủ luôn luôn đúng. Khách hàng thực hiện một số dự đoán như đi bộ trơn tru, kiểm tra va chạm và như vậy. Nhưng nếu một khách hàng và máy chủ không đồng ý về điều gì đó, thì máy chủ sẽ thắng. Tiểu dự án Stendhal (một game nhập vai 2D) sử dụng thời gian quay 300ms theo mặc định (với rất nhiều thao tác làm mịn phía máy khách). Điều này làm cho Stendhal rất chống lại độ trễ.

Lưu ý: Một số trò chơi khác tin tưởng khách hàng sẽ gia hạn để giảm thiểu tác động của độ trễ mạng. Trong WoW, nó thường được khai thác ở một trong những chiến trường có tên là Wars Warsong Gulch '. Có hai cách mà người chơi có cờ có thể chọn: Ở giữa thông qua một đường hầm và một cách nhìn đúng hướng lên đồi. Vì vậy, một người chơi gian lận chạy về phía đường hầm, và sau đó gây ra sự chậm trễ cho chính mình. Máy chủ và các khách hàng khác sẽ tiếp tục thấy anh ta chạy về phía nó. Nhưng sau một thời gian, khách hàng này có thể nói với máy chủ rằng nó đã đi về phía ngọn đồi. WoW sẽ kiểm tra xem khoảng cách giữa các tọa độ truyền cuối cùng và các tọa độ hiện tại có khớp với phân đoạn thời gian hay không và chấp nhận điều đó.

Sử dụng UDP so với TCP

Trong các phiên bản đầu tiên, chúng tôi đã sử dụng UDP để giảm chi phí hoạt động của TCP. Chúng tôi tự xử lý các gói bị mất. Điều này làm việc hoàn hảo vào những ngày đầu của dự án. Nhưng khi máy chủ được chuyển từ một số kết nối DSL gia đình sang một trung tâm dữ liệu thực sự vài năm trước, chúng tôi đã gặp phải những vấn đề lớn. UDP là (hoặc ít nhất là 5 năm trước) cực kỳ đòi hỏi sức mạnh CPU của phần cứng tường lửa: Bộ quy tắc phải được áp dụng cho mọi gói UDP duy nhất. Tuy nhiên, đối với TCP, bộ quy tắc chỉ được áp dụng cho 3 gói đầu tiên. Sau đó, kết nối được thiết lập. Tất cả các gói sau sẽ bỏ qua bộ quy tắc thông thường vì chúng nằm trong bảng theo dõi kết nối hoặc vì chúng không có cờ SYN.

Làm thế nào để bảo vệ thông tin liên lạc và khách hàng từ kỹ thuật đảo ngược?

Arianne là nguồn mở hoàn toàn, bao gồm máy khách, máy chủ, đồ họa, âm nhạc. Và tất nhiên bao gồm tài liệu giao thức của chúng tôi và thậm chí một bộ phân tích được sử dụng để gỡ lỗi.

Thật dễ dàng để bảo vệ thông tin liên lạc chống lại việc đánh hơi trái phép bởi các bên thứ ba sử dụng SSL.

Tuy nhiên, không thể bảo vệ nó trước kỹ thuật đảo ngược. Chắc chắn bạn có thể che giấu nó và sử dụng các kỹ thuật chống gỡ lỗi. Nhưng cuối cùng, bạn không thể ngăn chặn kỹ thuật đảo ngược của phần mềm mà bạn dành cho người dùng. Có một bài trình bày rất thú vị về cách Skype được thiết kế đảo ngược mặc dù các nhà phát triển đã nỗ lực rất nhiều vào các kỹ thuật chống gỡ lỗi: http://recon.cx/en/f/vskype-part1.pdf

Lưu ý: Có một số quốc gia trong đó kỹ thuật đảo ngược là bất hợp pháp hoặc cho phép đưa một đoạn vào giấy phép hoặc ToS không cho phép kỹ thuật đảo ngược. Nhưng có những quốc gia khác (như quốc gia tôi đang sống) rõ ràng cho phép kỹ thuật đảo ngược trong bối cảnh phát triển các định dạng lưu trữ dữ liệu tương thích hoặc các giao thức truyền, các đoạn trong giấy phép hoặc ToS đang cố gắng không cho phép bị vô hiệu. (Mọi thứ trong phần này theo như tôi biết, tôi không phải là luật sư)

Những thứ nào nên được tính cục bộ và những thứ trên máy chủ?

Chúng tôi tính toán mọi thứ liên quan đến logic trò chơi trên máy chủ. Khách hàng sẽ dự đoán một số sự kiện để trò chơi diễn ra suôn sẻ. Nhưng cuối cùng thì máy chủ luôn đúng.

Các sự kiện được dự đoán là ví dụ dừng di chuyển khi va chạm xảy ra. Stendhal sử dụng lưới để định vị các yếu tố. Và theo quan điểm của máy chủ, góc trên cùng bên trái của mỗi thực thể nằm trên chính xác một ô vuông. Nhưng khách hàng sẽ di chuyển chúng xung quanh trơn tru giữa các gạch. Nó cũng sẽ vẽ hiệu ứng giả 3d. Vì vậy, một thực thể có cơ sở 1x1 có thể cao hơn trong máy khách.

Làm thế nào để cân bằng các vấn đề tải?

Cố gắng giữ điều này đơn giản nhất có thể, để dễ bảo trì.

Cân bằng tải của nội dung tĩnh được biết đến trong lĩnh vực cụm máy chủ http và mạng phân phối nội dung.

Một khái niệm khá đơn giản để cân bằng tải các dịch vụ trò chơi là phân chia máy chủ giữa các vùng / vùng. Vì vậy, vùng AC nằm trên một máy chủ và vùng DF nằm trên một máy chủ khác. Điều này đặc biệt dễ dàng nếu bạn không thể nhìn từ vùng này sang vùng khác trong vùng khác. Bạn cần đặt một số kiểm tra vào đó để khách hàng chỉ có thể kết nối với máy chủ khu vực chịu trách nhiệm về khu vực mà người chơi đang ở.

Cách dễ nhất để chuyển người chơi từ máy chủ này sang máy chủ khác là ghi chúng vào cơ sở dữ liệu, yêu cầu khách hàng kết nối với máy chủ khu vực khác và ngắt kết nối họ khỏi máy chủ hiện tại. Sau đó, máy khách sẽ kết nối với máy chủ vùng mới sẽ tải nó từ cơ sở dữ liệu. (Vì dù sao bạn cũng cần tải từ / store đến mã cơ sở dữ liệu, nên việc liên lạc trực tiếp giữa các máy chủ để bàn giao có thể được thực hiện sau).

Một số dịch vụ toàn cầu bổ sung là cần thiết thông qua: Khi đăng nhập, khách hàng phải được yêu cầu kết nối với máy chủ khu vực chính xác. Và bạn có thể muốn một hệ thống trò chuyện trên toàn thế giới.

Tôi đã đi vào chi tiết về chủ đề này tại Làm thế nào cân bằng tải đạt được trong MMO?


1
Bạn đã đề cập rằng UDP yêu cầu CPU nhiều hơn một chút, nhưng bạn đã không đề cập rằng TCP yêu cầu ít nhất ba chuyến đi giữa máy khách và máy chủ trước khi gói được xử lý, VÀ các gói được đệm cho đến khi tất cả các gói trước đó được nhận, có nghĩa là bạn có thể gặp phải sự lố bịch số lượng độ trễ chờ đợi cho các gói không còn phù hợp. Có vẻ như một điều quan trọng cần đề cập.
BlueRaja - Daniel Pflughoeft

2
@Danny, Có ba gói cần thiết để bắt đầu kết nối TCP mới: máy khách đến máy chủ: SYN, máy chủ đến máy khách: SYN ACK, máy khách đến máy chủ: dữ liệu ACK +. Đó là một chuyến đi khứ hồi nhiều hơn UDP, nhưng nó chỉ xảy ra ngay từ đầu khi máy khách liên lạc với máy chủ lần đầu tiên. Trong một kết nối được thiết lập, mọi gói được xử lý ngay lập tức mà không cần thêm bất kỳ chuyến đi khứ hồi nào. Sẽ có câu trả lời ACK nhưng dữ liệu nhận được đã được xử lý trong khi các gói ACK di chuyển trở lại.
Hendrik Brummermann

1
@Danny, TCP xử lý mất gói tự động và theo cách khá hiệu quả. Thật khó để thực hiện lại rằng bạn sử dụng UDP; trừ khi giao thức của bạn ổn với các gói không được gửi ngẫu nhiên. Vấn đề tiếp theo là TCP đảm bảo rằng thứ tự của các gói, trong khi các gói UDP có thể được nhận theo thứ tự sai. Một lần nữa, thật khó để tự thực hiện lại điều đó, trừ khi bạn chỉ có thể bỏ qua các gói cũ hơn dựa trên bộ đếm gói. Nếu cần thời gian phản hồi rất ngắn cho TCP, thuật toán của Nagle cần phải bị vô hiệu hóa.
Hendrik Brummermann

Có vẻ như bạn đã bảo vệ vị trí của mình một cách kịch liệt mà không giải quyết vấn đề độ trễ TCP rất thực. Có lẽ vấn đề thực sự là sự lựa chọn của bạn về tường lửa phần cứng thay vì giao thức kháng DDoS
MickLH

27

http://gafferongames.com/networking-for-game-programmer/

Là một tập hợp lớn các bài viết về các vấn đề và giải pháp khác nhau liên quan đến mạng trò chơi.


1
+1, nhưng xin đừng tin tưởng họ một cách mù quáng. Theo kinh nghiệm của tôi, ví dụ, không nên sử dụng UDP và phát minh lại tính năng của TCP. CẬP NHẬT chỉ hữu ích nếu các gói bị mất hoàn toàn không có bất kỳ tác động nào, tức là mọi gói UDP đều chứa trạng thái hoàn toàn phù hợp trên thế giới. WoW sử dụng TCP, SL đang trong quá trình chuyển từ UDP sang TCP (thậm chí HTTP cho nội dung tĩnh) và đã cải thiện hiệu suất đáng kể với những thay đổi này.
Hendrik Brummermann

7
Tuy nhiên, bạn không phát minh lại các tính năng TCP, ít nhất là tất cả chúng. Kiểm soát luồng TCP và ngữ nghĩa mất gói là khủng khiếp đối với một trò chơi yêu cầu kết nối độ trễ thấp. TCP chỉ hữu ích nếu bạn không quan tâm đến độ trễ hoặc giảm thiểu băng thông cần thiết.
jsimmons

2
Cuộc sống thứ hai cải thiện hiệu suất một cách ồ ạt bằng cách chuyển từ UDP sang HTTP qua TCP: blog.secondlife.com/community/t Technology / blog / 2010/08/13 / Giả
Hendrik Brummermann

5
Thật ra, họ đã cải thiện hiệu suất phát trực tuyến tài sản của mình bằng cách thay đổi cách thức hoạt động. Sử dụng HTTP / TCP trong trường hợp đó giúp họ thực hiện dễ dàng hơn, không nhanh hơn. Tôi cũng có thể lưu ý rằng zeromq là một dự án thú vị và nó có thể mở rộng rất độc đáo cho mạng trò chơi. zeromq.org
jsimmons

8

Tùy thuộc vào loại trò chơi bạn đang viết, bạn có thể tránh được một số chương trình mạng cấp thấp. Một số loại trò chơi không yêu cầu nhiều giao tiếp qua lại giữa máy khách và máy chủ. Trong những trường hợp như vậy, người ta có thể chọn sử dụng khung mức cao hơn. Ví dụ: tôi đang phát triển một trò chơi chiến lược theo lượt trong C # /. NET. Trò chơi chiến lược theo lượt có phần độc đáo ở chỗ phần lớn giao tiếp máy khách / máy chủ xảy ra ở đầu và cuối lượt, với tương đối ít ở giữa. Do đó, tôi đã chọn sử dụng Windows Communication Foundation (WCF), một khung giao tiếp cấp cao được thiết kế chủ yếu cho các dịch vụ web. Thay vì làm việc trực tiếp với các socket và tất cả các gunk mạng cấp thấp đó, tôi có thể thực hiện những gì có vẻ là các cuộc gọi phương thức tiêu chuẩn, và để WCF xử lý các giao thức và các lớp vận chuyển cho tôi. Lần duy nhất tôi phải đối phó với các công cụ mạng cấp thấp là khi tôi định cấu hình các điểm cuối của mình, đây là giao dịch một lần trong tệp cấu hình. Có thể vẫn cần phải thực hiện một số logic tuần tự hóa tùy chỉnh, nhưng bạn cần phải thực hiện loại điều đó bất kể.


8

Câu hỏi quá rộng. Các câu trả lời có thể tự điền vào một trang web. Nhưng, có những cuốn sách chạm vào điều này, chủ yếu là hai cuốn này:

Lưu ý rằng ngay cả những cuốn sách này không phải là một hướng dẫn hoàn chỉnh, mà thay vào đó là một tập hợp các ý tưởng và phương pháp bạn có thể sử dụng, một số trong đó sẽ không hoạt động cùng nhau, hoặc thậm chí trái ngược nhau. Thông thường, nó giả định một số kinh nghiệm phát triển trò chơi, ứng dụng mạng hoặc lý tưởng là cả hai.

(Lưu ý rằng tôi đang nói nhiều hơn về các MMO trong câu hỏi ban đầu - một 'trò chơi mạng' có thể có nghĩa là tất cả mọi thứ từ một trò chơi văn bản dựa trên PHP cho đến MMO và các câu hỏi phụ ở trên không phải là tất cả áp dụng cho từng loại.)


7

Làm thế nào để cân bằng các vấn đề tải?

kích thước địa lý cố định + nhiều trường hợp là giải pháp dễ nhất. Những người làm việc trên SWG đã thử kích thước động và hối tiếc.

Làm thế nào để quản lý trạng thái trò chơi?

Máy chủ có thẩm quyền.

Làm thế nào để giữ cho mọi thứ được đồng bộ?

Cập nhật đồng bộ định kỳ từ máy chủ. (không chắc chắn những gì quan tâm ở đây)

Làm thế nào để bảo vệ thông tin liên lạc và khách hàng từ kỹ thuật đảo ngược?

Không thể nào. chỉ cần đảm bảo rằng bạn không tin tưởng bất cứ điều gì bạn nhận được từ khách hàng và máy chủ đó có thẩm quyền.

Làm thế nào để giải quyết các vấn đề về độ trễ?

Điều này đi dặm sâu, nhưng một cách hời hợt bạn chạy các mô phỏng tương tự trên máy khách như máy chủ và khi đồng bộ xảy ra, sửa chữa mọi thứ. Tất cả các quyết định được thực hiện trên máy khách cũng được mô phỏng trên máy chủ, do đó có thể có các quyết định tồi, nhưng mọi thứ thường được giải quyết.

Những thứ nào nên được tính cục bộ và những thứ trên máy chủ?

Hãy nghĩ về khách hàng như đang chạy một sim không có thẩm quyền về những gì đang diễn ra trên máy chủ. Sự đáp ứng là chìa khóa cho trải nghiệm của người chơi, vì vậy bạn phải làm gì đó mỗi khi người chơi đưa ra quyết định, ngay cả khi đó chỉ là bắt đầu một thanh.

Sự thật mà nói, rất nhiều trong số những vấn đề này là trực giao, và có thể có các giải pháp được áp dụng sau này. Chỉ cần bắt đầu làm trò chơi và đừng lo lắng quá nhiều về những điều này.


4

Câu hỏi này rất rộng. Đây cũng là một lĩnh vực rất khó để thành thạo, các lập trình viên mạng được tìm kiếm rất nhiều trong ngành với mức lương phù hợp, điều này cho thấy đây là khu vực 'không giải quyết'. Có những cuốn sách ngoài đó, vâng, rất nhiều. Có những cuốn sách tốt ngoài đó, không có nghi ngờ. Có những cuốn sách ngoài đó sẽ trả lời câu hỏi của bạn? ... Tôi không nghĩ vậy. Họ có thể có giải pháp hoạt động trong một số tình huống hoặc gợi ý những gì cần tìm, nhưng hầu như tất cả các câu hỏi của bạn đều phụ thuộc vào trò chơi .... đây là một lĩnh vực mà bạn thực sự sẽ phải tự mình làm việc rất nhiều, dường như đó là tầm thường và nó có thể đi sai trong rất nhiều cách (không kiểm soá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.