1

時間ベースのイベントを持つブラウザベースのMMOを作成しています。IEの建物の建設には23時間かかります。

watchこれをMySQLデータベースに記録し、cronスクリプトまたは(この質問は非常に役に立ちました)を使用してイベントテーブル(または同等のもの)をループすることができます。

私は次のいずれかを行うことができるという一般的なコンセンサスがあるようです。

(1)イベントとそれに関連するトリガーを処理するスクリプトに対して毎秒cronジョブを実行します。

(2)イベントとそれに関連するトリガーを処理する59回の反復で毎秒ループするcronジョブを毎分実行します。

(3)watch毎秒phpスクリプトを実行するために使用します。

基本的に、イベントが完了すると、スクリプトは、状態の変更、データベースの更新、最近のイベントの後にキューに入れられる他の「イベント」のトリガーなど、さまざまなトリガーを処理します。

私の最大の懸念は、毎秒10,000以上のイベントとトリガーが処理される可能性がある場合です。パフォーマンスの問題を回避するために使用できる戦略は何ですか?これらはすべての解決策ですか、それともより良い代替案がありますか?

イベントの例:

Construction of Building A - 00:43:21

2601秒早送りすると、次のトリガーが実行されます。

Place Building A on map at Location x,y
Update resource total given by building
Start timer on next building in the queue
Construction of Building B - 02:10:49

より適切に説明すると、ゲームの初期段階では、これらのイベントには5分から1時間かかります。ゲームの後の段階では、これらのイベントは数百時間の間隔で配置されます。これらのイベントはゲームの他の側面に影響を与えるため、リアルタイムで処理する必要があります(1時間ごとに提供されるリソースの量を改善するリソース構造など)。したがって、これらのイベントは、ユーザーがアクティブであるかどうかに関係なく、サーバーで処理する必要があります。理論上のスクリプトは、期限切れのイベントをチェックし、そのイベントに基づいて、そのイベントの期限切れに関連する他のいくつかのメソッドを実行します。

4

1 に答える 1

2

https://github.com/prggmr/prggmr

イベントライブラリのように聞こえますが、ここでは非常に役立ちます。

将来発生するすべてのイベントを監視する「キャッチオール」を作成する代わりに、prggmrに単純な間隔を記述して、将来発生する必要のあるイベントを取得し、イベントエンジンに登録して通知することができます。その時。

次のようなものが機能する可能性があります、

prggmr\interval(function(){
    $query = mysql_query("SELECT event, when FROM events");
    while($event = mysql_fetch_assoc($query)) {
        prggmr\setTimeout(function() use ($event){
            prggmr\signal($event['event']);
        }, $event['when']);
    }
    // What this would do is look for any events that require signaling in the
    // in the future such as a building construction and signal it when the 
    // given amount of time in milliseconds has run
}, 3600);
// This simply tells the engine to run the function every minute

そして、このコードを実行するには、event_detect.phpに保存されていると言います

prggmr event_detect.php

通常、プロセスはrunitなどの別のアプリで管理する必要があります。

このアプローチを使用すると、登録済みの「シグナルハンドラー」としてアプリケーションに発生する可能性のあるすべてのイベントを組み込み、ユーザーの操作なしでリアルタイムで発生するイベントを待機および監視する実際のゲームエンジンをバックグラウンドで実行できます。

私たちは実際に、現在開発中のゲームの同様の状況でこのアプローチを使用しています...論理的にはまったく異なりますが、ユーザー以外のインタラクティブなイベント処理はすべて同じです。

また、パフォーマンスのために、サーバーによっては1秒以内に10,000イベントを非常に簡単に処理できます。

于 2012-06-01T20:17:31.877 に答える