私は Perl で書かれた HTML、CSS、JavaScript を使用してブラウザ ゲームを作成しています。健康状態とスタミナはサーバーに保存されており、JavaScript を使用して、現在のページが読み込まれるときにこれらの統計のライブ更新カウントをユーザーに表示します。この機能はうまく機能しますが、ユーザーがタブを切り替えたり、別のアプリに切り替えたりしてブラウザをバックグラウンドで実行したままにすると、戻ったときに表示されるカウント値が適切に維持されなくなります。そのため、ブラウザに戻ると、実際のスタミナは 100/100 であるにもかかわらず、カウンターには 50/100 のスタミナが表示されることがあります。したがって、ゲーム内で何かを行う (新しいページをロードする) と、サーバーはカウンターを実際の値に更新します。これは、JavaScript がブラウザーでユーザーに「ライブ」スクロール ビューを表示するタイミングをとっているだけであるためです。
ページ/タブが非アクティブであるか、フォアグラウンドにない場合でも、JavaScript カウンターが確実に動作することを確認する方法はありますか?ゲームを完全に書き換えて、ブラウザーでユーザーにライブ サーバー プッシュ コンテンツの継続的なストリームを表示する以外に方法はありますか?
ゲームをプレイしているとします。健康とスタミナが回復するのがわかります。 1 分間別のプログラムに切り替えてから、ブラウザーのゲームに戻ります。外出中は健康状態とスタミナが更新されないことに気づくでしょう。ただし、ゲーム内でアクションを実行すると、値はサーバー上で内部的に追跡されるため、あるべき値に更新されます。これが私が解決したい問題です。それが明確になることを願っています!
この問題を解決するために、オンラインで検索する以外に何も試したことはありませんが、最終的にこのサイトで本当に「良い」答えが見つからなかったので、質問することにしました。
継続的なサーバープッシュも機能しません。フォーカスを失ったときに発生するタイマーやイベントなど、メイン イベント ループ内のすべてのものは、リソースを節約するためにブラウザによって速度が低下します。一部のモバイルブラウザでは完全に停止します。
問題の解決策は、アプリケーションがこれらの統計を追跡する方法を変更することです。
ここで、WebWorkers を使用して別のスレッドでタイマーを実行するという人もいますが、これですべての問題が解決されるわけではありません。誰かがスリープ状態からページを再開した場合など、バージョンが異なっても引き続き問題が発生します。バックグラウンド タスクは存続しません。
これらの統計もサーバー上で追跡しているとおっしゃいました。これは便利なので、最も明白なことは、ウィンドウ フォーカス イベント を使用して、ラベルがフォーカスを取り戻したときを検出することです。次に、サーバーを呼び出して最新の統計を取得し、その新しいデータに基づいてタイマーをリセットします。リクエストの進行中に古いデータが表示されないようにするには、この間に読み込みスピナーまたはその他のものを表示することを選択できます。
これを修正するもう 1 つの一般的な方法は、タイマーが増加するたびに、データが最後に返されたときのタイムスタンプを表す変数を保持することです。フォーカスを失った場合は、
blur
イベントを使用して検出し、その最後のタイムスタンプをどこかに保存できます。その後、彼らがフォーカスを取り戻したときに、focus
イベントを処理して、現在の時刻と、フォーカスを離れる (フォーカスを失う) 前に記録された最後に記録された時刻との差を計算できます。この期間から値を再計算できます。しかし、サーバーがこの情報を持っている場合は、エラーが発生しにくくなり、いつフォーカスが戻ったかをサーバーに問い合わせるだけで済みます。