Googleは今日、2023年から2026年の間に、Chrome for Androidのスクロール遅延(scroll jank)を48%削減する方法を詳しく紹介しました。スクロール遅延とは、デバイスが更新されたスクロールオフセットを含むフレームをタイムリーに表示できないときに発生する、ページの突然のカクつきやジャンプの現象を指します。この作業は「高品質なモバイルネットワーク体験における最大の妨害要因の一つ」を解決することを目的として、2023年に始まりました。
GoogleがChromeのスクロール遅延問題に対して複数の最適化を実施
Chromeには厳しいデッドラインがあり、各フレームは画面のリフレッシュ前に納品されなければなりません。フレームの処理遅延がこのデッドラインを超えると、画面はリフレッシュサイクル全体で古いスクロールオフセットを表示せざるを得なくなります。これは60Hzのディスプレイで約16.7ミリ秒です。人間の目はこの見逃されたフレームを不自然で震えるカクつきとして認識します。この状況を避けるために、Chromeの入力からフレームへの納品は一貫している必要があります。つまり、「毎回のスクロール更新は、画面に表示されるのに必要な時間が同じでなければなりません」。通常のAndroidアプリと比較して、Chromeは独立したブラウザ、レンダラー、GPUプロセスを持っており、これは安定性、安全性、パフォーマンスを向上させますが、スクロール遅延の問題を悪化させる要因にもなっています。
ユーザーがChromeで画面に触れると、ハードウェアは入力イベントを生成します。これらのイベントは単一のスレッドやプロセスに送信されるのではなく、まずブラウザプロセスに到達してヒットテストが行われ、その後レンダラープロセスに転送されて新しいスクロールオフセットが計算されます。VSync信号は異なる経路を通り、複数のプロセスを経由してGPUプロセス内のViz合成スレッドに到達し、レンダラープロセスに転送されます。このプロセスは入力イベントと一致させて新しいフレームを描画します。その後、フレームはGPUプロセスに送信され、ピクセルが生成され、最終的にオペレーティングシステムによって画面に表示されます。
状況をさらに複雑にするために、Chromeはハードウェアからバッファなしの入力を直接消費します。これは、入力イベントが不規則な間隔でChromeに到達し、通常は各リフレッシュサイクル内に複数回発生することを意味します。マルチプロセスパイプラインを考慮して、Googleはスクロール遅延を減少させるためにいくつかのプロジェクトを展開しました。これらのプロジェクトには「自動化ヒューリスティック、ターゲット最適化、深いアーキテクチャの変更」が含まれます。これらの努力には、入力予測が含まれます。オペレーティングシステムからの入力イベントは、時には入力フレームの猶予期間が不十分な場合に遅延することがあります。猶予期間をさらに延長することは選択肢ではありません。なぜなら、それはChromeがタイムリーにフレームを生成できないリスクを高めるからです。
その代わりに、オペレーティングシステムが締切前に入力イベントを提供しなかった場合、Chromeは独自の合成スクロール更新を作成し、観察されたスクロール曲線に基づいて将来のスクロール位置を予測します。
Viz内のブラウザコントロール:ユーザーがAndroid上でウェブサイトを下にスクロールし始めると、ブラウザコントロールはスクロール中のウェブサイトと同期して視口から滑り出します。これら二つの表面間の同期運動は、以前は各フレーム内のブラウザメインスレッドに関与していたため、多くの視覚的な問題がありました。私たちはアーキテクチャを変更し、GPUプロセスが各フレームのスクロールオフセットをブラウザコントロールのスクリーンショットに適用できるようにし、ブラウザメインスレッドとのインタラクションを必要としないようにしました。Android入力スレッドの優先度:チェーンの強度は最も弱いリンクに依存し、パイプラインの速度は最低優先度の依存関係に依存します。
私たちは、関連するオペレーティングシステムスレッドが他の低優先度の作業によって事前に占有されるため、入力イベントがChromeに到達するのに時には長い時間がかかることを発見しました。私たちはAndroidと協力し、ハードウェア入力をChromeに渡す責任を持つすべてのスレッドが十分に高い優先度を持つことを保証しました。

