Travian や oGame などの一部の MMO リアルタイム ストラテジー ゲームは、PHP でコーディングされています。
そのようなゲームが舞台裏でどのように機能するかを簡単に説明していただけますか? プレーヤーのリクエストなしで、ゲームはどのようにリアルタイムの DB 更新を行いますか?
また、Travian などの RTS ゲームを 1000 人のアクティブ プレイヤーで実行する場合、どのようなサーバー負荷/帯域幅を期待する必要がありますか?
このトピックはかなり古いものですが、私はまだあなたの質問に対する「より良い」(私がそう言うかもしれない)答えを持っていると思います。そして漠然とした「更新はcronjobsによって行われます」という答えです。
Travian ieは、javascriptを使用することで、リアルタイムであるという錯覚を与えます。後ろで実際に起こることは次のとおりです。
プレーヤーAはプレーヤーBに攻撃を送信します。MySQLデータベースでは、これは到着のタイムスタンプとともに記録されます。プレイヤーAがページを変更または更新するたびに、このプレイヤーに関するアクティビティ(援軍の到着、ターゲットへの攻撃の到着など)をチェックするスクリプトが(インクルードを使用して)起動されます。スクリプトは明らかに現在の時刻をチェックし、現在のタイムスタンプよりも短いタイムスタンプを持つすべてのアクティビティを調べます。これは、アクションが実行されるべきだったことを意味します。その瞬間、アクションは実際に処理されます。
これは、プレーヤーAとプレーヤーBのどちらも再度ログインしない場合、他の誰かがプレーヤーBを攻撃しない限り、攻撃が計算されないことを意味します。プレーヤーBと攻撃しているプレーヤーのすべてのアクティビティが処理されます。
通常、Web インターフェイスとバックグラウンド デーモン (「イベント ハンドラー」と呼ばれることが多い) の 2 つの部分があります。
ウェブインターフェースは、競合状態がまったく問題にならないすべての読み取り専用と無害なことを行います-パスワードの変更、名前の変更など。
ユニットの構築や他のプレイヤーとの戦闘など、より重要なことはイベント ハンドラーに送信され、そこでチェック、検証され、実行時間に達するまで保存されます。Webインターフェースではなくこの場所でチェックを実行すると、競合状態のリスクを完全に排除できるという利点があります(惑星上のすべてのユニットを含む船を発射すると同時に、基本的に利用可能なユニットを複製することになる高価なものを構築するなど)特定の時間に 1 つのアクション/イベントのみが実行されることを保証する限り (たとえば、マルチスレッドやマルチプロセッシングなどはありません)。
完全なリアルタイムではなく「ティック」を使用する場合 (たとえば、アクションは x 分ごとにのみ発生する)、もちろんバックグラウンド デーモンの代わりに cronjob を使用できますが、競合状態を回避するために別の方法を使用する必要があります。
私自身のゲームでは、RPC のようなインターフェイスを持つバックグラウンド デーモンを使用しているため、Web インターフェイスで関数syncCall('someFunction', ....);を呼び出すだけで、ソケットを介してバックグラウンド デーモンに接続し、指定された関数を実行して、その関数が返すものを返します。
ただし、最近新しいゲームを作成する場合は、node.js や async python フレームワークの 1 つなどの非同期ソリューションを確実に使用します。これにより、2 つの異なる部分を持つ必要がなくなります。ただし、ノード自体によって呼び出された関数の 1 つから戻るたびに、別のイベントからのコールバックが実行される可能性があるため、一部の部分ではロックに注意する必要があります。
更新は cron ジョブによって行われる可能性が最も高いか、別の可能性として、ログイン/ページ変更時に行われます。帯域幅は、アクティブなユーザーの数や可能性などに基づいて大きく異なる場合があります。プロジェクトに大きく依存するため、リクエストの例を使用して localhost/test hist で測定する必要があると思います。
また、かなりの数のプレーヤーなどがいる場合は、PHP+MySQL ではなく、Python&PostgreSQL、おそらく Java などでコーディングすることも考えます。