3

元の開発者の許可を得て、Javaで古いBBSMUDゲームを再実装しています。現在、ゲームロジックにはEJBセッションファサード、永続性にはJPAを備えたJavaEE6を使用しています。セッションBeanを選んだ大きな理由はJTAです。

私は、OptimisticLockExceptionが発生した場合にそれをキャッチして、データが古く、再適用/再送信する必要があることをユーザーに通知するWebアプリの経験が豊富です。マルチユーザーゲームで常に「再試行」と応答すると、ひどい経験になります。戦闘中に複数の人が1つのモンスターをターゲットにすることを期待していることを考えると、OptimisticLockExceptionの可能性は高いと思います。

telnet CLIを提示する部分である私のビューコードは、EJBクライアントです。PersistenceExceptionsとTransactionRolledbackLocalExceptionsをキャッチして、再試行する必要がありますか?いつ停止するかをどのように決定しますか?

悲観的なロックに切り替える必要がありますか?

すべてのユーザーコマンドが過剰に殺された後も持続していますか?全世界をRAMにロードし、数分ごとに状態をダンプする必要がありますか?

セッションファサードをチョークポイントとして機能するEJB3.1シングルトンにして、あらゆるタイプのJPAロックを実行する必要をなくしますか?EJB 3.1シングルトンは、マルチリーダー/シングルライターデザインとして機能します(メソッドにリーダーおよびライターとして注釈を付けます)。

基本的に、再送信/再試行のプロンプトをユーザーに提示することが受け入れられないアプリケーションで、データの同時変更に最適な設計とJavaPersistenceAPIは何ですか?

4

2 に答える 2

4

単純な問題であるべきことをあなたが非常に複雑にしすぎていると感じずにはいられません。

商用で成功しているMMOは、多くの場合、次のようなアプローチを取ります。

Every few minutes or after a significant action:
    copy the player data
    pass the player data to a background thread

In the background thread:
    write each piece of player data to the database

各プレーヤーがデータベースの異なる行に自分のデータを保存するため、「高度に同時」のデータ変更はありません。(場合によっては、これは文字通り1行です。いくつかの商用ゲームはプレーヤーデータをユーザーIDに対するBlobとして保存するだけです。)データが少し古くなっていることもありますが、それは重要ではありません。サーバーがクラッシュした場合にのみ問題になります。そうしないと、最終的に現在の状態がDBに取り込まれるためです。これは、私たちが話している銀行間クレジット転送ではありません。

MUDとBBSゲームに関しては、それらのアルゴリズムはさらに単純でした。

Every few minutes or after a significant action:
    For each property in the player object:
        write a property to the player's file

ここでも、各プレーヤーが独自のファイルを持っているため、競合はありません。

ゲームの収益性が高く、サーバーのクラッシュによって+3 Axe of Awesomeを失った場合に人々があなたを訴えるリスクがない限り、すべてのユーザーコマンドの後に持続することは確かにやり過ぎです。

そして、プレイヤー以外に、世界で他に何を持続させる必要がありますか?多くの場合、他のすべてを永続化することにはゲームプレイにマイナスの影響があるため、通常はこれを行いたくありません。

同じモンスターへの「同時」アクセスに関しては、あなたの例のように、それは問題ではありません。プロセスが1つしかない場合、モンスターはRAMにあるはずです。あなたの単一のプロセスは、誰がどのような順序でモンスターを攻撃するかを調停します。これは永続化レイヤーの仕事ではありません。ゲーム内のゲームロジックを処理し、結果を永続化します。

于 2010-04-01T10:55:26.263 に答える
1

私の記憶が正しければ、古典的なMUDの多くは実際に全世界をRAMにロードし、状態を定期的にダンプしていました。もちろん、私の記憶は、16MBのプロセスサイズが恐ろしいと考えられた日からです。

于 2010-03-22T17:42:12.063 に答える