RenderingNG

迎接新一代的網路內容

Chris Harrelson
Chris Harrelson

RenderingNG 是新一代算繪架構,效能遠勝先前版本。RenderingNG 的建構時間超過八年,代表著許多專業 Chromium 開發人員的共同努力。這項技術可為快速、流暢、可靠、回應迅速且具互動性的網路內容開啟無限潛力。

RenderingNG 的各個元素草圖
RenderingNG

本文將說明我們建構的內容、建構原因,以及運作方式。

北極星目標

RenderingNG 的北極星目標是,瀏覽器引擎實作方式和其轉譯 API 的豐富程度,不應成為網頁使用者體驗的限制因素。

您不必擔心瀏覽器錯誤會導致功能不穩定,或導致網站無法正常轉譯。

不應出現不明原因的效能下滑情形。而且,您不必因應缺少的內建功能而調整。

應該會正常運作。

這項計畫是朝向這個北極星目標邁進的重要一步。在 RenderingNG 推出之前,我們可以 (而且確實) 新增算繪功能並改善效能,但很難讓這些功能對開發人員可靠,而且效能也經常出現斷崖。我們現在採用的架構可有系統地解決許多問題,並且解除先前認為不可行的進階功能。其中包括:

  • 在不同平台、裝置和作業系統組合中提供穩固的核心功能。
  • 具備可預測且可靠的效能。
  • 盡可能使用硬體功能 (核心、GPU、螢幕解析度、更新率、低階光柵 API)。
  • 只執行顯示可見內容所需的工作。
  • 內建支援常見的視覺設計、動畫和互動設計模式。
  • 提供開發人員 API,方便管理轉譯成本。
  • 為開發人員外掛程式提供轉譯管道擴充點。
  • 可針對所有內容進行最佳化,包括 HTML、CSS、2D 畫布、3D 畫布、圖片、影片和字型。

與其他瀏覽器轉譯引擎的比較

Gecko 和 WebKit 也實作了這些網誌文章中所述的大部分相同架構功能,在某些情況下甚至比 Chromium 更早加入這些功能。

任何瀏覽器的速度和可靠性提升,都是值得慶祝的喜訊,也能帶來實際影響。最終目標是提升所有瀏覽器的基準,讓開發人員能信賴這些基準。

成功金字塔

我的理念是,要想成功,就必須先達成可靠性,然後是可擴充的效能,最後是可擴充性。

金字塔圖形,底部標示「Reliability」,中間標示「Performance」,頂部標示「Extensibility」

就像現實生活中的金字塔一樣,每個層級都為上層提供必要的穩固基礎。

可靠性

草圖,說明如何新增 RenderingNG 功能,且不會大幅增加使用者挫折感

如要提供豐富且複雜的使用者體驗,我們首先需要的是穩固的平台。核心功能和基礎架構必須正常運作,並持續運作。同樣重要的是,這些功能必須能良好組合,且不會出現奇怪的邊緣情況行為或錯誤。

Sketch 顯示新增功能、取得意見回饋、改善可靠性的循環特性

因此,穩定性是 RenderingNG 最重要的部分。可靠性則是良好測試、優質的意見回饋循環、指標和軟體設計模式的結果。

為了讓大家瞭解我認為可靠性有多重要,我們在過去八年大部分的時間都專注於這個部分。首先,我們深入瞭解系統的運作方式,從錯誤報告中找出弱點並加以修正,啟動全面測試,並瞭解網站的效能需求和 Chromium 效能的限制。接著,我們仔細地逐步設計並推出主要設計模式和資料結構。只有在那個時候,我們才準備好為回應式設計、可擴充性和算繪自訂化,新增真正新一代的基礎元素。

草圖圖表顯示可靠性、效能和可擴充性隨時間改善

這並非表示 Chromium 在那段期間沒有任何改善。事實上,反之亦然!在那段期間,我們逐步重構並推出各項改善措施,可靠性和效能持續提升。

測試和指標

過去 8 年來,我們新增了數萬個單元、效能和整合測試。此外,我們也開發了全面的指標,可評估 Chromium 在本機測試、效能基準測試,以及實際網站上實際使用者和裝置的運算行為。

不過,無論 RenderingNG (或其他瀏覽器的轉譯引擎) 有多強大,如果瀏覽器之間存在許多錯誤或行為差異,開發人員仍無法輕鬆為網頁進行開發。為解決這個問題,我們也會盡可能使用網頁平台測試。每項測試都會驗證網站平台的使用模式,所有瀏覽器都應以通過測試為目標。我們也會密切監控指標,隨著時間的推移通過更多測試,並提高核心相容性

Web Platform 測試是一項合作計畫。舉例來說,Chromium 工程師只新增了 CSS 功能的 10% 總 WPT 測試;其他瀏覽器供應商、獨立貢獻者和規格作者則負責其餘的部分。我們需要集結眾人之力,才能打造可互通的網路!

