Máy chủ trò chơi C ++ phân tán sử dụng cơ sở dữ liệu


11

Máy chủ trò chơi theo lượt C ++ của tôi (sử dụng cơ sở dữ liệu) không chống lại số lượng khách hàng trung bình hiện tại (người chơi), vì vậy tôi muốn mở rộng nó thành nhiều (nhiều hơn một) số lượng máy tính và cơ sở dữ liệu mà tất cả các máy khách vẫn sẽ ở trong thế giới trò chơi đơn (các máy chủ sẽ phải giao tiếp với nhau và sử dụng nhiều cơ sở dữ liệu).

Có một số hướng dẫn / sách / tiêu chuẩn chung giải thích làm thế nào để làm điều đó một cách tốt nhất?

Câu trả lời:


8

Thuật ngữ MMO cho "vẫn còn trong một thế giới trò chơi" là một phân đoạn duy nhất . EVE trực tuyến là MMO lớn duy nhất cố gắng nhồi nhét mọi người chơi vào một mảnh vỡ duy nhất.

May mắn cho bạn, họ đã xuất bản một bài viết rất nhiều thông tin về cách họ làm điều đó.


(nguồn: gamasutra.com )

Các tin xấu. Bạn không thể áp dụng các kỹ thuật của EVE trực tuyến nói chung. Các giải pháp của họ hoàn toàn phù hợp với thể loại và cách thực hiện cụ thể của họ.
LƯU Ý : Đối với tất cả các mạng phân đoạn đơn siêu ưa thích của EVE trực tuyến, họ sử dụng một cơ sở dữ liệu. Họ không thể thiết kế một giải pháp thời gian thực phù hợp, có thể mở rộng cho các cơ sở dữ liệu phân tán.

Dù bằng cách nào, họ đã làm như thế nào để giúp bạn thiết kế giải pháp của riêng bạn. Hãy coi chừng, tuy nhiên, bạn đang cố gắng giải quyết một vấn đề rất khó khăn.

Thay vì phân phối máy chủ trò chơi của bạn, tôi sẽ đề nghị khám phá những con đường khác của bạn trước.

  • Hồ sơ máy chủ trò chơi của bạn.
    • Tối ưu hóa mã máy chủ của bạn để giảm gánh nặng CPU nếu đó là một vấn đề.
    • Tối ưu hóa giao thức giao tiếp giữa máy khách và máy chủ để cắt giảm cuộc trò chuyện mạng.
  • Tối ưu hóa máy chủ game thủ để truyền thông cơ sở dữ liệu.
    • chạy trình tối ưu hóa truy vấn sau đó thực hiện các thay đổi khi thích hợp.
    • cắt giảm tương tác DB xuống mức tối thiểu
  • Di chuyển DB sang một máy riêng.
    Điều này thường giúp một tấn. Giữ DB trên cùng một mạng cục bộ nếu có thể nhưng điều đó phải giúp máy chủ trò chơi của bạn trở nên mạnh mẽ hơn rất nhiều khi đó là thứ duy nhất chạy trên phần cứng máy chủ.

Làm thế nào để bạn xác định "chính"? Kingdom of Loathing sử dụng một mảnh vỡ duy nhất. Mọi người đều có chung mảnh vỡ Farmville. Cả Star Trek Online và Champions Online đều sử dụng mô hình phân đoạn đơn, nhưng khu vực không ổn định.

Thay vì sử dụng cơ sở dữ liệu SQL, bạn cũng có thể sử dụng giải pháp noQuery được thiết kế để phân cụm và bảo vệ, như MongoDB.
Phi

1
Các webgame @JoeWreschnig không phải là trò chơi thời gian thực, dễ dàng hơn nhiều ... Tôi không chắc có bao nhiêu người chơi làm Star Trek Online và Champions Online có ...
o0 '.

4

