RenderingNG

準備好迎接新一代的網路內容

Chris Harrelson
Chris Harrelson

RenderingNG 是新一代的轉譯架構,效能遠勝以往。RenderingNG 已經過八年以上,代表許多專門 Chromium 開發人員的合作成果。它具有大量潛力,可實現快速、流暢、可靠、回應式和互動式的網路內容。

RenderingNG 不同元素的草圖
RenderingNG

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

北極星進球

想實現 RenderingNG 的目標,在於瀏覽器引擎的實作方式以及轉譯 API 的豐富程度,不應做為網路使用者體驗的限制因素。

因此,您不需要擔心瀏覽器發生錯誤,會導致功能不穩定,或是網站的算繪作業中斷。

不會有神秘的效能驟降。 此外,您應該不需要解決缺少的內建功能。

應該就能順利使用。

RenderingNG 是朝著北極星目標邁進一大步。在 RenderingNG 之前,我們就能 (也確實) 新增算繪功能並改善效能,但難以確保這些功能為開發人員提供可靠,而且效能開始出現許多阻礙。現在,我們建立了有系統性地壓縮許多這類問題的架構,並且解除封鎖先前不可行的進階功能。簡要說明如下:

  • 在各種平台、裝置和作業系統上提供強大核心功能。
  • 效能可預測且可靠。
  • 盡可能使用硬體功能 (核心、GPU、螢幕解析度、刷新率、低階光柵 API)。
  • 只執行顯示可見內容所需的工作。
  • 內建常見視覺設計、動畫和互動設計模式的支援。
  • 提供開發人員 API,輕鬆管理算繪成本。
  • 為開發人員外掛程式提供轉譯管道擴充功能點。
  • 對所有內容 (HTML、CSS、2D Canvas、3D 畫布、圖片、影片和字型) 進行最佳化調整。

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

Gecko 和 Webkit 也已實作這些網誌文章中提到的大部分架構功能,在某些情況下甚至在 Chromium 之前已新增這些功能。

任何瀏覽器越來越快可靠,都是我們舉辦慶祝活動的原因,也帶來了實質影響。最終目標是發展所有瀏覽器的基準,讓開發人員能夠依循這個基準。

成功的金字塔

我的理念是,成功才是讓機構達成可靠性,再進一步擴充效能,最後提升擴充性。

底層有「可靠度」標籤的金字塔
中間是效能且廣角

就像現實生活的金字塔一樣,每個關卡都能為上述關卡提供穩固的基礎。

可靠性

說明可以透過哪些方式新增 RenderingNG 功能,而不會大幅增加使用者的困擾

如果完全不提供豐富且複雜的使用者體驗,我們首先需要的就是穩固的平台。核心功能與基礎配置必須能正常運作,且會隨著時間持續運作。請同樣重要的是,這些功能可妥善配置,且不會執行奇怪的極端情況或錯誤。

草圖顯示了新增功能、收集意見回饋、提升可靠性的循環性質

因此,可靠性是 RenderingNG 最重要的部分。而「可靠性」則是由良好的測試、品質意見回饋循環、指標和軟體設計模式產生的結果。

過去八年來,我們花了許多時間處理這部分,對於我認為可靠性的重要性。首先,我們建立深入瞭解系統的知識,透過錯誤報告瞭解弱點並加以修正、啟動全面測試,並瞭解網站的效能需求和 Chromium 效能限制。接著,我們精心設計並逐步推出重要的設計模式和資料結構。唯有如此,我們才能著手新增真正新一代的基本功能,以打造回應式設計、擴充性和自訂轉譯功能。

草圖顯示可靠性、效能和擴充性隨時間逐漸提升

這表示 Chromium 在該段時間內沒有改善。 事實上,相反地! 這些年來,隨著我們逐步重構及推出各項改善措施,可靠性和效能表現穩定且持續攀升。

測試與指標

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

但是,無論 RenderingNG (或其他瀏覽器的轉譯引擎) 有多麼強大,如果瀏覽器之間出現大量錯誤或行為差異,仍然難以為網路開發出奇心。為解決這個問題,我們也會盡可能使用網路平台測試。每項測試都會驗證所有瀏覽器應通過的網頁平台使用模式。我們也會密切監控多項指標,以便持續通過更多測試提高核心相容性

Web Platform Tests 是一項合作計畫。舉例來說,針對 CSS 功能的所有 WPT 測試,Chromium 工程師只新增了約 10% 的成果,其他瀏覽器供應商、獨立貢獻者和規格作者則能貢獻一己之力。打造互通性的網路環境,是仰賴眾人之力!

