渲染流程:从输入URL到页面展示,这中间发生了什么?

HTML CSS JavaScript数据经过渲染模块的处理,最终输出为屏幕上的像素。这中间的渲染模块就是我们今天要讨论的主题。


渲染流水线示意图
  1. 构建DOM树
  2. 样式计算
  3. 布局阶段
  4. 分层
  5. 图层绘制
  6. 栅格化操作
  7. 合成与显示

1. 构建DOM树

因为浏览器无法直接理解和使用 HTML,所以需要将 HTML 转换为浏览器能够理解的结构——DOM 树。

  • 输入:HTML文件
  • 处理过程:HTML解析器解析
  • 输出:树状结构的DOM树
DOM树构建过程示意图

打开 Chrome 的开发者工具,选择Console标签打开控制台,在控制台输入document并回车,这样就可以看到一个完成的DOM树结构

2. 样式计算

  • 输入:CSS文本
  • 处理过程:渲染引擎根据分三步完成CSS的解析
    1.document.styleSheets;
    2.属性值标准化;
    3.根据继承规则和层叠规则进行计算)
  • 输出:每个DOM节点的样式并被保存在ComputedStyle结构内
HTML加载CSS的三种方式
  1. 把css转换成浏览器能够理解的结构 -- styleSheets

打开 Chrome 的开发者工具,选择Console标签打开控制台,在控制台输入document.styleSheets并回车,这样就可以看到styleSheets的结构

  1. 转换样式表中的属性值,使其标准化


    标准化样式的属性值
  2. 计算出DOM树中每个节点的具体样式
  • 继承规则:DOM节点能继承父节点的可继承样式


    样式的继承示意图
  • 层叠规则:提供了如何合并来自多个源的属性值的算法


    DOM元素样式计算最终结果

3. 布局阶段

计算 DOM 树中可见元素的几何位置,该计算过程叫做布局。布局阶段需要完成两个任务:创建布局树和布局计算。

  • 输入:DOM树 + ComputedStyle结构
  • 处理过程:布局处理
  • 输出:布局树
  1. 创建布局树
    所有不可见元素都不会包含在布局树中。


    布局树构造示意图
  2. 布局计算
    计算布局树节点的坐标位置并更新布局树 - 该过程比较复杂此处不做展开。

4. 分层

渲染引擎会为特定的节点生成专用的图层并生成一颗对应的图层树。

  • 输入:布局树
  • 处理过程:渲染引擎处理
  • 输出:图层树

打开 Chrome 的开发者工具,选择Layers标签就可以看到可视化页面的分层情况

布局树和图层树的关系示意图

并不是布局树的每个节点都对应一个图层,如果一个节点没有对应的层,那么这个节点就从属于父节点的层。

需要满足什么条件,渲染引擎才会为特定的节点创建新的图层呢?
满足以下条件之一:

  1. 拥有层叠上下文属性的元素会被提升为单独的一层
  2. 需要剪裁的地方也会被创建为图层

5. 图层绘制

在完成图层树的构建之后,渲染引擎会对图层树中的每个图层进行绘制。

渲染引擎会把图层的绘制拆分成很多小的绘制指令,然后再把这些指令按顺序组成一个绘制列表。

绘制列表示意图

栅格化操作

实际上绘制操作是有渲染引擎中的合成线程来完成的。

渲染进程中的合成线程与主线程

主线程会把绘制列表提交给合成线程。
合成线程会将图层划分为图块(tile),大小通常为256x256或512x512.
合成线程按照视口附近的图块来优先生成位图。
所谓栅格化就是指将图块转换为位图

6. 合成与显示

一旦所有图块都被栅格化,合成线程就会生成一个绘制图块的命令“DrawQuad”,然后将该命令提交给浏览器进程。
浏览器进程接收合成线程发过来的“DrawQuad”命令然后根据该命令将页面内容绘制到内存中,最后将内存显示在屏幕上。

渲染流水线示意图

总结

结合上图,一个完整的渲染流程大致可总结为如下:

  1. 渲染进程将 HTML 内容转换为能够读懂的 DOM 树结构。
  2. 渲染引擎将 CSS 样式表转化为浏览器可以理解的 styleSheets,计算出 DOM 节点的样式。
  3. 创建布局树,并计算元素的布局信息。
  4. 对布局树进行分层,并生成分层树。
  5. 为每个图层生成绘制列表,并将其提交到合成线程。
  6. 合成线程将图层分成图块,并在光栅化线程池中将图块转换成位图。
  7. 合成线程发送绘制图块命令 DrawQuad 给浏览器进程。
  8. 浏览器进程根据 DrawQuad 消息生成页面,并显示到显示器上。

文章内容参考极客时间 李兵老师的浏览器工作原理与实践课程。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容