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?