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上でウェブサイトを下にスクロールし始めると、ブラウザ制御はスクロール中のウェブサイトと同期して視口から滑り出します。これら2つの表面間の同期運動は、以前は各フレーム内のブラウザメインスレッドに関与していたため、多くの視覚的な問題が発生していました。私たちはアーキテクチャを変更し、GPUプロセスが各フレームのスクロールオフセットをブラウザ制御のスクリーンショットに適用できるようにし、ブラウザメインスレッドとの相互作用を必要としないようにしました。Android入力スレッドの優先度:チェーンの強さは最も弱いリンクに依存し、パイプラインの速度は最も低い優先度の依存関係に依存します。
私たちは、関連するオペレーティングシステムスレッドが他の低優先度の作業によって事前占有されるため、入力イベントがChromeに到達するのに時々長い時間がかかることを発見しました。私たちはAndroidと協力し、ハードウェア入力をChromeに渡す責任を持つすべてのスレッドが十分に高い優先度を持つことを保証しました。