Bước đầu tiên của bạn là tách rời truy cập cơ sở dữ liệu trực tiếp từ máy chủ trò chơi và sử dụng phần mềm trung gian cụ thể sử dụng để chuẩn bị dữ liệu cho máy chủ của bạn (ví dụ: XML, JSON). Chúng có thể xử lý bất kỳ số lượng cơ sở dữ liệu nào và quan trọng hơn là có thể cung cấp cho bạn các tùy chọn bộ đệm cụ thể của ứng dụng. Cache bất cứ điều gì bạn có thể và cằn nhằn db chỉ khi bạn phải. Thực hiện các tìm nạp lớn và hiếm khi thay vì nhiều truy vấn nhỏ để đạt được hiệu suất tốt nhất có thể trong kịch bản của bạn.

Cơ sở dữ liệu bạn chọn cũng có thể cho phép bạn vận hành các cụm giúp dễ dàng mở rộng trên các tài nguyên cơ sở dữ liệu có sẵn và cung cấp kết quả của bạn nhanh hơn, nhưng đây là một chủ đề cần nhiều kinh nghiệm và quản trị viên cơ sở dữ liệu chuyên dụng để thiết lập và duy trì - và không hoàn toàn cho ngân sách độc lập.


1
Tất cả điều này nghe có vẻ ổn cho đến khi bạn cho rằng anh ta hy vọng sẽ có nhiều máy chủ truy cập vào một bộ dữ liệu - điều này có nghĩa là nếu không có sự phối hợp thêm, bộ nhớ cache của ứng dụng sẽ không đồng bộ dẫn đến lỗi trò chơi ở mức tốt nhất và mất dữ liệu ở mức tồi tệ nhất. Tôi không đồng ý với bất cứ điều gì bạn đã nói nhưng người đăng ban đầu cũng sẽ cần xem xét vấn đề nhất quán giữa các máy chủ trước khi tiếp tục.
Kylotan

Phần mềm trung gian là một đường hầm dữ liệu một mặt chịu trách nhiệm lưu trữ dữ liệu và cũng để cung cấp dữ liệu. Tuy nhiên, nó chỉ cung cấp dữ liệu cho máy chủ (không bao giờ cho máy khách) và máy chủ lưu trữ tất cả dữ liệu chủ liên quan đến trò chơi khi khởi động. Vì vậy, có thể có nhiều nguồn dữ liệu và nhiều người yêu cầu dữ liệu được kết nối bất cứ lúc nào. MMO tôi làm việc sử dụng sơ đồ này khá hiệu quả.
Konrad K.

Điều đó không giải thích cách bạn giải quyết vấn đề nhất quán giữa các máy chủ. Tại một số điểm, các máy chủ cần đồng bộ hóa dữ liệu với nhau hoặc bạn có điều kiện chủng tộc, biểu hiện là ngắt kết nối ngẫu nhiên, người chơi trùng lặp, vật phẩm bị lừa, nhiệm vụ bị mất, v.v.

Dữ liệu không bao giờ bị trùng lặp - tại mọi thời điểm chỉ có một máy chủ phụ trách một đối tượng nhất định và khi được yêu cầu, nó sẽ chuyển đối tượng đó sang máy chủ khác. Đối tượng là các kết nối máy khách cũng bao gồm đối tượng điều khiển trình phát. Tuy nhiên, điều này được thực hiện thông qua một máy chủ chính và được tranh luận giữa các máy chủ. Vì vậy, chúng tôi đang xử lý hai loại dữ liệu - xâm nhập cơ sở dữ liệu (mà bài đăng gốc của tôi liên quan) và các đối tượng trò chơi được tạo trong thời gian chạy và được truyền xung quanh trong một mmo nhiều máy chủ. Không ai trong số này sẽ rơi vào tình trạng đua hoặc bị trùng lặp ở cấp ứng dụng.
Konrad K.

3

Về máy chủ trò chơi: Một chiến lược phổ biến là sử dụng nhiều máy chủ trong đó mỗi máy chủ quản lý một phần của thế giới trò chơi. Mỗi người dùng thường chỉ cần biết về những gì đang xảy ra xung quanh nó, do đó, việc phân chia thế giới theo địa phương là điều hợp lý. Điều này không may trở nên phức tạp hơn rất nhiều khi bạn có một thế giới mở không có biên giới thay vì một thế giới bao gồm các khu vực kín và người chơi dịch chuyển tức thời giữa chúng. Khi bạn có một thế giới mở, bạn cần một cách để chuyển người chơi giữa các khu vực một cách liền mạch và một cách để đồng bộ hóa các khu vực gần biên giới giữa các máy chủ. Đó là một vấn đề khó khăn.

