3

私は単一のページで構成されるWebアプリケーション(ASP.NET)ゲームに取り組んでおり、そのページにはモノポリーに似たゲームボードがあります。私は、最良のアーキテクチャアプローチが何であるかを判断しようとしています。これまでに特定した主な要件は次のとおりです。

  • 最大6人のユーザーが1つのゲーム状態オブジェクトを共有します。
  • ユーザーは、ゲームの現在の状態、つまり、アクティブなユーザーが何をロールしたか、お互いのユーザーがどれだけのお金を持っているかなどを(比較的)最新の状態に保つ必要があります。

ゲームの状態をデータベースに保持することを考えましたが、ゲームの状態オブジェクト(たとえば、キャッシュ内)を最新の状態に保つことができる場合、データベースを更新し続けるのはやり過ぎのようです。たとえば、フローは次のようになります。

  1. ユーザーからデータの要求を受け取ります。
  2. データベースでデータを検索します。そのデータからオブジェクトを作成します。
  3. ユーザーがゲームの状態に基づいてリクエストを実行する権限を持っていることを確認します(つまり、それが本当に自分の番であるか、そのプロパティを購入するのに十分なお金があることを確認します)。
  4. ゲームオブジェクトを更新します。
  5. ゲームオブジェクトをデータベースに書き戻します。
  6. リクエストごとに繰り返します。

1台のサーバーが複数の同時ゲームを提供するとします。

  1. AJAXを使用してASP.NETページにリクエストを送信することを考えました。
  2. Silverlightを使用してWebサービスへのAJAXリクエストを使用することを考えました。
  3. SilverlightでWCFデュプレックスチャネルを使用することを考えました。

最善のアプローチが何であるか理解できません。すべてに欠点があるようです。誰かがこの種のことを経験していて、それらの経験を共有することに気を配っていますか?あいまいすぎる場合は、お気軽にご質問ください。ありがとう。

更新:上記の3つのオプションに基づいて、サーバーへのこの接続を実装する方法について誰か提案がありますか?

4

3 に答える 3

4

これらはユーザー間で共有されるため、ASP.Net キャッシュまたはアプリケーション状態を使用してゲーム オブジェクトを格納できます。メモリを節約するためにキャッシュからオブジェクトを削除できるため、キャッシュはおそらく最適な場所です。

一意のキーを使用してゲーム オブジェクトをキャッシュに保存すると、そのキーを各ビジター セッションに保存し、これを使用して共有ゲーム オブジェクトを取得できます。キャッシュがクリアされている場合は、データベースからオブジェクトを再作成します。

于 2008-10-29T22:28:51.257 に答える
3

データベースの更新はやり過ぎのように思えますが、1 つのバックエンドと通信する複数の Web ヘッドを持つことができるため、スケールアップするときに利点があります。

より大きな問題は、ゲームの状態をクライアントに伝える方法です。ゲームの状態をときどき完全に更新することで、すべての変更がキャッチされ、すべてのクライアントがメッセージを見逃しても同期を維持できるようになりますが、多くの場合、ゲームの状態は非常に大きくなります。

同様に、通常、ゲーム状態メッセージでアニメーションやその他の表示更新をトリガーしてアクションを描写することも考慮してください (たとえば、ピースが移動する場合、ほとんどの場合、移動先に表示されるだけではなく、ボード全体を移動する必要があります)。 )。

そのため、両方の長所を組み合わせる 1 つのソリューションは、テーブルで実行されたすべてのアクションを収集するデータベースを、連続した ID で保持することです。クライアントが更新を要求すると、最後に知っていたアクション以降のすべてのアクションを与えることができ、クライアントはその動きを「演​​じる」ことができます。つまり、リクエストが失敗した場合でも、リクエストを再試行するだけで、アクションが失われることはありません。

サーバーは、同じデータから、ゲーム状態の内部ビューも維持できます。また、不正なアクションを拒否し、それらがゲーム アクション テーブルに入るのを防ぎます (したがって、他のクライアントが誤って更新されるのを防ぎます)。

最後に、サーバーには「1 つの真」のゲーム状態があるため、クライアントはそれを定期的にチェックできます (これにより、クライアントまたはサーバー コードのエラーを見つけることができます)。サーバー データベースはプライマリと見なされる必要があるため、誤った状態になったクライアントにゲーム状態全体を再送信できるため、小さなクライアント エラーによってエクスペリエンスが (潜在的に) 損なわれることはありません (状態のダウンロード中の一時停止を除く)。

于 2008-10-29T22:41:52.290 に答える
1

詳細を保存するアプリケーション レベルのオブジェクトを作成してみませんか。詳細については、ASP.NET でのアプリケーションの状態とグローバル変数を参照してください。sessionID を使用して、各プレーヤーのデータのキーとして機能させることができます。

キャッシュを使用して、長いタイムアウトを使用して同じことを行うこともできます。これには、一定期間後、つまり 6 時間後などに古いデータをキャッシュからフラッシュできるという利点があります。

于 2008-10-29T22:50:38.607 に答える