MMOゲームの人気の傾向は誰もが知っています。プレイヤー同士がライブで対峙する場所。
私が関心を持っているのは、プレイヤーの動きとゲーム結果の保存です。
NPGSQL アダプター経由で Csharp と PostgreSql v9.0 を使用する
ゲーム クライアントはブラウザ ベースの ASP.NET であり、すべてのデータベース関連処理のために Csharp 関数を呼び出します。
私のクエリを理解するには、次のシナリオを検討してください
ゲームの進行状況を postgres テーブルに保存します。
たとえば、トーナメントは 4 人のプレーヤーで開始され、アクティビティは次のようになります。
- 各プレイヤーは 100 ヒットポイントから開始します
- プレイヤー 1 がストライクを行います (ヒットポイントをヒットポイントに変換するためのチャートを参考にします)。
- プレイヤー 2 の HP は 92 で、軽い打撃を返すので、プレイヤー 1 の HP は 98 です。
上記の 2 つのラウンドは、次のようにゲーム進行表に表示されます。
ROW Player1HP Player2HP Strikefrom StrikeTo ReturnStrikeHP Round TimeStamp StrikeMethod
1 100 100 0 0 0 0
2 98 92 P1 P2 2 1
トーナメントが終了したかどうかを確認するために、3 人のプレイヤーのヒットポイントがゼロであるか、またはゲーム時間が最後の進行から規定のタイムアウト値を経過したかを確認します
私たちのテーブルには、playerid に基づいてランダムな 32 文字のコード (各プレーヤーに対して 8) のトーナメント ID としてのプライマリキーがあります。
鎧、マナ、呪文などの他の列があり、これらはすべて各プレーヤーに繰り越されます。合計で 48 列 (各プレーヤーとその属性に 12 列) があります。
最後に、トーナメントの結果を持つ gameResult テーブルがあります。
クエリ
私の質問は、ゲーム データベースまたは SQL クエリの負荷を軽減することに重点を置いています
a) データベースを参照したり Sql を使用したりせずに、プレーヤーが同時にログインして 2 つのゲーム セッションを開いたかどうかを検出する方法
b) GameProgress テーブルへのレコードの急増を制御する方法。プレイヤーがより迅速に応答できるようにします。サーバーは、ピーク時または 1000 人のプレイヤーがオンラインになると遅延し始めます
There is a tremendous flow of sql queries, for ex. even in the current game version
There are average/minimum 100 tournaments online per 12 minutes or 500 players / hour
In Game Progress table, We are storing each player move
a 12 round tourament of 4 player there can be 48 records
plus around same number for spells or special items
a total of 96 per tourament or 48000 record inserts per hour (500 players/hour)
また、期限切れのトーナメント レコードを GameProgresstable から別のデータベースに移動し続ける Csharp のバックグラウンド プロセスを使用することも検討しています。サーバーにはゲームプレイの負荷がありません。
c) postgres でいっぱいの vaccum を実行する頻度。
私は、パフォーマンスを向上させることができる新しいアプリケーションのオープンソースまたは toPay に対してオープンです。たとえば。FastCsvReader http://www.codeproject.com/Articles/9258/A-Fast-CSV-Readerを使用して、サーバー ログ ファイルの列挙を改善しました。
よろしくアービンド