Về cơ sở dữ liệu: Cơ sở dữ liệu SQL thường có quy mô xấu. Chúng không được thiết kế để được phân phối. Nhưng hiện tại có một xu hướng khá mới về cơ sở dữ liệu NoQuery như MongoDB hoặc Cassandra được thiết kế để phân phối trên nhiều máy chủ. Chúng làm cho việc bổ sung dung lượng dễ dàng hơn nhiều chỉ bằng cách thêm nhiều máy chủ. Vậy tại sao tất cả các trò chơi lớn không chuyển sang chúng? Bởi vì:

  1. Cơ sở dữ liệu SQL tồn tại hơn 40 năm, những cơ sở dữ liệu NoQuery đó chỉ trong một vài năm. Vẫn chưa có nhiều bí quyết về cách sử dụng chúng một cách hiệu quả nhất và sự phát triển của chúng đang tiến triển nhanh chóng. Có rất nhiều sản phẩm cạnh tranh và hoàn toàn không tương thích trên thị trường, và không có dấu hiệu nào trong số chúng sẽ tồn tại và sẽ bị lỗi thời và ngừng sản xuất trong một vài năm. Hầu hết những người chơi lớn thích những thiếu sót đã biết của SQL hơn những rủi ro chưa biết của cơ sở dữ liệu NoQuery.
  2. Chúng hoạt động rất khác với cơ sở dữ liệu SQL và yêu cầu suy nghĩ lại toàn bộ chiến lược kiên trì của bạn. Điều này có thể dẫn đến những thay đổi mạnh mẽ trong toàn bộ kiến ​​trúc phần mềm của bạn.

Vì vậy, khi dự án của bạn đã rất tiến bộ, chuyển sang một giải pháp cơ sở dữ liệu khác có thể là một rủi ro lớn và đầu tư rất lớn về thời gian và năng lượng.


0

Không. Đây là một khu vực cực kỳ khó khăn chưa được giải quyết.


Có thể có một số giải pháp "mẫu" (không phải là "mẫu thiết kế C ++) của nó không? Có rất nhiều MMORPG.
Slav

2
Hầu hết các MMO được hỗ trợ bởi các thảm họa tuyệt đối cho cơ sở dữ liệu.

Cụ thể, MMO thường có cách tiếp cận rất khác nhau đối với tính bền vững dữ liệu của họ, thường hoạt động chấp nhận được cho thiết kế trò chơi của riêng họ nhưng không phải cho các thiết kế trò chơi khác. Vì thiết kế trò chơi là phần quan trọng nhất, bạn không thể chỉ định đầy đủ chiến lược phân phối và duy trì dữ liệu mà không cần một chiến lược. (Mà có thể được hiểu như: "Hỏi một câu hỏi cụ thể hơn, kể cho chúng tôi những gì sắp xếp dữ liệu mà bạn có, mức độ thường xuyên nó thay đổi, và tại sao bạn nghĩ rằng bạn muốn phân phối một thế giới duy nhất trên nhiều máy chủ.")
Kylotan

0

Tôi biết điều này đã cũ nhưng ....

Thực tế có hai lĩnh vực để tập trung vào việc này.

Bạn cần phân phối ứng dụng của bạn trên một số máy chủ. Bạn cần phân phối cơ sở dữ liệu của bạn trên một số máy chủ.

Và bạn cần phải có dự phòng cho cả hai.

Có một số giải pháp nguồn mở cho việc này. Farmville là một ví dụ điển hình khi sử dụng MemQuery / Couchbase.


1
Phân phối cơ sở dữ liệu trên nhiều máy chủ chắc chắn là một vấn đề được giải quyết. Thật không may, nó thường không phải là một yêu cầu quan trọng đối với các trò chơi trực tuyến giữ cho truy cập DB của họ ở mức tối thiểu. Ngược lại, phân phối lối chơi thực tế trên nhiều máy chủ vẫn không phải là vấn đề được giải quyết.
Kylotan
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.