Tần suất để lưu trạng thái của người chơi trong các trò chơi trực tuyến liên tục?


9

Trong các trò chơi trực tuyến, mọi người thích đăng nhập và tắt bất cứ khi nào họ muốn. Thông thường, thành tích trò chơi của họ được lưu liền mạch, trên máy chủ. Điều đó không khó để đạt được, nhưng tôi tự hỏi làm thế nào có thể được thực hiện một cách hiệu quả có ý nghĩa và sẽ mở rộng quy mô.

Liệu nó có ý nghĩa để lưu tọa độ và trạng thái của người chơi với mỗi lần họ gửi nó không? Máy chủ node.js của tôi có thể thực hiện điều đó một cách dễ dàng mà không cần chặn phản hồi và tôi muốn sử dụng cơ sở dữ liệu Mongo, nhưng có lẽ nên làm điều đó một lần trong một giây và trong một sự kiện toàn máy chủ, thu thập tất cả cùng một lúc?


Tôi lưu trạng thái trò chơi cứ sau 10 giây. Tôi nghĩ thế là đủ, nó không được chú ý (và tôi đang chạy máy chủ MMORPG của mình trên netbook có 512Mb RAM).
jcora

Câu trả lời:


10

Tôi có một MMORPG truyền thống như World of Warcraft.

Lưu sau mỗi lệnh từ mỗi người chơi và điều tự trị (ví dụ: NPC)

  • Sao lưu liên tục. Máy chủ có thể ngừng hoạt động bất cứ lúc nào và trạng thái của trò chơi được lưu đến thời điểm đó (hoặc càng gần đây càng tốt, dù sao đi nữa).
  • Tác động đến hiệu suất máy chủ; ngay cả khi nó không chặn (tức là trên một luồng khác), ngay cả khi cơ sở dữ liệu nằm trên một máy chủ khác, nó vẫn đang xử lý mà bạn sẽ không làm. Nếu nó không chặn như bạn nói, thì một luồng khác phải xử lý nó và đó là một luồng có thể bị chiếm dụng bởi thứ khác.
  • Tăng I / O đĩa, do đó làm tăng rủi ro / tỷ lệ thất bại. Điều này đặc biệt đáng quan tâm nếu bạn đang sử dụng SSD để lưu trữ, với tuổi thọ thấp hơn.
  • Nếu bạn giảm tải cơ sở dữ liệu sang máy chủ khác, thì băng thông sẽ tăng lên; điều này có thể là một mối quan tâm nếu bạn đang trả tiền cho băng thông và nếu nó không nằm trên một card mạng riêng thì nó sẽ chiếm các tài nguyên có thể được sử dụng tốt hơn để sử dụng xử lý lưu lượng người chơi.
  • Điều gì xảy ra nếu máy chủ ngày càng bị chậm lại trong việc lưu trạng thái của các lệnh này? Tức là nếu nhiều lệnh đến hơn có thể được lưu, vì vậy chúng chồng chất trong một hàng đợi? Có hàng đợi này tràn và gây ra một lỗi? Bạn có dừng mọi thứ để hàng đợi có thể bắt kịp?
  • Dường như với tôi rằng cách tiếp cận này, trong khi nghe có vẻ đơn giản, sẽ cần phải được lên kế hoạch cẩn thận. Ví dụ, các lệnh liên tiếp dựa vào nhau sẽ cần phải được lưu cùng nhau; mặt khác, một lỗi có thể xảy ra ở giữa các lệnh và chỉ một cái sẽ được lưu chứ không phải cái khác. Xem xét nếu hai người chơi thực hiện giao dịch và hai lệnh được lưu vào đĩa: "thêm 1 mục vào người nhận" và "trừ 1 mục từ người gửi". Nếu một lỗi xảy ra sau lệnh đầu tiên nhưng trước khi lệnh thứ hai được lưu, bạn có một mục trùng lặp. (nếu đơn hàng bị đảo ngược, thì bạn có một mặt hàng bị mất)

Lưu mọi thứ định kỳ

  • Trong trường hợp thất bại, máy chủ sẽ hơi lỗi thời. Hy vọng rằng bạn sử dụng một cái gì đó giống như một cách tiếp cận được ghi nhật ký, vì vậy ảnh chụp nhanh gần đây nhất ít nhất sẽ là toàn bộ và nhất quán, và tất cả những người chơi đang hoạt động được đặt lại theo cùng một khoảng thời gian.
  • Bất kỳ hệ thống cơ sở dữ liệu nào bạn sử dụng có thể có tối ưu hóa để cập nhật hàng loạt, hiệu quả hơn (ít chi phí hơn) so với cập nhật cùng một lúc.
  • Nếu bạn chọn thay thế cho một hệ thống tệp nhị phân, phương pháp này rất đơn giản. Tạo một tệp mới, kết xuất bộ nhớ vào nó, ném một điểm đánh dấu vào cuối mà báo hiệu rằng bản sao lưu đã được hoàn thành. Khi một bản sao lưu hoàn tất, hãy xóa bản sao lưu trước đó (hoặc không).
  • Quá trình sao lưu cũng có thể cần tính đến những thứ được đề cập trong điểm đạn cuối cùng của phần khác, chẳng hạn như lưu ở giữa các lệnh liên tiếp không nên bị phá vỡ. Bạn có thể chọn khóa toàn bộ tập hợp dữ liệu, đổ dữ liệu vào đĩa và mở khóa, nhưng tùy thuộc vào thời gian sử dụng, nó có thể dẫn đến việc tạm dừng hoặc làm chậm quá nhiều trò chơi.

