免責事項:私のゲームプログラミングエクスペリエンスはクライアント側のシングルプレーヤーゲームに基づいていますが、私はWebアプリケーション(特にMicrosoftスタック)にバックグラウンドを持っているので、この答えをもとにしてきたので、適用しますが、実際のゲームサーバーを実際にテストしないと、それがどのように適用されるかを言うのは困難ですが、ここにいきます。これを知ってください:私はゲームサーバーを展開していません、webappsだけです。
2つの(サーバー)層アプローチをお勧めします。データベース層と「アプリケーション」層。3番目の(プレゼンテーション)層はゲームクライアントです。
リレーショナルデータベースは、データのクエリに優れ、データの書き込みに優れています。重要なのは、データベースの書き込みを、クラスターが処理できる管理可能なサイズのチャンクにシリアル化することです。SQL Serverのより高度なエディション(データセンター/エンタープライズ)は、クラスタリングとレプリケーションをサポートしています。まず、小さなクラスターを構築し、それに対していくつかのクエリを実行して、それがどのように機能するかを確認します。
アプリケーション層では、「ゾーニング」などを行っている場合は、クラスターを設定せずに、ゾーンごとにサーバーを設定するだけで済みます。ゾーンが大きくなった場合は、ゾーンごとにクラスターをセットアップできます。
アプリケーション層->データベース層からデータを送信するためのシリアル化プロセスを構築する必要があります。重要なのは、複数のレベルのシリアル化を行うことです。何かのように、この:
- レベル1:X秒ごとにDBに保存します。重要なデータが含まれます。
- プレイヤーの健康
- プレイヤーアイテム/ピックアップ
- レベル2:2X秒ごとにDBに保存、中程度のデータを含む:
- レベル3:その他すべて、可能な限りまれに
これにより、書き込みの一貫性と予測可能性が維持されます。ゲームの性質によっては、データベースへの書き込みがまれである可能性もあります。重要なのは、アプリケーションサーバーがクラッシュした場合、データベースの状態からオンラインに戻る必要があるため、90分ごとにプレーヤーのインベントリをシリアル化すると、プレーヤーが混乱する可能性があるということです。
データを読み取るには、アプリケーション層のメモリにできるだけ多くロードし、すべてのコードがこのメモリプールを使用するようにします。バックグラウンドで、メモリプールをデータベースと同期できます。Joeが指摘するように、「リアルタイム」のトランザクションが必要になる場合があります。ほとんどの書き込みをシリアル化することで、データベースサーバー/クラスターに十分なハードウェアがあると想定して、必要に応じてリアルタイムトランザクションを実行するためにデータベースに十分なIOが必要です。