1. 程式人生 > >渲染樹構建、佈局及繪製

渲染樹構建、佈局及繪製

  • DOM 樹與 CSSOM 樹融合成渲染樹。
  • 渲染樹只包括渲染頁面需要的節點。
  • 佈局計算每個物件的精確位置及尺寸。
  • 最後一步的繪製,輸入確定的渲染樹,在螢幕上渲染畫素。

這裡寫圖片描述

構建渲染樹

為了構建渲染樹,瀏覽器大致做了如下:

  • 從 DOM 樹的根節點開始,遍歷每個可見的節點。
  • 某些節點完全不可見(例如 script 標籤、meta 標籤等),因為它們不會在渲染結果中反映,所以會被忽略。
  • 某些節點通過 CSS 隱藏,因此在渲染樹中也會被忽略。比方說,上面例子中的 span 節點,因為該節點有一條顯式規則設定了 display:none 屬性,所以不會出現在渲染樹中。
  • 給每個可見節點找到相應匹配的 CSSOM 規則,並應用這些規則。
  • 發射可見節點,連帶其內容及計算的樣式。

佈局過程輸出一個「盒模型」,它精確捕獲每個元素在視口中的準確位置及尺寸:所有相對度量單位都被轉換為螢幕上的絕對畫素位置

上述每一步都需要瀏覽器完成大量的工作,這也意味著它通常很耗時。所幸,Chrome DevTools 可以幫助我們深入瞭解上述三個階段。

這裡寫圖片描述

佈局階段

  • Timeline 中,”Layout” 事件捕獲渲染樹的構建及位置、尺寸的計算。
  • 一旦佈局完成,瀏覽器便釋出 ‘Paint Setup’ 與 ‘Paint’ 事件,將渲染樹轉化為螢幕上的實際畫素。

渲染樹的構建、佈局與繪製所需的時間取決於文件大小、應用的樣式,當然,還有執行文件的裝置:文件越大,瀏覽器要完成的工作就越多;樣式越複雜,繪製需要的時間就越長(例如,繪製單色成本較低,而 計算、呈現陰影

的成本就非常高了)。

瀏覽器執行的所有步驟

讓我們快速回顧一下瀏覽器執行的所有步驟:

  • 處理 HTML 標記,構建 DOM 樹。
  • 處理 CSS 標記,構建 CSSOM 樹。
  • 將 DOM 樹和 CSSOM 樹融合成渲染樹。
  • 根據渲染樹來佈局,計算每個節點的幾何資訊。
  • 在螢幕上繪製各個節點。

我們的演示頁面看起來也許很簡單,但也需要完成大量工作。您覺得如果修改了 DOM 或 CSSOM,會怎樣呢?我們將不得不重複上述所有步驟,以確定需要在螢幕上重新渲染的畫素。

優化關鍵渲染路徑 即儘可能地縮短上述第 1 步到第 5 步耗費的總時間。 這樣,我們可以在螢幕上儘可能快地渲染內容,還可以縮短首次渲染後螢幕重新整理之間的時間總量 - 也就是說,互動的內容可以有更高的重新整理率。

相關推薦

渲染構建佈局繪製

DOM 樹與 CSSOM 樹融合成渲染樹。 渲染樹只包括渲染頁面需要的節點。 佈局計算每個物件的精確位置及尺寸。 最後一步的繪製,輸入確定的渲染樹,在螢幕上渲染畫素。 構建渲染樹 為了構建渲染樹,瀏覽器大致做了如下: 從 DOM 樹的根節

二叉構建新增刪除和遍歷總結

敬請關注部落格,後期不斷更新優質博文,謝謝 原始碼: ------------------------------------------------------------------------------------ Node.java:

大規模知識圖譜的構建推理應用

知識圖譜的相關研究如火如荼地開展著,知識圖譜的構建與應用如雨後春筍般出現。大規模知識圖譜的構建與應用發展十分迅速,具有廣闊的前景。本次分享將著重探討知識圖譜構建的技術、方案、策略和知識圖譜的一些應用,以及知識圖譜中其他待研究的問題和挑戰。實錄提要:連結預測的原理大概是什麼?什

用Python實現二叉二叉非遞迴遍歷繪製

前言 關於二叉樹的實現與遍歷,網上已經有很多文章了,包括C, C++以及JAVA等。鑑於python做為指令碼語言的簡潔性,這裡寫一篇小文章用python實現二叉樹,幫助一些對資料結構不太熟悉的人快速瞭解下二叉樹。本文主要通過python以非遞迴形式實現二叉樹

圖解集合7:紅黑概念紅黑的插入旋轉操作詳細解讀

集合 得到 2個 排序。 數據流 except boolean 修正 split 原文地址http://www.cnblogs.com/xrq730/p/6867924.html,轉載請註明出處,謝謝! 初識TreeMap 之前的文章講解了兩種Map,分別是HashMa

赫夫曼構建編碼譯碼解析

fmt 獲取 插入 typedef child 構造方法 clas name lin 當你開始看這篇博文的時候。我相信你對樹及二叉樹的基本概念已有所了解。我在這裏就不再贅述。我們主要對赫 夫曼樹的特點、構建、編碼、譯碼做一個具體的介紹,並附有代碼,全部函數

