2

MMOゲームの人気の傾向は誰もが知っています。プレイヤー同士がライブで対峙する場所。ただし、ゲームプレイ中は、以下に示すように、SQL の挿入とクエリの膨大なフローが発生します。

  • 12 分または 1 時間あたり 500 プレーヤーごとに平均 / 最小 100 のオンライン トーナメントがあります。
  • Game Progress テーブルでは、各プレイヤーの動きを保存しています
    • 4 プレーヤーの 12 ラウンド トーナメントには 48 のレコードが存在する可能性があります
    • プラス呪文または特別なアイテムのほぼ同じ数
    • トーナメントあたり合計 9​​6 または 1 時間あたり 48000 レコード挿入 (500 プレーヤー/時間)

以前の質問 ( MMO ゲームのパフォーマンスを改善する) への回答として、スキーマを変更し、データベースに直接書き込まないようにしました。

代わりに、すべての値を a に累積しますDataTable。このプロセスはDataTable、10 万行を超える行 (場合によっては 1 時間以内の場合もあります) があるたびに、csv 形式でテキスト ファイルに書き込みます。フォルダーを頻繁にスキャンして CSV ファイルを探し、利用可能な CSV ファイルを読み取り、その情報をサーバー データベースに保存する別のバックグラウンド アプリケーション。

質問

  1. ゲームアプリケーションに存在するデータテーブルに別のアプリケーションから直接アクセスできますか (データテーブルを読み取り、読み取ったレコードをクリアします)。そのため、ディスクからの書き込みと読み取りの代わりに、メモリから直接読み取りと書き込みを行います。

  2. DataTable よりも高速で、大きなデータを保持でき、並べ替えと更新の操作がかなり高速な方法はありますか。ユーザー ID を頻繁にスキャンする必要があるため、ゲームのステータスを更新します (ほぼ挿入ごとに)。キャッシュ ユーティリティ、高速スキャン/検索アルゴリズム、または CollectionModel の場合もあります。現在、foreach ループを使用して a 内のすべてのレコードをDataTable調べ、ユーザーが存在する場合は行を更新します。そうでない場合は、新しい行を作成します。クラスとクラスを使用してみSortedListましたが、労力が 2 倍になるだけでなく、メモリ使用量が大幅に増加し、ゲーム全体のパフォーマンスが大幅に低下します。

ありがとう

アービンド

4

2 に答える 2

1

memcache を使用するとパフォーマンスが向上します

于 2012-10-14T19:00:11.470 に答える
1

さて、答えましょう:

  1. Remoting を使用してアプリケーション間でオブジェクトを共有できますが、速度が遅くなり、コードが読みにくくなります。ただし、別の解決策があるため、引き続きメモリを使用します。MemoryMappedFiles を使用できるため、すべての作業は実際にはディスクではなくメモリを使用します: http://msdn.microsoft.com/en-us/library/dd997372.aspx

  2. 何らかの種類の NoSQL DB を使用できます (Redis、MongoDB、RavenDB など、数多くあります)。それらはすべてキーと値のアクセスに基づいており、そのパフォーマンスをテストする必要があります。さらに良いことに、このデータベースの一部は永続的で、複数のサーバーで使用できます。

お役に立てれば。

于 2012-10-13T17:34:20.993 に答える