Hiệu suất của việc lưu tất cả các ký tự đã đăng nhập trong MMO theo định kỳ là gì?


26

Phần lớn các game MMORPG có hệ thống Worldsave sẽ lưu tất cả các nhân vật một lần sau mỗi X giờ. Tôi đoán lý do là hiệu suất. Vậy tại sao điều này tốt hơn, hiệu suất khôn ngoan hơn là cứu một nhân vật bị ngắt kết nối?


34
Nó không dành cho hiệu suất; đó là hy sinh một chút hiệu suất cho tính chính xác , điều này quan trọng hơn.
Mason Wheeler

Thời gian có thực sự đóng vai trò nào ở đây không? AFAIK, mọi hành động trong một mmo được lưu ngay lập tức. Bạn nhận được một mục và mục đó được thêm vào máy chủ mà không bị chậm trễ vào tài khoản của bạn, nếu không máy chủ sẽ phải nhớ rằng bạn đã làm điều đó và sau đó thực hiện 5 phút sau đó, không có lợi ích gì. Hoặc khách hàng sẽ phải nhớ và gửi nó 5 phút sau, điều này sẽ mở ra cho bạn hack, vì trong 5 phút đó, bất kỳ ai cũng có thể thay đổi / thêm dữ liệu để gửi.
Hy vọng hữu ích

4
@Hop HopeHelpful Không, điều đó không đúng. Mọi hành động trong MMO đều có trong bộ nhớ ngay lập tức, nhưng đó chỉ là nhất thời. Tiết kiệm mọi thứ trực tiếp vào bộ nhớ liên tục vẫn còn quá đắt, ngay cả với SSD. Ngay cả với các trò chơi lưu trực tiếp vào cơ sở dữ liệu, cơ sở dữ liệu cũng không lưu dữ liệu đó vào đĩa ngay lập tức (hoặc ít nhất chỉ lưu nhật ký giao dịch, không phải dữ liệu nhất quán - điều này cần phải được xây dựng lại khi gặp sự cố và mất khá nhiều một chút thời gian). Nhưng tiết kiệm khi ngắt kết nối là một ý tưởng tồi vì một lý do khác - tính nhất quán.
Luaan

1
Tôi nghĩ rằng câu hỏi này sẽ đi sâu hơn về lợi ích hiệu suất của việc lưu các ký tự trong khoảng thời gian so với trong thời gian thực.
Anthony

2
@Luaan: Hoàn toàn có thể lưu mọi thay đổi trạng thái vào bộ nhớ liên tục, ngay cả trên ổ cứng cơ học. (Bạn có thể cần một vài máy chủ bận rộn). Bí quyết là không cập nhật các đối tượng riêng lẻ. Thay vào đó, bạn lưu nhật ký giao dịch "Người chơi (A) .Inventory + = Object (B)`. Định kỳ bạn xả toàn bộ trạng thái. Để khôi phục, bạn tải lại toàn bộ lưu mới nhất và áp dụng các giao dịch mới nhất từ ​​nhật ký giao dịch. Đang viết một tệp tuần tự, bạn đạt hiệu suất cao nhất cho ổ cứng cơ. Nhưng để giữ nhật ký giao dịch có kích thước hợp lý, bạn cần lưu toàn bộ định kỳ.
MSalters

Câu trả lời:


66

Đây không phải là hiệu suất. Đây là một sự không an toàn. Nếu thế giới tiết kiệm cứ sau vài phút, thì nếu có gì đó xảy ra với máy chủ và nó tắt thì mọi người sẽ chỉ mất vài phút tiến bộ.

Bằng cách lưu vào ngắt kết nối, nếu máy chủ gặp sự cố, mọi người sẽ mất mọi thứ họ đã làm kể từ khi đăng nhập. Đối với những người trong các phiên chơi đặc biệt dài (như thường thấy trong MMO), họ sẽ mất một lượng dữ liệu đáng kể.

Họ hy sinh một chút hiệu suất để loại bỏ nguy cơ mất dữ liệu hàng loạt.

Tất nhiên, bạn có thể dễ dàng lưu trữ dữ liệu trình phát trên máy khách, giảm lưu lượng mạng. Vấn đề ở đây là nó được mở để hack. Một khi một người tìm ra cách gian lận, họ chia sẻ nó và mọi người đang làm điều đó.


EDIT: Như @Philipp đã chỉ ra, điều này cũng loại bỏ khả năng sao chép các mục. Với hệ thống ngắt kết nối nếu giao dịch được thực hiện trước khi máy chủ gặp sự cố và một người đăng xuất trước khi gặp sự cố, cả hai người chơi sẽ quay trở lại lần cuối họ đăng xuất, xóa các mục hoặc sao chép chúng.