導入不同引擎的測試
wpt.fyi/compat2021 起,測量核心功能的 WPT 通過率

良好的軟體設計模式

穩定提供優質軟體,如果程式碼易於理解,且設計時能盡量降低發生錯誤的可能性,就會大幅簡化。我們會在後續的網誌文章中進一步說明 RenderingNG 的軟體設計。

可擴充的效能

在速度、記憶體和耗電量等各方面獲得良好效能,是 RenderingNG 的下一個重要面向。我們希望與所有網站互動時,都能流暢且快速回應,但同時不犧牲裝置的穩定性。

然而,我們想要的是效能,我們想要的是可擴充的效能,這個架構能在低端和高階機器以及各種 OS 平台上穩定執行,可靠運作。我稱之為向上擴充,充分運用硬體裝置可達到的成果以及縮減資源,將效率提高,並在需要時減少系統上的需求。

為了達到這個目標,我們必須充分運用快取、效能隔離和 GPU 硬體加速功能。以下逐一介紹明確地說,以下就來探討這些動作對於網頁上的一次重要互動效能有何影響:捲動頁面。

快取

在網頁等動態的互動式 UI 平台上,快取是可大幅改善效能最重要的單一方法。瀏覽器中最常見的快取類型是 HTTP 快取,但轉譯作業也有許多快取。要捲動的最重要快取是快取的 GPU 紋理和顯示清單,這可提升捲動速度極快,同時可在多種裝置上降低電池耗電量及運作順暢。

快取對於捲動時的電池續航力和動畫影格速率,但更重要的是,這麼做可解除封鎖主執行緒之間的效能隔離。

效能區隔

在新式電腦上,您不必擔心背景應用程式會拖慢工作速度。這是因為先佔的多工處理功能會轉變為效能隔離的形式:確保獨立工作不會彼此執行速度變慢。

在網站上,效能隔離的最佳例子就是捲動畫面。即使是在含有大量 JavaScript 速度緩慢的網站上,捲動作業也可能非常順暢,因為這類程式碼會在不同的執行緒上執行,無須依賴 JavaScript 和版面配置執行緒。我們投入大量心力,讓 RenderingNG 確保所有可能的捲動作業都能透過執行緒處理,這項機制不只用於顯示清單,甚至適用於更複雜的情況。例如:代表固定位置和固定位置元素的程式碼、被動事件監聽器,以及高品質文字算繪。

草圖顯示,即使 JavaScript 速度非常慢,RendingNG 的效能仍保持穩定;

GPU 加速

GPU 可大幅加快產生像素及繪製螢幕的速度;在許多情況下,每個像素可以與所有其他像素平行繪製,進而導致速度大幅增加。RenderingNG 的一大要素是 GPU 光柵,可在任何地方繪製。這個架構會在所有平台和所有裝置中使用 GPU,以加快網頁內容的轉譯和動畫速度。這對低階裝置或超高階裝置尤其重要,因為這類裝置的 GPU 通常比裝置的其他部分還多。

草圖顯示,RendingNG 的效能並不會降低許多。

擴充性:適合工作的工具

一旦我們擁有穩定性和可擴充性的效能,現在可以以一系列工具為基礎,協助開發人員擴充 HTML、CSS 和 Canvas 的內建部分,以不犧牲效能和可靠性的方式,為開發人員擴充這類元件。

這包括內建加上 JavaScript 公開的 API,適用於回應式設計、漸進式轉譯、流暢度和回應速度,以及執行緒轉譯的進階用途。

下列由 Chromium 主導的開放式網路 API 是由 RenderingNG 所開發,之前被認為是不可行的。

所有這些設備都是根據開放規格開發而成,並與開放式網路合作夥伴 (其他瀏覽器、專家和網頁開發人員的工程師) 攜手合作。在後續的網誌文章中,我們會逐一深入探討這些主題,並說明 RenderingNG 如何做到這點。

  • 內容瀏覽權限:可讓網站輕鬆避免畫面外內容轉譯工作,並針對目前未顯示的單頁面應用程式檢視畫面,進行快取轉譯。
  • OffscreenCanvas:允許畫布算繪 (2DCanvas API 和 WebGL 皆可) 在自己的執行緒上執行,以獲得可靠的卓越效能。這項專案也是網路的另一項重要里程碑,也是第一個允許 JavaScript (或 WebAssembly!) 從多個執行緒轉譯單一網頁文件的 Web API。
  • 容器查詢:允許單一元件根據回應自行版面配置,解除封鎖整個隨插即用元件 (目前為實驗實作項目)。
  • 來源隔離:允許網站選擇在 iframe 之間啟用效能隔離功能。
  • 非主執行緒繪製工作程式:可讓開發人員利用在合成器執行緒上執行的程式碼,擴充元素的繪製方式。