在不同引擎中通過的測試
根據 wpt.fyi/compat2021 的測試,評估 WPT 針對核心功能的通過率

良好的軟體設計模式

如果程式碼易於理解,並以盡可能減少錯誤的設計方式進行編寫,就能更輕鬆地提供可靠的優質軟體。我們會在後續的網誌文章中,進一步說明 RenderingNG 的軟體設計。

可調整的效能

在速度、記憶體和電力使用量等方面,達成出色的效能,是 RenderingNG 的次要重點。我們希望與所有網站的互動都能順暢且即時回應,但不會犧牲裝置的穩定性。

但我們不只想要效能,我們想要的是可擴充的效能,也就是在低階和高階機器上,以及跨作業系統平台上,都能穩定發揮效能的架構。我稱之為「向上調整」(利用硬體裝置可達成的所有功能) 和「向下調整」(盡可能提高效率,並在必要時降低系統需求)。

為達到這個目標,我們需要盡可能善用快取、效能隔離和 GPU 硬體加速功能。我們來逐一探討。為了讓這項概念更具體,我們來思考一下,每個因素如何影響網頁上一個非常重要的互動:捲動。

快取

在動態互動式 UI 平台 (例如網頁) 中,快取是大幅改善效能的唯一重要方法。瀏覽器中最常見的快取類型是 HTTP 快取,但轉譯也有許多快取。捲動畫面時最重要的快取是快取的 GPU 材質和顯示清單,可讓捲動畫面時速度極快,同時盡量減少電池耗電量,並在各種裝置上正常運作。

快取可延長電池續航力,並提高捲動動畫的幀率,但更重要的是,它可解除主執行緒的效能隔離。

效能隔離

在現代化的電腦上,您不必擔心背景應用程式會拖慢您正在使用的應用程式。這是因為預先執行多工作,這也是一種效能隔離形式:確保獨立工作不會互相拖慢。

在網路上,捲動畫面是最佳的效能隔離範例。即使網站的 JavaScript 速度緩慢,捲動畫面也能非常順暢,因為這項功能會在不同的執行緒上執行,不必依賴 JavaScript 和版面配置執行緒。我們在 RenderingNG 上投入大量心力,確保每個可能的捲動動作都會以多執行緒執行,並透過快取功能,將顯示清單的複雜度提升至更高層級。例如代表固定和固定位置元素的程式碼、被動事件監聽器,以及高品質文字轉譯。

從草圖中可知,即使 JavaScript 速度非常慢,RenderingNG 的效能仍能維持穩定。

GPU 加速

GPU 可大幅加快產生像素及繪製至螢幕的速度。在許多情況下,每個像素都能與其他像素並行繪製,因此速度會大幅提升。RenderingNG 的關鍵元件是 GPU 光柵和隨處繪製。這項功能會在所有平台和裝置上使用 GPU,以便加速轉譯及動畫化網頁內容。這點對於低階或高階裝置尤其重要,因為這類裝置的 GPU 通常比裝置的其他部分更強大。

草圖顯示,使用 RenderingNG 時效能並未大幅降低。

可擴充性:適合工作需求的工具

在確保穩定性和可擴充的效能後,我們現在可以利用多項工具,協助開發人員擴充 HTML、CSS 和 Canvas 內建的部分,且不會犧牲任何辛苦獲得的效能和穩定性。

其中包括內建的 API 和 JavaScript 公開 API,可用於回應式設計、漸進式算繪、流暢度和回應速度,以及多執行緒算繪等進階用途。

以下是 Chromium 大力提倡的開放式網路 API,這些 API 原本被視為不可能實現,但現在則得益於 RenderingNG 而得以實現。

這些功能都是根據開放規格開發,並與開放網路合作夥伴 (其他瀏覽器的工程師、專家和網頁開發人員) 合作開發。在後續的網誌文章中,我們將深入探討這些功能,並說明 RenderingNG 如何實現這些功能。

  • content-visibility:讓網站輕鬆避免為畫面外內容進行轉譯作業,並快取目前未顯示的單頁應用程式檢視畫面的轉譯作業。
  • OffscreenCanvas:可讓畫布轉譯 (包括 2D 畫布 API 和 WebGL) 在其專屬執行緒上執行,以確保可靠的優異效能。這個專案也是網頁的另一個重大里程碑,因為這是第一個允許 JavaScript (或 WebAssembly) 從多個執行緒轉譯單一網頁文件的網頁 API。
  • 容器查詢:允許單一元件以回應式方式自行版面配置,解除整個即插即用元件的封鎖 (目前為實驗性質的實作)。
  • 來源隔離:允許網站選擇在 iframe 之間進行更多成效隔離。
  • 主執行緒外繪圖工作項:開發人員可透過在轉譯器執行緒上執行的程式碼,擴充元素的繪圖方式。

