0

マルチプレイヤーゲームロビーがあり、ユーザーはプライベートチャットルームを作成してプライベートゲームを開始できます。各ユーザーには、ゲーム内に1秒あたりxポイントをゆっくりと再生成することを想定したヘルスバーがあります。

各ゲームの開始時にサーバー側のゲームループを開始する必要があると思います。これは次のようなものです。

setInterval(update('gameID'),1000);

ここで、update('gameID')は、1000ミリ秒=1秒である特定のゲームのすべてのプレーヤーのヘルス変数を増分します。

質問:これは非同期であると思いますか?50の別々のゲームが進行中で、そのうちの50が実行されている可能性があります。メインプロセスはブロックされませんよね?

4

3 に答える 3

1

非同期ですが、説明する場合、50個のタイマーは必要ありません。

  1. 単一のタイマーを使用して、アクティブなゲームのプレーヤーを再生成できます。健康データもプッシュしている場合、これはかなり非効率になります。
  2. のようなことを実行し、のようなplayer.attackedTime = (new Date).getTime()各攻撃で再生を計算できplayer.health += x_points * ((new Date).getTime() - player.attackedTime) / 1000ますが、クライアントで予測再生を実行する必要があります。
于 2012-06-12T14:06:26.313 に答える
0

setInterval確かに非同期です。コールバックを受け取るほとんどの関数は非同期です。疑問がある場合は、ドキュメントまたはソースコードを確認してください。

于 2012-06-12T13:31:39.123 に答える
0

非同期です。ただし、これをそのように行うと、サーバーが停止する可能性があります。

これらの間隔をパッシブにすることをお勧めします。つまり、ゲームの開始をメモリに保持し、クライアントにデータのpingを実行させます。クライアントがpingを実行すると、サーバーは現在の日付を確認し、保存されている日付と比較します(そして、要求の最後に保存されている日付を更新します)。それから現在の健康状態を評価することができます。

このソリューションは、より適切に拡張できるはずです。

于 2012-06-12T13:35:20.103 に答える