除了明確的網路 API 外,RenderingNG 也讓我們提供多項極為重要的「自動功能」,造福所有網站:

  • 網站隔離:在不同的 CPU 程序中加入跨來源 iframe,以提升安全性和效能隔離效果。
  • VulkanD3D12Metal:使用比 OpenGL 更有效率的低階 API,
  • 更多合成動畫:SVG、背景顏色。

好消息是,RendingNG 無法再推出的其他功能,包括:

RenderingNG 的關鍵專案

以下列出 RenderingNG 中的重要專案。

CompositeAfterPaint

CompositeAfterPaint 異度因樣式、版面配置和繪製而產生的位移,可在不犧牲效能的情況下,大幅提高可靠性和可預測效能、提高總處理量並減少記憶體用量。

進度
2015 出貨顯示清單。
2017 寄送新的撤銷。
2018 船舶屬性樹第 1 部分。
2019 船舶屬性樹第 2 部分。
2021 專案已出貨。

LayoutNG

從頭開始重新編寫所有版面配置演算法,大幅提高可靠性和可預測的效能。

進一步瞭解LayoutNG

進度
2019 運送區塊流。
2020 船具彈性,編輯。
2021 寄送其他東西。

BlinkNG

我們重構閃爍引擎,並將其清理為乾淨的管道階段。這可以提供更好的快取效能、更高的可靠性,以及重新輸入或延遲轉譯功能,例如內容瀏覽權限和容器查詢。

隨處可用的 GPU 加速功能

對於大多數內容,GPU 加速功能可平行處理每個像素,因此速度極快。在通常仍具備 GPU 的低階裝置上,也是提升效能的有效方法。

進度
2014 Canvas 支援。已於 Android 裝置加入選擇加入的內容。
2016 用 Mac 出貨。
2017 超過 60% 的 Android 網頁瀏覽都在使用 GPU。
2018 透過 Windows、ChromeOS 和 Android Go 出貨。
2019 執行緒 GPU 光柵化。
2020 傳送剩餘的 Android 內容。

執行緒捲動、動畫和解碼

長期推動將主執行緒中的所有捲動操作、非版面配置相關的動畫和圖片解碼作業移出主執行緒。更新中。

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

維茲

Chromium 的集中式光柵和繪圖程序,可提高處理量、最佳化記憶體,並充分運用硬體功能。這對網頁程式開發人員來說還有很多好處,但使用者也能清楚看到,例如解除封鎖網站隔離,以及將轉譯管道與瀏覽器 UI 轉譯分離。

進度
2018 OOP-R 已推出 Android、Mac 和 Windows 裝置,
2019 OOP-D 已出貨。OOP-R 已出貨至任何地方 (畫布除外)。SkiaRenderer 已推出 Linux。
2020 SkiaRenderer 內建 Windows 和 Android 系統。Vulkan 搭載 Android。
2021 SkiaRenderer 現已推出 Mac (與 ChromeOS 版本)。

上方圖表中的字詞定義:

失誤
獨立程序的顯示合成器。顯示合成活動與 OS 合成器相同。未處理是指在 Viz 程序中進行,而非網頁的轉譯程序或瀏覽器 UI 程序。
OOP-R
獨立程序光柵。光柵正在將顯示清單轉換成像素。未處理是指在 Viz 程序中執行,而非網頁的轉譯程序。
SkiaRenderer
全新的螢幕合成器實作項目,支援在各種不同的基礎 GPU API (例如 Vulkan、D3D12 或 Metal) 上執行。

執行緒和加速畫布算繪

這就是實現 OffscreenCanvas 的專案。

進度
2018 從螢幕外出貨。
2019 Ship ImageBitmapRenderingContext。
2021 出貨 OOP-R。

VideoNG

VideoNG 的用途為在網站上提供高效率、可靠且高品質的影片播放方式。

進度
2014 引進以 Mojo 為基礎的轉譯架構。
2015 出貨的專案 Butter 和影片重疊,使視訊畫面算繪順暢。
2016 傳送整合式 Android 與桌面解碼及轉譯管道。
2017 已出貨的 HDR 相片和經過色彩校正的影片。
2018 已傳送的 Mojo 影片解碼管道。
2019 出貨的途徑式影片轉譯管道。
2021 已於 ChromeOS 開始支援 4K 受保護內容顯示功能。

上方圖表中的字詞定義:

摩仔
Chromium 的新一代 IPC 子系統。
途徑
這是 Viz 專案設計中的這個概念。

插圖:Una Kravets。