three.js引擎基礎知識—攝像機場景渲染

blog new ram end 內部 渲染器 tro element col 一、three.js采用右手坐標系: x軸正方向向右,y軸正方向向上,z軸由屏幕從裏向外,如下圖右: 二、3D編程三要素:場景、渲染器、攝像機 1.場景:創建的物品和模型都需放入場景中 t

OSG 渲染(2) 渲染構建方式

什麼是OSG渲染樹? 為調整物件的渲染順序及子場景的渲染順序的產物 ,樹狀層次關係,渲染樹可以看成掛接了子場景節點的集合。根節點是渲染臺,子節點是渲染元,真正的繪製者是渲染葉。 RenderStage RenderBin RenderLeaf 渲染樹由哪些方式構建

機器學習實戰(Machine Learning in Action)學習筆記————03.決策原理原始碼解析測試

機器學習實戰(Machine Learning in Action)學習筆記————03.決策樹原理、原始碼解析及測試關鍵字:決策樹、python、原始碼解析、測試作者:米倉山下時間:2018-10-24機器學習實戰(Machine Learning in Action,@author: Peter Harr

哈夫曼構建編碼以及帶權路徑長計算

給定n個權值作為n個葉子結點,構造一棵二叉樹,若該樹的帶權路徑長度達到最小,稱這樣的二叉樹為最優二叉樹,也稱為哈夫曼樹(Huffman Tree)。哈夫曼樹是帶權路徑長度最短的樹,權值較大的結點離根較近。 構造哈夫曼樹的演算法如下:       

一般的遍歷合併對比

普通樹的遍歷、合併及對比 普通樹的遍歷、合併及對比 題目描述 程式設計要求 解題分析 日常開發過程中,我們經常會碰到樹這種資料結構,譬如許可權樹、區

next.jsnuxt.js等服務端渲染框架構建的專案部署到伺服器,並用PM2守護程式

前端渲染: vue、react等單頁面專案應該這樣子部署到伺服器 貌似從前幾年,前後端分離逐漸就開始流行起來,把一些渲染計算的工作拋向前端以便減輕服務端的壓力,但為啥現在又開始流行在服務端渲染了呢?如vue全家桶或者react全家桶,都推薦通過服務端渲染來實現路由。搞得我們慌得不行,不禁讓我想起一

決策構建展示與決策

1. 概述 上一篇日誌中,我們介紹了兩個決策樹構建演算法 – ID3、C4.5: 決策樹的構建演算法 – ID3 與 C4.5 演算法 本篇日誌我們來看看如何使用這兩個演算法以及其他工具構建和展示我們的決策樹

iOS探索:UI檢視之卡頓掉幀繪製原理

在開始理解卡頓、掉幀及繪製原理前,首先讓我們先了解下影象的顯示原理 影象顯示原理 關於CPU和GPU都是通過匯流排連線起來的,在CPU當中輸出的往往是一個位圖,再經由匯流排在合適的時機傳遞個GPU GPU拿到這個點陣圖之後,會對這個點陣圖的圖層進行渲染,包括紋理的合成等

JVM層次理解物件建立記憶體佈局訪問定位

物件的建立 物件的建立,當虛擬機器接收到new指令,會去檢查這個指令的引數是否能在常量池中定位到一個類的符號引用,並且檢查該引用是否已經被載入、解析和初始化過,如果沒有則必須經歷該過程。當類載入檢查通過後,物件建立所需的堆記憶體空間在類載入期間就已經完全確定,接下來在堆中以

淺談哈夫曼構建遍歷編碼

最近研究二叉樹,比較經典的樹就是哈夫曼樹了,所以研究一下它的構建以及哈夫曼編碼,惡補一下資料結構的知識。 有一段密文:aabbccabcacb,解析為電碼傳輸,只能為0、1來表示 例如 a 0 b 1 c 01 d 10 …

B——思路C語言程式碼的實現

1 #define _CRT_SECURE_NO_WARNINGS 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<time.h> 5 #define BTREEL

二叉的定義性質常見題

滿足以下兩個條件的樹形結構叫做二叉樹 1.每個結點的度都不大於2 2.每個結點的孩子次序不能顛倒 性質 在二叉樹的第i層上至多有2^(i-1)個結點 深度為k的二叉樹上至多有2^k-1個結點 對任何一棵二叉樹,若它含有n0 個葉子結點、n2 個度為

B-的插入查詢刪除 可執行的C語言程式碼

 前面討論的查詢都是內查詢演算法,被查詢的資料都在記憶體。當查詢的資料放在外存,用平衡二叉樹作磁碟檔案的索引組織時,若以結點為內外存交換的單位,則找到需要的關鍵字之前,平均要進行lgn次磁碟讀操作,而磁碟、光碟的讀寫時間要比隨機存取的記憶體代價大得多。其二,外存的存取是以“

View繪製原始碼淺析(二)佈局的測量佈局繪製

前言 在第一篇View繪製原始碼淺析(一)佈局的載入我們知道了setContentView()完成了DecorView的建立,並且將xml中的佈局標籤轉換成了對應的View、屬性轉換成了對應的LayoutParams然後新增到了id為content的佈局上,也就是說完成了佈局物件的建