Google 今日詳細介紹了其在 2023 至 2026 年之間,如何將 Chrome for Android 的滾動延遲(scroll jank)減少 48%。滾動延遲是指頁面突然的卡頓或跳動現象,當設備未能及時呈現包含更新滾動偏移的幀時,便會出現這種情況。這項旨在解決「優質移動網絡體驗中最大擾動因素之一」的工作始於 2023 年。
Google 針對 Chrome 的滾動延遲問題進行多項優化
Chrome 有嚴格的死線,必須在屏幕刷新之前交付每個幀。如果處理幀的延遲超過此死線,屏幕將被迫在整個刷新週期內顯示過時的滾動偏移,這大約是 16.7 毫秒在 60 Hz 的顯示器上。人眼將這個錯過的幀視為突兀和顫動的卡頓。為了避免這種情況,Chrome 的輸入到幀的交付必須保持一致,即「每次滾動更新必須在屏幕上呈現所需的時間相同」。相比於普通的 Android 應用,Chrome 擁有獨立的瀏覽器、渲染器和 GPU 流程,這雖然提高了穩定性、安全性和性能,但也加劇了滾動延遲問題。
當用户在 Chrome 中觸摸屏幕時,硬件生成輸入事件,這些事件不僅僅發送到一個線程或單一進程。它首先到達瀏覽器進程進行擊中測試,然後轉發到渲染器進程以計算新的滾動偏移。VSync 信號則沿著不同的路徑,經過多個進程到達 GPU 流程中的 Viz 合成器線程,並轉發給渲染器進程,該進程將其與輸入事件匹配以繪製新幀。然後,幀被發送到 GPU 流程以生成像素,最終由操作系統顯示在屏幕上。
為了使情況更加複雜,Chrome 直接從硬件消耗無緩衝的輸入。這意味著輸入事件以不規則的間隔到達 Chrome,通常在每個刷新週期內多次發生。考慮到多進程管道,Google 開展了幾個項目以減少滾動延遲,這些項目包括「自動化啟發式、針對性優化和深度架構變更」。這些努力包括:輸入預測:來自操作系統的輸入事件有時會延遲到即使輸入幀的寬限期也不夠。進一步延長寬限期並不是選項,因為這將增加 Chrome 無法及時生成幀的風險。
相反,如果操作系統在截止日期之前未交付任何輸入事件,Chrome 將創建自己的合成滾動更新,並根據其觀察到的滾動曲線預測未來的滾動位置。
在 Viz 中的瀏覽器控制:當用户開始在 Android 上向下滾動網站時,瀏覽器控制將與正在滾動的網站同步滑出視口。這兩個表面之間的同步運動以往涉及到每一幀中的瀏覽器主線程,因此會有許多視覺上的問題。我們改變了架構,使 GPU 流程能夠將每幀的滾動偏移應用於瀏覽器控制的截圖,而不需要與瀏覽器主線程進行交互。Android 輸入線程的優先級:一條鏈的強度取決於其最弱的環節,一個管道的速度取決於優先級最低的依賴。
我們發現,由於相關的操作系統線程被其他低優先級的工作預佔,輸入事件有時需要很長時間才能到達 Chrome。我們與 Android 合作,確保所有負責將硬件輸入傳遞到 Chrome 的線程都擁有足夠高的優先級。