Lưu một ký tự khi đăng xuất (không lưu bất cứ thứ gì khác)

  • Điều quan trọng nhất đối với người chơi là nhân vật của họ, bao gồm các vật phẩm họ có, các kỹ năng họ đã kiếm được, danh sách bạn bè của họ, v.v. Nếu họ giết một con quái vật và chiến lợi phẩm ở trên mặt đất trước mặt họ và sau đó máy chủ thất bại, họ sẽ hơi đau lòng khi không có cơ hội nhặt được chiến lợi phẩm của mình, nhưng họ sẽ vượt qua nó. Vì vậy, chỉ cần lưu những thứ quan trọng, và đừng đổ mồ hôi những thứ nhỏ nhặt. Đừng lưu các vị trí của NPC, ví dụ; nếu máy chủ ngừng hoạt động, khi nó hoạt động trở lại, chúng sẽ sinh ra ở khu vực chung mà chúng nên ở. Tất nhiên, ngoại lệ là cho bất kỳ NPC "thông minh" nào vì lý do nào đó cần phải ở lại nơi chúng cần là khi máy chủ ngừng hoạt động.
  • Hơn nữa, một người chơi không nên đăng nhập quá nhiều giờ cùng một lúc (lưu ý rằng ở đây tôi đang xem xét "quay trở lại sảnh" như đăng xuất). Cuối cùng họ sẽ cần nghỉ ngơi trong phòng tắm hoặc lấy thức ăn hoặc bị gián đoạn bởi cha mẹ / bạn bè / bất cứ điều gì hoặc ngủ. Vì vậy, họ thực sự không nên đăng nhập thực tế không ngừng nghỉ hơn 8 giờ đối với ngay cả những game thủ khó tính nhất. Nếu một "người chơi" được đăng nhập trong một khoảng thời gian thực sự dài, rất có thể đó là nhiều người hoặc một bot, và không ai là mong muốn hay bình thường.
  • Ngoài ra, quá trình đăng xuất của bạn đã được kiểm tra cho những thứ như các lệnh liên tiếp được đề cập ở trên. Về cơ bản, nó nên được đóng gói nhân vật, vì vậy rõ ràng đây là thời điểm tốt nhất để đưa nó vào đĩa.

Bớt tư tưởng

  • Rõ ràng tôi ủng hộ cách tiếp cận cuối cùng, nhưng tôi đã cố gắng không thiên vị về cả ba.
  • Thật khó để nói phương pháp nào trong hai phương pháp đầu tiên là lãng phí hơn. Với phương thức đầu tiên, nếu nhân vật gửi một số lệnh di chuyển, mỗi lệnh này sẽ được lưu vào đĩa và ghi đè, khi rõ ràng chúng có thể được đóng gói thành một. Nhưng với phương pháp thứ hai, nếu bạn có một nửa dân số đứng xung quanh, vị trí của họ sẽ được lưu vào đĩa ngay cả khi chúng giống hệt nhau kể từ hoạt động sao lưu cuối cùng. Trong trường hợp thứ ba, rất có khả năng ai đó có thể đăng nhập và đăng xuất ngay lập tức, nhưng thông thường, nhiều điều về người chơi sẽ thay đổi nên sự lãng phí có vẻ như sẽ rất nhỏ.
  • Hãy nhớ rằng điều này là hoàn toàn để sao lưu trong trường hợp thất bại, và một sự thất bại nên được giảm thiểu tuyệt đối. Thật tốt khi xử lý trường hợp ngoại lệ này, nhưng cuối cùng, nếu máy chủ bị lỗi, một số dữ liệu sẽ bị mất và một số người chơi sẽ buồn. Vì vậy, chỉ cần thực hiện bất kỳ phương pháp nào bạn có thể, bất cứ điều gì bạn nghĩ là đơn giản nhất hoặc tốt nhất, và tiếp tục.
  • Đừng dựa vào đây là lưu mặc định; đặt một nút tắt đẹp trên ứng dụng máy chủ của bạn, nó sẽ đóng các kết nối một cách duyên dáng và ghi mọi thứ vào cơ sở dữ liệu. Sử dụng nó trên cơ sở bình thường.

