`

WebKit渲染过程----《WebKit技术内幕》读书笔记

阅读更多

       webkit一般性渲染过程

      


       在浏览器中,有一个最重要的模块,它主要作用是将页面转变成可视化的图形结果,这就是浏览器内核。通常,它也被称为渲染引擎。所谓的渲染,就是根据描述或者定义构建数学模型,通过模型生成图像的过程。浏览器的渲染引擎就是能够将HTML/CSS/JavaScript文本及其相应的资源文件转换成图像结果的模块。
     根据渲染引擎所提供的渲染网页的功能,一般而言,它需要包含很多模块,主要分三层,最上层用虚线框住的是渲染引擎所提供的功能。


 
      从图中大致可以看出,一个渲染引擎主要包括HTML解释器、CSS解释器、布局和JavaScript引擎等,其他还有绘图模块、网络等并没有在图中直接表示出来。
  •       HTML解释器:解释HTML文本的解释器,主要作用是将HTML文本解释成DOM树,DOM是一种文档的表示方法。
  •       CSS解释器:级联样式表的解释器,它的作用是为DOM中的各个元素对象计算出样式信息,从而为计算最后网页的布局提供基础设施。
  •       布局:在DOM创建之后,Webkit需要将其中的元素对象同样式信息结合起来,计算它们的大小位置等布局信息,形成一个能够表示这所有信息的内部表示模型。
  •       JavaScript引擎:使用JavaScript代码可以修改网页的内容,也能修改CSS的信息,JavaScript引擎能够解释JavaScript代码并通过DOM接口和CSSOM接口来修改网页内容和样式信息,从而改变渲染的结果。
      这些模块依赖很多其他的基础模块,这其中包括网络、存储、2D/3D图形、音频视频和图片解码器等。实际上,渲染引擎中还应该包括如何使用这些依赖模块的部分。
     一般的渲染过程:如下图,从左上角开始,首先是网页内容,输入到HTML解释器,HTML解释器在解释它后构建成一棵DOM树,这期间如果遇到JavaScript代码则交给JavaScript引擎去处理;如果网页中包含CSS,则交给CSS解释器去解释。当DOM建立的时候,渲染引擎接收来自CSS解释器的样式信息,构建一个新的内部绘图模型。该模型由布局模块计算模型内部各个元素的位置和大小信息,最后由绘图模块完成从该模型到图像的绘制。


 
      图中虚线表示在渲染过程中,每个阶段可能使用到的其他模块。在网页内容的下载中,需要使用到网络和存储,这点显而易见。但计算布局和绘图的时候,需要使用2D/3D的图形模块,同时因为要生成最后的可视化结果,这时需要开始解码音频、视频和图片,同其他内容一起绘制到最后的图像中。
      在渲染完成之后,用户可能需要跟渲染的结果进行交互,或者网页自身有动画操作,一般而言,这需要持续的重复渲染过程。
 
Webkit的加载和渲染
 
        浏览器的主要作用就是将用户输入的URL转变成可视化的图像。按照某些文档的分析,这其中包含两个过程,其一是网页加载过程,就是从URL到构建DOM树;其二是网页渲染过程,从DOM树到生成可视化图像。其实,这两个过程也会交叉,很难给予明确的区分,所以,为了简单起见,统称网页渲染过程。
    网页渲染还有一个特性,就是网页通常比我们的屏幕可视面积要大,而当前可见的区域,我们称为视图(viewport)。因为网页比可视区域大,所以浏览器在渲染网页的时候,一般会加入滚动条以帮助翻滚网页。就用户体验来说,垂直方向滚动效果好于水平方向。
 
        Webkit的渲染过程
     整个渲染的过程中的包含数据和模块是:数据包含网页内容、DOM、内部表示和图像,模块则包括HTML解释器、CSS解释器、JavaScript引擎以及布局和绘图模块。
    根据数据的流向,这里将渲染过程分成三个阶段,第一个阶段是从网页的URL到构建完DOM树,第二个阶段是从DOM树到构建完WebKit的绘图上下文,第三个阶段是从绘图上下文到生成最终的图像。


 
      图中描述的是从网页URL到构建完DOM树的这个过程,数字表示的是基本顺序,当然也不是严格一致,因为这个过程可能重复并且可能交叉。
    具体的过程如下。
    1.当用户输入网页URL的时候,WebKit调用其资源加载器加载该URL对应的网页。
    2.加载器依赖网络模块建立连接,发送请求并接收答复。
    3.WebKit接收到各种网页或者资源的数据,其中某些资源可能是同步或异步获取的。
    4.网页被交给HTML解释器转变成一系列的词语(Token)。
    5.解释器根据词语构建节点(Node),形成DOM树。
    6.如果节点是JavaScript代码的话,调用JavaScript引擎解释并执行。
    7.JavaScript代码可能会修改DOM树的结构
    8.如果节点需要依赖其他资源,例如图片、CSS、视频等,调用资源加载器来加载它们,但是它们是异步的,不会阻碍当前DOM树的继续创建;如果是JavaScript资源URL(没有标记异步方式),则需要停止当前DOM树的创建,直到JavaScript的资源加载并被JavaScript引擎执行后才继续DOM树的创建。
 
    在上述的过程中,网页在加载和渲染过程中会发出“DOMContent”事件和DOM的"onload"事件,分别在DOM树构建完成之后,以及DOM树建完并且网页所依赖的资源都加载完成之后发生,因为某些资源的加载并不会阻碍DOM树的创建,所以这两个事件多数时候不是同时发生的。
    接下来就是WebKit利用CSS和DOM树构建RenderObject树直到绘图上下文
    

 
    这一阶段的具体过程如下:
    1.css文件被css解释器解释成内部表示结构
    2.CSS解释器工作完之后,在DOM树上附加解释后的样式信息,这就是RenderObject树
    3.RenderObject节点在创建的同时,WebKit会根据网页的层次结构创建RenderLayer树,同时构建一个虚拟的绘图上下文。
 
    RenderObject树的建立并不表示DOM树会被销毁,事实上,上述图中的四个内部表示结构一直存在,直到网页被销毁,因为它们对于网页的渲染起了非常大的作用。
    最后就是根据绘图上下文生成最终的图像,这一过程主要依赖2D和3D图形库,如下图:


 
    图中这一阶段对应的具体过程如下:
    
1.绘图上下文是一个与平台无关的抽象类,它将每个绘图操作桥接到不同的具体实现类,也就是绘图具体实现类。
2.绘图实现类也可能有简单的实现,也可能有复杂的实现。
3.绘图实现类将2D图形库或者3D图形库绘制的结果保存下来,交给浏览器来同浏览器界面一起显示。
 
       这一过程实际上可能不像图中描述的那么简单,现代浏览器为了绘图上的高效性和安全性,可能会在这一过程中引入复杂的机制。而且,绘图也从之前单纯的软件渲染,到现在的GPU硬件渲染、混合渲染模型等方式。
   上面介绍的是一个完整的渲染过程。现代网页很多事动态网页,这意味着在渲染完成之后,由于网页的动画或者用户的交互,浏览器其实一直在不停地重复执行渲染过程。
 
   
 
          
  • 大小: 3.4 KB
  • 大小: 11.3 KB
  • 大小: 14.8 KB
  • 大小: 13.3 KB
  • 大小: 9.1 KB
  • 大小: 8.9 KB
0
0
分享到:
评论

相关推荐

    webkit源代码阅读笔记

    ### WebKit源代码阅读笔记概览 WebKit是一个开源的浏览器引擎,被广泛应用于现代的浏览器中,包括Safari、Google Chrome等。理解WebKit的源代码不仅有助于深入掌握浏览器的工作原理,还能为开发者优化Web应用性能...

    webkit开发学习笔记(全面)_第一版

    **WebKit 开发学习笔记概述** WebKit 是一个开源的 Web 内核引擎,广泛应用于苹果的 Safari 浏览器、谷歌的 ...通过阅读和实践,开发者可以逐步掌握 WebKit 的核心原理和技术细节,为自己的职业生涯增添宝贵的技能。

    转:webkit开发学习笔记(全面)_第一版

    **WebKit 开发学习笔记概述** WebKit 是一个开源的网页内容渲染引擎,被广泛应用于各种浏览器,包括谷歌的 Chrome、苹果的 Safari、以及许多其他双核浏览器。WebKit 的诞生源自苹果公司在其 Mac OS X 操作系统中对 ...

    node-webkit

    3. **本地功能集成**:除了Web技术,Node-WebKit还允许访问操作系统级别的功能,如拖放操作、通知中心、菜单和对话框等,使Web应用具有与原生应用一样的用户体验。 4. **跨平台**:Node-WebKit可在Windows、Mac OS ...

    webkit笔记汇总

    本笔记汇总将深入探讨 WebKit 的核心原理,以及相关开发工具的使用,帮助开发者更深入地理解和优化网页性能。 ### 一、WebKit 源码结构 WebKit 的源码结构复杂,主要包括以下几个关键组件: 1. **WebCore**: 负责...

    webkit文档

    - `webkit源代码阅读笔记.doc` 可能是某个人在阅读 WebKit 源码过程中的笔记,记录了理解难点、关键函数和设计模式等。 5. **WebKit 加载网页的流程**: `WebKit加载网页的流程.pdf` 解释了 WebKit 如何从请求...

    新版Android开发教程&笔记四--Dalvik ADB

    ### 新版Android开发教程&笔记四--Dalvik ADB #### Android虚拟机Dalvik解析 随着Google发布的Android SDK,不仅带来了新的开发环境和技术规范,更重要的是引入了一个全新的虚拟机技术——Dalvik虚拟机。这一技术...

    5.25笔记.txt

    在Chromium项目中研发Blink渲染引擎( 即浏览器核心),内置于Chrome浏览器之中。Blink 其实是 WebKit的分支。 大部分国产浏览器最新版都采用Blink内核。 5,Presto--(Opera) Presto是挪威产浏览器opera的"前任"内核,...

    超详细的web前端基础学习笔记

    - **WebKit**:Safari 和 Chrome 的核心渲染引擎,是开源项目。 - **Gecko**:Firefox 使用的渲染引擎。 - **Presto**:Opera 浏览器曾经的渲染引擎。 - **Trident**:IE 浏览器的核心渲染引擎。 ##### HTML 基础 ...

    CSS3学习笔记.pdf

    ### CSS3 学习笔记知识点总结 #### 一、CSS3 简介 - **定义**:CSS3,即层叠样式表第三版,是Web前端开发中的一个重要组成部分,用于控制网页元素的布局和外观。 - **特性**:与CSS2相比,CSS3提供了更多功能强大的...

    Android学习笔记

    ### Android学习笔记 #### 1. Android概述 **1.1 Android的特性** - **应用框架**:Android提供了一个强大的应用框架,使得开发者能够轻松地重用基础组件和服务,简化了应用程序的开发流程。 - **Dalvik虚拟机**...

    我的前端学习笔记

    在不同浏览器中,使用了不同的前缀来实现,例如`::-moz-selection`是Firefox的,`::-webkit-selection`是Webkit内核浏览器(如Chrome和Safari)的。这三行CSS代码分别设置了选中文本的颜色和背景色。 接下来,笔记...

    CSS 笔记整理好的.zip

    - ** Vendor prefixes**:如 `-webkit-`,`-moz-`,`-ms-`,`-o-`,确保不同浏览器的兼容性。 - **浏览器前缀自动工具**:如Autoprefixer可自动添加必要的浏览器前缀。 8. **新特性**: - **CSS Grid Layout**、...

    51testing软件测试web开发课堂笔记

    ### 51testing软件测试web开发课堂笔记 #### 第一天课程概述 ##### 一、互联网基础知识 - **互联网(Internet)与互连(internet)**: 互联网是指全球性的计算机网络系统,而互连指的是不同网络之间的连接。 - **网络...

    浏览器笔记

    在mini2440上移植浏览器时,选择使用Qt Embedded-4.6.3版本,这一版本相对稳定,且支持Webkit引擎,能够满足基本的网页渲染需求。通过解压`qt-everywhere-opensource-src-4.6.3.tar.gz`包并执行`./asd.sh`脚本,可以...

    HTML5笔记1

    目前移动设备浏览器上常用的内核有Webkit,Blink,Trident,Gecko等,其中iPhone和iPad等苹果iOS平台主要是Webkit,Android4.4之前的Android系统浏览器内核是Webkit,Android4.4系统浏览器切换到了Chromium,内核是...

    H5笔记1

    在本篇笔记中,我们将深入探讨这两个关键技术及其在网页设计中的应用。 **第一部分:HTML5** HTML(HyperText Markup Language)是网页内容的基础结构语言,而HTML5则是其最新版本,它引入了许多新的元素、属性和...

    android笔记

    ### Android学习笔记要点 #### 一、Android平台概述 **1.1 Android的特性** - **应用框架**:提供了一套完整的应用框架,允许开发者轻松地重用基础设施。 - **Dalvik虚拟机**:专为移动设备优化的虚拟机,提高了...

    圣思园jsp笔记

    - 浏览器使用**WebKit**(如Safari浏览器的内核)或**Trident**(如Internet Explorer的内核)等不同的内核来渲染网页。 - 当用户在浏览器地址栏输入网址并访问网页时,通常使用的是**GET方法**。而**POST方法**通常...

    《CSS3实战》笔记--渐变设计(二)

    在《CSS3实战》的笔记中,我们看到了关于渐变设计的深入解析和应用实例,主要分为直线渐变和径向渐变两种类型。 直线渐变,顾名思义,指的是颜色沿直线方向的过渡。定义直线渐变时,可以指定渐变的起始点和终点位置...

Global site tag (gtag.js) - Google Analytics