0

ブラウザゲームを作ることを考えている間、私は気がかりな問題に遭遇しました。多くのゲームには、このように機能する「イベントキュー」と呼ばれるものがあります。私は「軍隊」を持っていて、それを敵に送ります。少し時間がかかります。私の「軍隊」が敵の「軍隊」の位置を取得すると、計算された戦いがあるので、私の「軍隊」は負けるか勝ちます。私または私の対戦相手がゲームに参加しているときは、すべてがうまくいきます。ある種のajax作業では、呼び出されるphpスクリプトを管理し、fightを計算して、その結果をデータベースに保存できます。しかし、戦闘が発生したときに私も対戦相手もログインしていない場合、どのように機能するのでしょうか?そのようなゲームの良い例は、あなたが別の惑星に船を送っているときのOgameであり、ログアウトしたときに目的地に会い、戦いを行い、敵の源を手に入れてカムバックすることができます、

私は、データベースの行で攻撃者と対戦相手の両方の攻撃の時間を節約し、いずれかのプレイヤーがゲームにログインしている間の戦いを計算できると考えていましたが、このソリューションには多くの欠点があります。たとえば、対戦相手を攻撃する前に攻撃するサードプレーヤーがいる場合、それは彼の軍の統計を変更し(彼は彼の軍の一部を殺すことができるため)、私は多くの結果をもたらします。また、プレイヤーの誰もが長時間ログアウトしない場合、彼らは戦っていなかったのでゲームに登場し、それは真実ではありません。

そのようなイベントキューを作成する方法を知っていますか?cronを使用することもお勧めできません。まれにしか使用されない場合があり、数千のプレーヤーが存在する場合、数千のcronインスタンスがパフォーマンスのキラーになる可能性があります。どんな概念でもありがたいです-私が私の問題を十分に説明したことを願っています:)

4

2 に答える 2

1

データベースで「ジョブ」テーブルを作成し(必要なコンテンツに加えて、EXPIRE日付-ジョブが終了したとき)、ユーザーがジョブを作成するたびに(たとえば、あるクラスターから別のクラスターに船を移動する)、このテーブルの新しいエントリ。EXPIREは、船がターゲットクラスターに到着した時刻に設定されています。

次に、誰か(!)が任意のサイト(開始ページも含む)をロードするたびに、スクリプトはキュー内のジョブをチェックします。これは、これまでに実行されているはずです。EXPIREがNOWよりも低いジョブがある場合は、そのジョブを実行します(または、より大きなジョブの場合は、php cliプロセスをフォークしてジョブを実行します)。

2012-12-28 12:00の場合、ゲームには2人のプレーヤーAとBがいて、Aは6時間かかるBへの攻撃を開始します。EXPIRE =2012-12-2818:00とコンテンツ「FleetfoobarattacksB」でジョブが作成されます。

ケースA:Aがログアウトし、19:00まで何も起こりません。Bがログインし、他の何かが発生する前に(これは、「通知」または受信ボックスが同期していないように見えないようにするために重要です)、スクリプトは、ジョブがテーブルにあり、期限切れであることを確認します。スクリプトはジョブを実行し、Aからの巨大な艦隊にオーバーランしたというBへの通知を作成します。ジョブは完了しました。すべて問題ありません(Bの気分を除く)。

ケースB:Aがログアウトします。18:30に、匿名ユーザーがスタートページにアクセスします。スクリプトは再びジョブテーブルを調べて、ジョブを実行します。Bは19:00にログインし、彼の損失の通知を確認します。仕事は終わりました。

于 2012-12-30T03:25:50.377 に答える
0

私のプロジェクトのCRONレスイベントキューの背後にある考え方は、次のとおりです。

  1. すべてのイベントには「終了」時間があります。比較操作を簡単にするために、生のUNIX time()タイムスタンプを使用しています。

  2. ユーザーが「クリック」(任意のゲームページを開く)すると、キューエンジンは、優先度に従って、「終了」<=現在のtime()であるすべてのイベントをフェッチします。同じ秒で発生するイベントは、優先度の高いものから低いものへと実行されます。

  3. ゲームにユーザーがいない場合、イベントは必要ありません。非常に単純です:)2番目のステップで説明するように、誰かがゲームにログインしてイベントキューをロールバックするまで、ゲームはスリープします。

定期的なイベントとまともな毎日のサイトトラフィックがある任意のWebサイトに同じ機能を追加できます。

(実際、私はcron.phpバックエンドも要求に応じて作成しました)

于 2013-11-12T08:19:56.570 に答える