Cuối cùng, đừng coi lời khuyên này là sự thật tuyệt đối. Tôi chưa viết một hệ thống sao lưu nhiều người chơi. Tôi đang làm việc trên một "trò chơi" trực tuyến, đó là lý do tại sao tôi đã nghĩ về điều này và viết ra những suy nghĩ của tôi ở trên, nhưng tôi chưa đến giai đoạn thực hiện điều này. Vì vậy, điều này được viết mà không có kinh nghiệm thực tế, nhưng sau khi đọc và thu thập kiến ​​thức về chủ đề này.


4
Từ những gì cá nhân tôi đã quan sát thấy các MMO thương mại sử dụng kết hợp cả ba trong số này. Việc lưu trữ xảy ra sau các sự kiện và hành động quan trọng như giết sếp / cướp bóc / giao dịch, định kỳ để tránh các hành động không quan trọng bị bỏ lỡ (và không trừng phạt những người đăng nhập trong thời gian dài) và luôn luôn đăng xuất. Một phương pháp duy nhất thường không đủ. Hầu như tất cả các phương thức này đều dựa trên cơ sở dữ liệu kiểu SQL cơ bản được sao lưu và khôi phục trong suốt nếu có sự cố phần cứng.
NtscCobalt

@NtscCobalt - Tôi đã ở bên bạn cho đến khi "cơ sở dữ liệu kiểu SQL". SQL có thực sự là một yêu cầu không? Còn NoQuery thì sao?
beatgammit 15/03/13

@tjameson Vâng, bình luận của tôi đã được viết trước khi tôi chạm vào NoQuery. Tôi chỉ cố gắng nói rằng bạn không nên cuộn định dạng của riêng mình nhưng dù sao tôi vẫn khuyên dùng SQL vì bạn nên biết lược đồ trước (hoặc lười biếng và sử dụng Entity-Key-Value) và tính nhất quán quan trọng hơn khả năng phân vùng dữ liệu đó. Xem stackoverflow.com/questions/7339374/ trên để biết thêm thông tin.
NtscCobalt

1

Tôi cho rằng nó phụ thuộc vào loại trò chơi một lượng lưu lượng giữa người chơi và máy chủ.

Trong MMORPG, sẽ không có ý nghĩa gì khi lưu vị trí người chơi mỗi khi họ gửi thông tin đến máy chủ. Sẽ có ý nghĩa hơn khi cập nhật khi dữ liệu hiện tại của người chơi bị 'cũ', có thể nói là như vậy. Cũng có thể có ích khi cứu trạng thái của người chơi trong các sự kiện lớn như đi qua lãnh thổ mới, đánh bại ông chủ hoặc rời khỏi cửa hàng.

Trong một trò chơi theo lượt, chắc chắn sẽ có ý nghĩa để cứu trạng thái của người chơi mỗi khi họ kết thúc lượt chơi cũng như sau lượt của người chơi đối phương (tiết kiệm sức khỏe, hiệu ứng chính tả, v.v.).

Một lần nữa, câu trả lời phụ thuộc hoàn toàn vào quy mô và khả năng của máy chủ của bạn. Đó là tất cả về việc tìm kiếm sự cân bằng tốt nhất và tối ưu hóa càng nhiều càng tốt mà không làm giảm chất lượng.


1

Nếu mối quan tâm duy nhất của bạn là khi họ đăng xuất, thì một câu trả lời đơn giản là lưu vị trí của họ khi bất kỳ điều kiện nào cho họ không còn tồn tại trong thế giới trò chơi (do đăng xuất hoặc ngắt kết nối) xảy ra.

Mặc dù vậy, tôi sẽ cảnh giác với máy khách báo cáo với máy chủ vị trí của nó, hoặc ít nhất là không có một số hình thức kiểm tra vệ sinh phía máy chủ. Nếu bạn đã có sẵn vị trí này, bạn có thể lưu vị trí đó khi đăng xuất hoặc ngắt kết nối vì bạn không phải lo lắng về việc nhận bất kỳ dữ liệu nào từ khách hàng trực tiếp.


Vâng, do đó cần phải gửi các bản cập nhật thường xuyên cho máy chủ về các giá trị như vị trí và XP. Bạn càng để nó lâu, nó càng trở nên gây tranh cãi về việc người chơi có thực sự nâng cấp các đồng bằng được báo cáo hay không. Nếu bạn hạn chế các khoảng thời gian "đăng ký" đó, việc giám sát / kiểm soát sẽ dễ dàng hơn rất nhiều.
Kỹ sư

Vấn đề cho biết khi nào chính xác một người chơi đăng xuất trong một trò chơi trình duyệt chạy dài thực sự không phải là một vấn đề tầm thường.
Lanbo

Tôi đồng ý rằng nó không tầm thường, nhưng đó là vấn đề bạn phải giải quyết bằng cách này hay cách khác trong hầu hết các trò chơi, ngay cả khi chỉ quyết định khi hình đại diện của chúng không còn xuất hiện. Khi đã xong, việc móc vào kịch bản đó và lưu vị trí hợp lệ cuối cùng của họ là một vấn đề tương đối đơn giản.
Lunin
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.