1

MMOゲームの人気の傾向は誰もが知っています。プレイヤー同士がライブで対峙する場所。

私が関心を持っているのは、プレイヤーの動きとゲーム結果の保存です。

NPGSQL アダプター経由で Csharp と PostgreSql v9.0 を使用する

ゲーム クライアントはブラウザ ベースの ASP.NET であり、すべてのデータベース関連処理のために Csharp 関数を呼び出します。

私のクエリを理解するには、次のシナリオを検討してください

ゲームの進行状況を postgres テーブルに保存します。

たとえば、トーナメントは 4 人のプレーヤーで開始され、アクティビティは次のようになります。

  1. 各プレイヤーは 100 ヒットポイントから開始します
  2. プレイヤー 1 がストライクを行います (ヒットポイントをヒットポイントに変換するためのチャートを参考にします)。
  3. プレイヤー 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を使用して、サーバー ログ ファイルの列挙を改善しました。

よろしくアービンド

4

2 に答える 2

2
 How to detect if a player has not logged in simutaneously and opened two game sessions 
 but without having to refer to a Database or using Sql

複数のサーバーを使用すると仮定すると、ログインとログアウトのみを登録するプロセスをどこかに作成します。2 つのうちのいずれかが発生するたびに呼び出されます。そのプロセスを使用して、ユーザーがすでにログインしているかどうかを確認できます。たとえば、このプロセスをすべてのサーバーで実行し、アルゴリズムを使用してユーザーのサブセットに対してのみ serverx を使用することで、このプロセスを負荷分散できます。10 台のサーバーがあるとします。(userId % 10) を実行して、ユーザーがログイン/ログアウトを登録するサーバーの ID を取得します。

このようにして、これらのチェックをサーバー間の呼び出しでメモリ内でのみ実行します。ユーザーが切断したり、サーバーがクラッシュしたりしても、ユーザーが永遠にログインしたままにならないように、タイムアウト/リフレッシュコールが必要になる可能性があります。

How to control the surge of records into the GameProgress table. so that players get
response quicker. The Server starts to lag at peak hours or when 1000 players are
online

#1 postgress データベースをストレージに SSD を使用するように切り替える

#2このプロセス全体をメモリに昇格させ、リアルタイムの作業にデータベースを使用しないでください

#3 新しいレコードを作成する代わりに、データベース内のレコードを更新する

#4 複数のデータベースを使用し、それらにユーザーを分散させる

#5 ....

Our table has a primarykey as tournamentid a random 32 character code on basis of
playerids. 

ランダムに生成された主キーは、非常に悪い習慣です。シーケンスを使用しないと、一意であることが保証されます。ランダムコードが十分にランダムでない場合、非常に厄介なバグが発生します。これはゲームごとに 1 回だけ生成する必要があるため、パフォーマンスのボトルネックにはなりません。

于 2012-10-01T07:17:36.253 に答える
1

複雑なコストがかかりますが、私がお勧めするもう1つのことは、頻繁に更新されるシステムの部分をVoltDBのようなものに移動することを検討することです。これは複雑なコストをもたらします、そしてあなたはおそらく彼らの商用ライセンス/サポートを使いたいと思うでしょう。ただし、この種の負荷に対するメインメモリデータベースの利点は、ディザスタリカバリもあれば、それだけの価値がある可能性があります。その後、PostgreSQLインスタンスはより長期のデータを処理でき、VoltDBはリアルタイム処理を処理できます。

于 2012-10-02T04:28:00.317 に答える