GUI渲染線程

瀏覽器有多個(gè)線程:JS引擎線程、GUI渲染線程、http請求線程、事件處理線程、定時(shí)器觸發(fā)線程。其中JS引擎線程和GUI渲染線程是互斥的。

GUI渲染線程主要工作內(nèi)容

  • 解析html文檔生成DOM
  • css代碼轉(zhuǎn)換為cssom (css object model)
  • 結(jié)合DOM和CSSOM生成渲染樹
  • 生成布局(layout)
  • 將布局繪制(paint)在屏幕上

屏幕刷新頻率和GUI渲染線程

GUI線程渲染的結(jié)果不會立刻呈現(xiàn)在屏幕上,等屏幕刷新時(shí)才會呈現(xiàn)出來。屏幕刷新頻率一般60HZ,即16.6ms刷新一次屏幕。

GUI渲染線程調(diào)度

事件循環(huán)請參考瀏覽器事件循環(huán)機(jī)制。在下次宏任務(wù)執(zhí)行前,GUI渲染線程開始工作,對頁面進(jìn)行渲染。即

// 宏任務(wù) --> 所有微任務(wù) --> 渲染(如果時(shí)間片到了) --> 宏任務(wù)...

例子1:

document.body.style = "background:blue";
console.log(1);
setTimeout(function fn() {
  document.body.style = "background:black";
  console.log(2);
}, 0);

執(zhí)行過程:

  1. script作為宏任務(wù)執(zhí)行,打印1;
  2. 渲染,背景藍(lán)色;
  3. 執(zhí)行宏任務(wù)fn,打印2;
  4. 渲染,背景黑色;

例子2:

let ul = document.getElementById("root");

  setTimeout(function fn111() {
    let li = document.createElement("li");
    li.innerText = 11111;
    ul.appendChild(li);
  }, 0);
  setTimeout(function fn2222222() {
    let li = document.createElement("li");
    li.innerText = 2222222222222;
    ul.appendChild(li);
  }, 0);

執(zhí)行過程:

  1. script作為宏任務(wù)執(zhí)行,定時(shí)器觸發(fā)線程把fn111, fn2222222放入宏任務(wù)隊(duì)列
  2. 執(zhí)行宏任務(wù)fn111
  3. 時(shí)間片沒到,繼續(xù)執(zhí)行fn2222222
  4. 渲染

下面是chrome performance Main 線程圖,黃色塊分別是fn111, fn2222222,紫色塊是Layout,綠色是paint


調(diào)用棧.png

例子3:

let ul = document.getElementById("root");

  setTimeout(function fn111() {
    console.time(1);
    let li = document.createElement("li");
    li.innerText = 11111;
    ul.appendChild(li);
    for (let index = 0; index < 200; index++) {
      console.log(1);
    }
  }, 0);
  setTimeout(function fn2222222() {
    let li = document.createElement("li");
    li.innerText = 2222222222222;
    ul.appendChild(li);
    // 模擬耗時(shí)任務(wù),大約16ms
    for (let index = 0; index < 1; index++) {
      console.log(1);
    }
  }, 0);

執(zhí)行過程:

  1. script作為宏任務(wù)執(zhí)行,定時(shí)器觸發(fā)線程把fn111, fn2222222放入宏任務(wù)隊(duì)列
  2. 執(zhí)行宏任務(wù)fn111
  3. 時(shí)間片到了,渲染
  4. 繼續(xù)執(zhí)行fn2222222
  5. 渲染

下面是chrome performance Main 線程圖,黃色塊分別是fn111, fn2222222,紫色塊是Layout,綠色是paint。


執(zhí)行棧.png

總結(jié)

  1. js引擎線程和GUI渲染線程是互斥的;

  2. js引擎線程和GUI渲染線程的調(diào)度順序:宏任務(wù) --》 所有微任務(wù) --》16.6ms的時(shí)間片到了調(diào)度渲染線程 --》宏任務(wù)...

參考文檔

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容