除了明確的網頁 API 之外,RenderingNG 也讓我們能夠提供多項對所有網站都有益的「自動功能」:

  • 網站隔離:將跨來源 iframe 放入不同的 CPU 程序,以提升安全性和效能隔離。
  • VulkanD3D12Metal:利用較低層級 API 的優勢,比 OpenGL 更有效率地使用 GPU。
  • 更多合成的動畫:SVG、背景顏色。

RenderingNG 解除封鎖的其他即將推出的功能,包括:

組成 RenderingNG 的主要專案

以下是 RenderingNG 中的主要專案清單。

CompositeAfterPaint

CompositeAfterPaint 會將合成作業與樣式、版面配置和繪製作業分開,讓可靠性和可預測的效能大幅提升,並提高傳輸量,同時減少記憶體用量,而不犧牲效能。

進度
2015 傳送顯示清單。
2017 傳送新的無效化。
2018 船舶資源樹狀結構 1。
2019 船舶資源樹狀結構,第 2 部分。
2021 已完成專案運送。

LayoutNG

從頭開始重寫所有版面配置演算法,大幅提升可靠性,並提供更可預測的效能。

進一步瞭解 LayoutNG

進度
2019 發布區塊流程。
2020 提供彈性,可供編輯。
2021 運送其他所有內容。

BlinkNG

我們已重構並清理Blink 轉譯引擎,將其分成清楚分隔的管道階段。這可提供更優異的快取、更高的可靠度,以及重疊或延遲轉譯功能,例如內容可見度和容器查詢。

隨處 GPU 加速

由於每個像素都能並行處理,因此 GPU 加速可為大多數內容提供極大的速度提升。這也是改善低階裝置效能 (通常仍有 GPU) 的有效方法。

進度
2014 支援無框畫。在 Android 上針對選擇加入的內容發布。
2016 在 Mac 上發布。
2017 超過 60% 的 Android 網頁瀏覽次數都會使用 GPU。
2018 在 Windows、ChromeOS 和 Android Go 上發布。
2019 執行緒化 GPU 光柵化。
2020 發布剩餘的 Android 內容。

分割捲動、動畫和解碼

長期努力將所有捲動、非版面配置誘發動畫和圖片解碼作業移出主執行緒。這項工作仍在進行中。

進度
2011 初步支援分割捲動和動畫。
2015 圖層壓縮。
2016 通用溢位捲動功能。
2017 在合成器執行緒上解碼圖片。
2018 在合成器執行緒上顯示圖像動畫。
2020 一律合成固定位置。
2021 百分比轉換動畫、SVG 動畫。

Viz

這是 Chromium 的集中式光柵和繪圖程序,可提高處理量、最佳化記憶體,並讓硬體功能發揮最佳效益。這項功能還有其他好處,雖然網頁開發人員較少接觸,但使用者卻能明顯感受到,例如解除網站隔離功能的封鎖,以及將轉譯管道與瀏覽器 UI 轉譯作業解耦。

進度
2018 OOP-R 已在 Android、Mac 和 Windows 上發布。
2019 OOP-D 已出貨。OOP-R 已在所有地區推出 (Canvas 除外)。在 Linux 上提供 SkiaRenderer。
2020 SkiaRenderer 已在 Windows 和 Android 上發布。在 Android 上推出 Vulkan。
2021 SkiaRenderer 已在 Mac 上推出 (ChromeOS 也即將推出)。

上方圖表中各項條件的定義:

OOP-D
離線顯示合成器。顯示合成是與作業系統合成器相同類型的活動。這表示在 Viz 程序中執行,而非在網頁的轉譯程序或瀏覽器 UI 程序中執行。
OOP-R
離線處理算繪。轉成點陣圖會將顯示清單轉換為像素。這表示在 Viz 程序中執行,而非在網頁的轉譯程序中執行。
SkiaRenderer
新的顯示器合成器實作項目,可支援在各種不同的基礎 GPU API 上執行,例如 Vulkan、D3D12 或 Metal。

以多執行緒和加速方式轉譯無框畫

這是讓 OffscreenCanvas 成為可能的專案。

進度
2018 傳送 OffscreenCanvas。
2019 傳送 ImageBitmapRenderingContext。
2021 出貨 OOP-R。

VideoNG

VideoNG 是長期努力的成果,可在網路上提供高效、可靠且高品質的影片播放服務。

進度
2014 推出以 Mojo 為基礎的轉譯架構。
2015 提供 Project Butter 和影片疊加功能,讓影片算繪更順暢。
2016 推出統一的 Android 和電腦解碼及轉譯管道。
2017 已發布 HDR 和經過色彩校正的影片算繪功能。
2018 已發布以 Mojo 為基礎的影片解碼管道。
2019 已發布以 Surface 為基礎的影片轉譯管道。
2021 在 ChromeOS 上提供4K 受保護內容轉譯支援功能。

上方圖表中各項條件的定義:

Mojo
Chromium 的新一代 IPC 子系統。
Surface
屬於 Viz 專案設計的概念。

插圖由 Una Kravets 提供。