圖解瀏覽器的多進程渲染機制

作者簡介:高揚,來自抖音社區安全前端團隊,團隊負責的工作重點在於降低社區中不良內容與行爲對用戶造成的傷害。

引言

觀察瀏覽器的任務管理器可以發現,打開瀏覽器的一個頁面需要多個進程,包括瀏覽器進程、GPU 進程、網絡進程、渲染進程等,有插件的話還會包括各種插件進程(Chrome 選項 -> 更多工具 -> 任務管理器)。

本文將聚焦於瀏覽器的各個進程間是如何配合,將頁面呈現給用戶的。

📌 你將瞭解到

  1. 瀏覽器在歷史發展過程中,其進程架構做了哪些調整,爲什麼這樣調整,以及解決了哪些問題?

  2. 從用戶在地址欄輸入 URL,到頁面渲染完成這之間發生了什麼?迴流和重繪是如何對瀏覽器性能造成影響的?

1. 瀏覽器進程架構的演化

進程和線程

  1. 進程
  1. 線程

單進程和多進程瀏覽器

單進程瀏覽器

單進程瀏覽器是指所有功能模塊(網絡、插件、JS 運行環境、渲染引擎、頁面等)都運行在同一進程中的瀏覽器(早期的 IE、Firefox)。

單進程瀏覽器存在的問題:

多進程瀏覽器

Chrome 一問世便使用了多進程的架構,其頁面運行在了單獨的渲染進程中,插件運行在單獨的插件進行中,進程間使用 IPC 進行通信。

瀏覽器的主要進程有哪些:

默認情況下,Chrome 會爲每個 Tab 標籤創建一個渲染進程。因爲渲染進程所有的內容都是通過網絡獲取的,會存在一些惡意代碼利用瀏覽器漏洞對系統進行攻擊,所以運行在渲染進程裏面的代碼是不被信任的。這也是爲什麼 Chrome 會讓渲染進程運行在安全沙箱裏,就是爲了保證系統的安全。

其實,Chrome 剛開始發佈的時候是沒有單獨 GPU 進程的,都是放到瀏覽器主進程中的。而 GPU 的使用初衷是爲了實現 3D CSS 的效果,只是隨後網頁、Chrome 的 UI 界面都選擇採用 GPU 來繪製,這使得 GPU 成爲瀏覽器普遍的需求。最後,Chrome 在其多進程架構上也引入了 GPU 進程。

多進程瀏覽器是如何解決單進程瀏覽的問題的:

多進程瀏覽器存在的問題:

2. 導航流程

從用戶發出 URL 請求到頁面開始解析的過程,叫做導航,是網絡加載流程和渲染流程之間的橋樑。

  1. 首先,瀏覽器進程接收到用戶輸入的 URL 請求,瀏覽器進程便將該 URL 通過 IPC 轉發給網絡進程。

  2. 然後,在網絡進程中發起真正的 URL 請求。

  3. 接着網絡進程接收到了響應頭數據,便解析響應頭數據,並將數據轉發給瀏覽器進程。

  4. 瀏覽器進程接收到網絡進程的響應頭數據之後,發送 “提交文檔 (CommitNavigation)” 消息到渲染進程。

  5. 渲染進程接收到 “提交文檔” 的消息之後,便開始準備接收 HTML 數據,接收數據的方式是直接和網絡進程建立數據管道。

  6. 待網絡進程中文檔數據傳輸完成,渲染進程會向瀏覽器進程 “確認提交”,這是告訴瀏覽器進程:“已經準備好接收和解析頁面數據了”。

  7. 瀏覽器進程接收到渲染進程 “確認提交” 的消息之後,導航流程就結束了。此時,渲染進程就會開始解析頁面和加載子資源了,瀏覽器進程將開始移除之前舊的文檔,然後更新瀏覽器進程中的頁面狀態。

3. 渲染流程

渲染流水線

渲染流水線可分爲如下幾個子階段:構建 DOM 樹、樣式計算、佈局、分層、繪製、分塊、光柵化和合成。

  1. 構建 DOM 樹(DOM)

  1. 樣式計算(Style)
  1. 佈局階段(Layout)
  1. 分層(Layer)

注意,並非佈局樹的每個節點都包含一個圖層,一個節點可以直接或間接地屬於一個層,例如一個節點可以從屬於父節點的圖層

  1. 圖層繪製(Paint)

  1. 柵格化(生成位圖)

  1. 合成與顯示

流水線總結

  1. 渲染進程將 HTML 內容轉換爲能夠讀懂的 DOM 樹結構。

  2. 渲染引擎將 CSS 樣式錶轉化爲瀏覽器可以理解的 styleSheets,計算出 DOM 節點的樣式。

  3. 創建佈局樹,並計算元素的佈局信息。

  4. 對佈局樹進行分層,並生成分層樹

  5. 爲每個圖層生成繪製列表,並將其提交到合成線程。

  6. 合成線程將圖層分成圖塊,並在光柵化線程池中將圖塊轉換成位圖。

  7. 合成線程發送繪製圖塊命令 DrawQuad 給瀏覽器進程。

  8. 瀏覽器進程根據 DrawQuad 消息生成頁面,並顯示到顯示器上。

迴流和重繪

基於上述瀏覽器的渲染原理,我們可以理解迴流和重繪是如何對瀏覽器性能造成影響的。由於瀏覽器渲染頁面默認使用流式佈局模型,當某個 DOM 或 CSS 幾何屬性發生改變後,文檔流就會受到波動,就需要對 DOM 重新進行計算,重新佈局頁面,引發迴流。

Reference

[1] 瀏覽器工作原理與實踐:https://time.geekbang.org/column/intro/100033601

[2] 瀏覽器進程架構的演化:https://zhuanlan.zhihu.com/p/96957235

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/6QR7niKFHY4StFZwDRfyKQ