ログインしたすべてのキャラクターをMMOに定期的に保存することのパフォーマンス上の利点は何ですか?


26

MMORPGSの大部分には、X時間ごとにすべてのキャラクターを保存するWorldsaveシステムがあります。理由はパフォーマンスだと思います。では、切断時にキャラクターを保存するよりもパフォーマンスの面で優れているのはなぜですか?


34
パフォーマンスのためではありません。より重要な正確さのためにパフォーマンスを少し犠牲にします。
メイソンウィーラー

ここで時間が本当に役立っていますか?私の知る限り、MMO内のすべてのアクションは即座に保存されます。アイテムを取得すると、そのアイテムは遅滞なくアカウントに追加されます。そうしないと、サーバーはそれを覚えてから5分後にそれを行う必要がありますが、メリットはありません。または、クライアントは5分後にそれを覚えて送信する必要があります。これにより、ハッキングが可能になります。5分で誰でも送信するデータを変更/追加できるからです。
うまくいけば

4
@HopefullyHelpfulいいえ、そうではありません。MMOのすべてのアクションはすぐにメモリに格納さますが、それは一時的なものです。すべてを永続ストレージに直接保存することは、SSDを使用する場合でもコストがかかりすぎます。データベースに直接保存するゲームであっても、データベース自体はそのデータをすぐにディスクに保存しません(または、少なくとも一貫性のあるデータではなくトランザクションログのみを保存します-これはクラッシュ時に再構築する必要があり、時間のビット)。しかし、切断時の保存は、別の理由-一貫性のために悪い考えです。
ルアーン

1
この質問は、リアルタイムではなく、間隔を置いてキャラクターを保存することのパフォーマンス上の利点に沿ったものになると思いました。
アンソニー

2
@Luaan:すべての状態変更を永続的なストレージに保存することは、機械的なHDDでも完全に可能です。(ビジーなサーバーではいくつか必要になる場合があります)。トリックは、個々のオブジェクトを更新しないことです。代わりに、トランザクションログ「Player(A).Inventory + = Object(B)」を保存します。定期的に完全な状態をフラッシュします。回復するには、最新の完全保存をリロードし、トランザクションログから最新のトランザクションを適用します。 '1つのファイルを連続して書き込むと、機械式HDDのピークパフォーマンスに達しますが、トランザクションログを適切なサイズに保つには、定期的な完全保存が必要です。
MSalters17年

回答:


66

これはパフォーマンスのためではありません。これはフェイルセーフです。世界が数分ごとに保存する場合、サーバーに何かが発生してシャットダウンすると、全員が数分しか進行しません。

切断時に保存することにより、サーバーに問題がある場合、ログオン後に行ったすべての作業がすべて失われます。(MMOで一般的であるように)特に長時間のプレイセッションでは、大量のデータが失われます。

大量のデータ損失のリスクを取り除くために、パフォーマンスを少し犠牲にします。

もちろん、プレーヤーデータをクライアントマシンに簡単に保存して、ネットワークトラフィックを削減できます。ここでの問題は、ハッキングに対して開かれていることです。ある人がチートの方法を考え出すと、それを共有し、全員がそれをやっています。


編集:として@Philippが、これはまた、アイテムを複製する機能を削除し、指摘しました。切断時保存システムでは、サーバーがクラッシュする前にトランザクションが行われ、クラッシュする前に1人がログアウトした場合、両方のプレイヤーはアイテムを削除するか複製するかのいずれかで、最後にログアウトした時点にロールバックされます。


コメントは詳細なディスカッション用ではありません。この会話はチャットに移動さました
ジョシュ

5

切断時にのみ保存される初期のシステムは、プレーヤーがアクティブな間も定期的に保存される傾向がありました。これらのシステム、通常はMUD(マルチユーザーダンジョン)では、キャラクターは定期的にファイルにダンプされるまでメモリに保持されていました。

これは、ユーザーが「キャンプ」せずに切断した場合、通常は最後に保存したときからいくつかの部屋が離れており、略奪品やXPなどの束が失われていることを意味します。その点では、コンソールRPGが今日どのようにプレイするかのように振る舞います(コンソールをオフにせずにゲームを保存するか、最後に保存してからすべてを失う必要があります)。

システムは本来の目的のために機能しました。キャラクターが互いにやり取りできなかったのは、おそらく、メッセージやアイテムを互いに送信できる「メール」システムを経由した場合を除きます。アイテムを失い、進行する可能性はかなり大きくなる傾向がありましたが、ほとんどの場合、一度に1人のキャラクターにしか影響しませんでした。

キャラクターが最終的に相互に直接やり取りできるようになったため、ワールドセーブ機能が実現しました。そのため、プレイしているすべてのキャラクターが一貫した状態でなければなりません。これはMUDシナリオでは問題ではありませんでした。アイテムまたは通貨の重複を招くような方法でシステムを悪用することは困難でしたが、初期のMMO MUDでは非常に簡単に実行できました。プレイヤーAはプレイヤーBにアイテムを与え、プレイヤーBは保存し、プレイヤーAは保存せずに切断します。インスタント複製。

Worldsaveはパフォーマンス上の利点ではありませんが、不正行為を防ぐように設計されています。worldsaveイベントが文字通り事前にアナウンスされたシステムでプレイしたことを思い出し、サーバーがすべてのファイルを更新している間、しばしばシステム全体を1分間ハングさせました。これにより不正行為は防止されましたが、これらのシステムのユーザーにとってはあまり便利ではありませんでした。

それが私たちを現状に導きます。現在、worldsave型の関数は使用していません。データベースを使用します。これにより、複製と削除を可能な限り最小限に抑えることができます。文字はデータベース内のレコードとして存在し、プレイヤー間の各トランザクションはリテラルデータベーストランザクションです。アクションが完全にコミットされるか、ロールバックされます。

システムの異常なバグがなければ、個々のキャラクターファイルを保存するメリット(迅速な保存時間)とワールドセービングのメリット(不正行為なし)が得られますが、どちらの欠点もありません(大きな進歩とアイテムの重複を失います)。

最新のMMOを設計するときは、データベースにストアドプロシージャを作成し、それらのプロシージャを使用してトランザクションを実行します。たとえば、2人のプレイヤー間で取引を行う場合、次のようになります。

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;

(注:このSQLは、実用的な方法で作成されたものではなく、単なる例にすぎません)。

このように、コミットの前にクラッシュがあった場合、システムはプレーヤー111とプレーヤー333がまだ元のアイテムを保持している状態にロールバックしますが、コミット後、取引は完了します。データベースで保証されているように、文字は同時に保存されるため、複製の機会はありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.