質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Google Chrome OS

Google Chrome OSは、Google社が開発するオープンソースのオペレーティングシステムです。Linuxベースで、同社のWebブラウザーであるGoogle Chromeの利用を目的としています。

Chrome

Google Chromeは携帯、テレビ、デスクトップなどの様々なプラットフォームで利用できるウェブブラウザです。Googleが開発したもので、Blink (レンダリングエンジン) とアプリケーションフレームワークを使用しています。

Q&A

解決済

1回答

4646閲覧

Google chromeがバックグラウンド(非アクティブ)の時に止まってしまうのを解決したい

Kiiko1

総合スコア21

Google Chrome OS

Google Chrome OSは、Google社が開発するオープンソースのオペレーティングシステムです。Linuxベースで、同社のWebブラウザーであるGoogle Chromeの利用を目的としています。

Chrome

Google Chromeは携帯、テレビ、デスクトップなどの様々なプラットフォームで利用できるウェブブラウザです。Googleが開発したもので、Blink (レンダリングエンジン) とアプリケーションフレームワークを使用しています。

0グッド

0クリップ

投稿2022/04/11 21:59

やりたいこと

chromeをバックグラウンド(他のウィンドウを前面に出す)にしたときに動作が止まってしまう現象を解決したいです。

以前にもこの状態になったことはあり、私もその時に一度対応したのですがアップデートで設定が戻り、再度発生するようになってしまいました。

試したこと

https://game.aekana.com/others/6640/#2022%E5%B9%B43%E6%9C%88%E3%81%AE%E3%82%A2%E3%83%83%E3%83%97%E3%83%87%E3%83%BC%E3%83%88%EF%BC%88chrome99%EF%BC%89%E3%81%A7%E5%AF%BE%E5%BF%9C%E6%96%B9%E6%B3%95%E3%81%8C%E5%A4%89%E3%82%8F%E3%82%8A%E3%81%BE%E3%81%97%E3%81%9F

上記の記事を参照し、
プロパティのリンク先という項目に
「--disable-features=CalculateNativeWinOcclusion」を追加したのですが、解決しませんでした。

何か他に方法があれば、ご教授いただけると幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

5ugarVVatch1ng

2022/04/11 23:22

知りませんがPCを再起動してみたらどうでしょう。
int32_t

2022/04/11 23:29

何が止まるのですか? setInterval() のコールバックとか?
Kiiko1

2022/04/12 01:13

そうです。 setInterval() のコールバックです。
guest

回答1

0

ベストアンサー

バックグラウンドタブかどうかに関わらず setTimeout()setInterval() がとても不正確なのはそういう仕様なので、これらの正確さに依存した設計は避けるべきです。HTMLページ上では、「正確にある間隔でコードを実行する」というのはそもそも不可能だという前提を持つ必要があります。

たとえば、「200ms 毎に配列の現在のインデックスの要素を処理して、現在のインデックスに1を足す」のような処理は「処理開始からN ms 後のインデックスを計算する」という処理に変更しましょう。

BAD:

js

1let array = [..]; 2// array[0] を処理 3let arrayIndex = 1; 4setInterval(() => { 5 // array[arrayIndex] を処理 6 arrayIndex++; 7}, 200);

GOOD:

js

1let array = [..]; 2const startTime = performance.now(); 3requestAnimationFrame(handleFrame); 4function handleFrame(timeStamp) { 5 const arrayIndex = Math.floor((timeStamp - startTime) / 200) % array.length; 6 // array[arrayIndex] を処理 7 requestAnimationFrame(handleFrame); 8}

「200ms毎にある関数を呼ぶ」のような処理は「処理開始からN ms 経過後なら合計 N / 200 回呼ぶ」という処理に変更しましょう。

BAD:

js

1setInterval(f, 200);

GOOD:

js

1const startTime = performance.now(); 2let fCount = 0; 3requestAnimationFrame(handleFrame); 4function handleFrame(timeStamp) { 5 const expectedCount = Math.floor((timeStamp - startTime) / 200); 6 for (; fCount < expectedCount; ++fCount) 7 f(); 8 requestAnimationFrame(handleFrame); 9}

どうしても定期的に処理を行いたいこともあるとは思います。たとえば定期的にサーバにアクセスしないとサーバ側でタイムアウトしてしまうとか。そういう場合は Worker を使います。

投稿2022/04/12 01:38

編集2022/04/12 04:30
int32_t

総合スコア20878

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問