WebサイトがCPUとバッテリーを浪費する方法
(h.43z.one)-
問題の発見: 新しいノートPCで、スピーカーから断続的にホワイトノイズが発生する問題を見つけた。静かな部屋でのみ聞こえるものだった。
-
原因の分析: PulseAudio のオーディオシンク状態を確認した結果、
SUSPENDED状態では音は出ないが、IDLEまたはRUNNING状態ではホワイトノイズが発生することを突き止めた。 -
Firefoxの問題: Firefox がオーディオシンクを使用しているプログラムとして表示され、開いているタブの中に音を再生しているものがないにもかかわらず、ホワイトノイズが発生していた。
-
原因:
outlook.office.comの通知音が問題の原因であることが判明した。メールを受信するたびにホワイトノイズが始まり、タブを再読み込みするか Firefox を再起動しないと止まらなかった。 -
バッテリー消耗: ホワイトノイズが発生している間は、CPU とバッテリーの消費が増加した。
-
解決策の試行: メール通知を無効化して問題を解決しようとしたが、他のWebサイトでも似た問題が発生した。
-
HTML/JavaScript のオーディオ処理: オーディオを再生する方法としては `` タグと WebAudio API がある。問題の原因は AudioContext を生成するときに発生することが確認された。
-
FirefoxとChromeの違い: Chrome は一定時間が経つとバッテリーや CPU の浪費を自動的に止めるが、Firefox はそうではない。
-
解決策: AudioContext を自動的に停止し、必要なときに再開する拡張機能を開発した。完璧ではないが、十分に効果的である。
1件のコメント
Hacker Newsのコメント
この問題は計画済みで重要。まもなく修正予定。優先順位の問題でまだ直っていないことを謝罪する。個人的には優先度が高い
Audio Context を開いて何も再生しないウェブサイトは、おそらくボット検出をしている可能性がある
同じ問題が Android デバイスでも発生するのか気になる
このホワイトノイズには長い間悩まされていたが、原因を突き止められなかった
出力がアイドル状態になると、デジタル SPDIF 信号は同期を失う。再生が始まると再同期に時間がかかり、最初の数秒の音声を失うことになる。出力をアイドル状態にしないために、データをラインに流さずに出力を開いたままにするプログラムを書いた
Android Firefox で、ときどきスマートフォンが1日に 10GB のデータを消費する問題の説明になるかもしれない。ニュースサイトが音声を再生し、広告を繰り返し読み込み、タブがオーディオのせいでスリープ状態に入らなかった。繰り返し発生するデータ料金のせいで Chrome に乗り換えなければならなかった
Chromium でこの中断を処理するコードはここにある
macOS でも似た問題を見つけた(オーディオ起因の電力消費、ホワイトノイズなし)
coreaudiodが何も再生していないのに CPU の 20% を使用している。この問題が解決するまでは別のブラウザに切り替えるつもりだが、Firefox を手放したくはないこの問題により https://www.dr.dk/ のトップページが修正された
audioContextの実装方法はよく分からないが、非常に賢く動的だ。通知音を再生することは、D3 で SVG を描くのに似ている。より効率的な API で、通知ハンドラのような単純な繰り返し処理を登録できる serviceWorker フックがあるのか気になる