Bình luận không dành cho thảo luận mở rộng; cuộc trò chuyện này đã được chuyển sang trò chuyện .
Josh

5

Các hệ thống ban đầu chỉ lưu khi ngắt kết nối cũng có xu hướng lưu theo định kỳ trong khi trình phát đang hoạt động. Trong các hệ thống đó, điển hình là MUD (Dungeon nhiều người dùng), ký tự được duy trì trong bộ nhớ cho đến khi chúng được định kỳ đổ vào một tệp.

Điều này có nghĩa là nếu người dùng bị ngắt kết nối mà không "cắm trại", họ thường thấy mình cách một vài phòng và thiếu một đống chiến lợi phẩm, XP, v.v., từ lần cuối họ lưu. Về mặt đó, nó hoạt động rất giống với cách chơi game nhập vai console ngày nay (bạn phải lưu trò chơi của mình mà không tắt bảng điều khiển hoặc bạn mất tất cả mọi thứ kể từ lần cuối bạn lưu).

Hệ thống hoạt động đúng với mục đích của nó, bởi vì các nhân vật không thể tương tác với nhau, ngoại trừ có thể bằng hệ thống "thư" nơi họ có thể gửi tin nhắn và vật phẩm cho nhau. Cơ hội mất vật phẩm và tiến triển có xu hướng khá đáng kể, nhưng chỉ ảnh hưởng đến một nhân vật tại một thời điểm trong hầu hết các trường hợp.

Tính năng worldsave xuất hiện do các nhân vật cuối cùng có thể tương tác trực tiếp với nhau, vì vậy tất cả các nhân vật đang chơi phải ở trạng thái nhất quán, hoặc có thể xảy ra sự trùng lặp và xóa vật phẩm. Đây không phải là một vấn đề trong kịch bản MUD, bởi vì rất khó để lạm dụng hệ thống theo cách dẫn đến trùng lặp vật phẩm hoặc tiền tệ, nhưng nó cực kỳ dễ thực hiện trong MUD MMO đầu tiên. Người chơi A cung cấp cho người chơi B một vật phẩm, người chơi B lưu và người chơi A ngắt kết nối mà không lưu. Sao chép ngay lập tức.

Worldsave không là một lợi ích hiệu suất, nhưng được thiết kế để ngăn chặn gian lận. Tôi nhớ lại việc chơi trên các hệ thống mà sự kiện worldsave đã được thông báo trước theo nghĩa đen và thường treo toàn bộ hệ thống trong một phút trong khi máy chủ cập nhật tất cả các tệp của nó. Mặc dù điều này ngăn chặn gian lận, nhưng nó không thuận tiện cho người dùng của các hệ thống này.

Điều đó dẫn chúng ta đến tình trạng hiện tại. Ngày nay, chúng ta không sử dụng các hàm kiểu worldsave. Chúng tôi sử dụng cơ sở dữ liệu. Điều này cho phép chúng tôi đảm bảo rằng việc sao chép và xóa được giảm thiểu tối đa có thể. Các ký tự tồn tại dưới dạng bản ghi trong cơ sở dữ liệu và mỗi giao dịch giữa các người chơi là một giao dịch cơ sở dữ liệu theo nghĩa đen; hoặc hành động được cam kết đầy đủ hoặc nó sẽ được khôi phục.

Chặn các lỗi bất thường trong hệ thống, bạn sẽ nhận được lợi ích của việc lưu các tệp ký tự riêng lẻ (thời gian lưu nhanh) và lợi ích của worldsaves (không gian lận), mà không có nhược điểm nào (mất tiến trình đáng kể và sao chép vật phẩm).

Khi thiết kế MMO hiện đại, bạn sẽ muốn tạo các thủ tục được lưu trữ trong cơ sở dữ liệu và sử dụng các quy trình đó để thực hiện các giao dịch. Ví dụ: khi thực hiện giao dịch giữa hai người chơi, nó có thể trông như thế này:

start transaction;
insert into inventory (playerid, itemid) values (111, 222);
delete from inventory where playerid=111 and itemid=444;
insert into inventory (playerid, itemid) values (333, 444);
delete from inventory where playerid=333 and itemid=222;
commit;

(Lưu ý: SQL này, không được viết theo cách thực tế và chỉ có nghĩa là một ví dụ).

Theo cách này, nếu có sự cố trước khi cam kết, hệ thống sẽ quay trở lại trạng thái mà người chơi 111 và người chơi 333 vẫn có các vật phẩm ban đầu, trong khi sau khi cam kết, giao dịch được hoàn thành. Không có cơ hội sao chép, vì các ký tự được lưu cùng lúc, như được đảm bảo bởi cơ sở dữ liệu.

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.