WebKit渲染

WebKit:探秘网页渲染的魔法引擎 WebKit的JavaScript引擎采用了先进的编译和优化技术,能够快速解析和执行JavaScript代码,为用户带来流畅的网页体验。每当我们打开浏览器,输入网址,按下回车键,WebKit便开始施展它的魔法,将网页的HTML、CSS和JavaScript等代码转化为我们在屏幕上看到的精彩世界。总的来说,WebKit是一个强大而高效的网页渲染引擎,它以其出色的性能和开放的态度赢得了广大用户的喜爱和信赖。在WebKit的助力下,我们的浏览器变得更加智能和便捷,让我们能够轻松地畅游在数字世界的海洋中。 阅读详情

转:http://blog.youkuaiyun.com/milado_nju/article/details/7292131

# WebKit渲染基础

## 概述

WebKit是一个引擎,而不是一个浏览器,它专注于网页内容展示,其中渲染是其中核心的部分之一。本章着重于对渲染部分的基础进行一定程度的了解和认识,主要理解基于DOM树来介绍Render树和RenderLayer树的构建由来和方式。

那么什么是DOM?简单来说,DOM是对HTML或者XML等文档的一种结构化表示方法,通过这种方式,用户可以通过提供标准的接口来访问HTML页面中的任何元素的相关属性,并可对DOM进行相应的添加、删除和更新操作等。相关信息可查阅W3C的文档,这里不再赘述。

基于DOM树的一些可视(visual)的节点,WebKit来根据需要来创建相应的RenderObject节点,这些节点也构成了一颗树,称之为Render树。基于Render树,WebKit也会根据需要来为它们中的某些节点创建新的RenderLayer节点,从而形成一棵RenderLayer树。

Render树和RenderLayer树是WebKit支持渲染所提供的基础但是却非常重要的设施。这是因为WebKit的布局计算依赖它们,浏览器的渲染和GPU硬件加速也都依赖于它们。幸运地是,得益于它们接口定义的灵活性,不同的浏览器可以很方便地来实现自己的渲染和加速机制。

为了直观了解这三种树,下图给出了这三种树及其它们之间的对应关系,后面会详细介绍里面的细节。

 

## Render树

###Render树的建立

Render树是基于DOM树建立起来的一颗新的树, 是布局和渲染等机制的基础设施。 Render树节点和DOM树节点不是一一对应关系,那么哪些情况下需要建立新的Render节点呢?

a)      DOM树的document节点;

b)      DOM树中的可视化节点,例如HTML,BODY,DIV等,非可视化节点不会建立Render树节点,例如HEAD,META,SCRIPT等;

c)      某些情况下需要建立匿名的Render节点,该节点不对应于DOM树中的任何节点;

RenderObject对象在DOM树创建的同时也会被创建,当然,如果DOM中有动态加入元素时,也可能会相应地创建RenderObject对象。下图示例的是RenderObject对象被创建的函数调用过程。


Render树建立之后,布局运算会计算出相关的属性,这其中有位置,大小,是否浮动等。有了这些信息之后,渲染引擎才只知道在何处以及如何画这些元素。

###RenderObject类及其子类

RenderObject是Render树的节点基础类,提供了一组公共的接口。它有很多的子类,这些子类可能对应一些DOM树中的节点,例如RenderText,有些则是容器类,例如RenderBlock。下图给出了一些常用的类的继承关系图,这其中RenderBlock是一个非常重要的类。

                     

### 匿名RenderBlock对象

CSS中有块级元素和内嵌(inline)元素之分。内嵌元素表现的是行布局形式,就是说这些元素以行进行显示。以’div’元素为例,如果设置属性’style’为’display:inline’时,则那是内嵌元素,那么它可能与前面的元素在同一行;如果该元素没有设置这个属性时,则是块级元素,那么在新的行里显示。

RenderBlock用来是用来表示块级元素, 为了处理上的方便,某些情况下需要建立匿名的RenderBlock对象,因为RenderBlock的子女必须都是内嵌的元素或者都是非内嵌的元素。所以,当它包含两种元素的时候,那么它会为相邻的内嵌元素创建一个块级RenderBlock节点,然后设置该节点为自己的子女并且设置这些内嵌元素为它的子女。

 

##RenderLayer树

RenderLayer树是基于Render树建立起来的一颗新的树。同样,RenderLayer节点和Render节点不是一一对应关系,而是一对多的关系。那么哪些情况下的RenderObject节点需要建立新的RenderLayer节点呢?

a)      DOM树的document节点对应的RenderView节点

b)      DOM树中的document 的子女节点,也就是HTML节点对应的RenderBlock节点

c)      显式的CSS位置

d)      有透明效果的对象

e)      节点有溢出(overflow),alpha或者反射等效果的

f)       Canvas 2D和3D (WebGL)

g)      Video节点对应的RenderObject对象

 

一个RenderLayer被建立之后,其所在的RenderObject对象的所有后代均包含在该RenderLayer,除非这些后代需要建立自己的RenderLayer。而后代的RenderLayer的父亲就是自己最近的祖先所在的不同的RenderLayer,这样,它们也构成了一颗RenderLayer树。

每个RenderLayer对应的Render节点内容均会绘制在该RenderLayer所对应的层次上(或者内部存储结构上)。不同的RenderLayer可以共享同一个内部存储结构,也可以有各自的后端存储,这取决于不同的移植。在软件渲染下,通常各个RenderLayer的内容都绘制在同一块后端存储上。在GPU硬件加速的下,某些RenderLayer可能有自己独立的后端存储,而后通过合成器来把这些不同的后端合成在一起,最终形成网页的可视化内容。

RenderLayer在创建RenderObject对象的时候,如果需要,也会同时被创建,当然也有可能在执行JavaScript代码时,更新页面的样式从而需要新创建一个RenderLayer。

 ## 一个例子

以上说了那么多,一堆堆的类,一个个的建立规则,听起来太抽象,不太容易理解,那么一个具体的Render树和RenderLayer树到底是怎么样的呢?为了可视化理解Render树和RenderLayer树,下面给出一个具体的例子来加以解释和说明。

首先,让我们来看一个简单的HTML网页,源代码如下所示。

 

上面的代码结构很简单,就是一些HTML的基本元素组成的,例如HTML,HEAD,DIV,A,  IMG, TABLE等等, 然后包含一个特别的HTML5元素CANVAS,而且还有一小段JavaScript代码。照顾到一些没有相关背景的读者,简单解释一下这段代码的含义。这段代码是对CANVAS元素创建一个WebGL的Context,有了这个context,就可以在canvas元素上绘制3D的内容。这个类似于OpenGL或者OpenGLES的context,具体canvas和WebGL会有另外专门的章节来介绍。

这段HTML源代码被WebKit解析后会生成一颗DOM树。这段代码的DOM树主要结构如本章第一幅图中的‘DOM树’部分所示。当DOM树生成时,WebKit同时建立了一颗Render树,如上所说,代码的Render树被打印成如下图所示的文本信息。


首先,上图中的“layer at (x, x)”表示不同的RenderLayer节点,下面的所有RenderObject均属于该RenderLayer。以第一个layer为例,它对应于DOM中的Document节点。后面的(0, 0)表示该节点在坐标系中的位置,最后的1028x683表示该节点的大小。它包含的RenderView节点后面的信息也是同样的意思。

其次,看其中最大的部分-第二个layer,包含了HTML中的绝大部分元素。这里有三点需要解释一下:第一,Head元素没有相应的RenderObject,如上面所解释的,因为它不是一个可视的元素。第二,Canvas元素不在其中,而是在第三个layer中(RenderHTMLCanvas)。但是它仍然是RenderBody节点的子女。第三,匿名的RenderBlock节点,它包含了RenderText, RenderInline等节点,原因如前所说。

再次,来看一下第三个layer。因为从Canvas创建了一个WebGL3D Context对象,这里需要重新生成一个新的layer。

最后,来说明一下三个layer的创建时间。第一和第二个layer在创建DOM树后,会触发创建;第三个layer测试资源加载解析好之后,执行后面的JavaScript代码后所创建。

基于上面的描述,相信大家已经对Render树和RenderLayer树有了一定的了解。现在让我们回忆一下本章的第一幅图。该图其实是给出了示例的HTML网页在WebKit中三种树的对应关系(仅选取其中重要的部分),相信现在你已经了解它们的含义了。 

## 源代码目录

WebKit/Source/WebCore/rendering

         WebKit为支持渲染所涉及的各个类

WebKit/Source/WebCore/dom/

         DOM树的相关文件,包括一些基础类及其接口定义

WebKit/Source/WebCore/html/

         为HTML网页的元素所定义的相关的基础类,它们基于DOM的Node类 

## 参考文献

1.      Google design documents:

http://www.chromium.org/developers/design-documents/gpu-accelerated-compositing-in-chrome

人物精细抠图实战:Semantic Human Matting两段式算法与部署避坑 图像分割与抠图是图像编辑和视频处理中的基础技术,而人物精细抠图的核心难点在于发丝、薄纱等半透明边缘的像素级还原。传统方法依赖手工trimap,难以自动化落地;基于深度学习的语义分割网络能粗定位人物区域,但对高频细节不敏感。Semantic Human Matting算法采用“语义分割+细节细化”的两段式结构,先由分割网络生成前景概率与不确定区域,再由细化网络在轮廓带内恢复精细alpha matte,融合模块结合RGB、概率图和局部特征输出最终透明度。这种设计降低了单阶段模型的收敛难度,在电商合图、图像精修、 阅读详情

相关推荐

数据仓库ODS层详解- 功能、设计与最佳实践

数据仓库ODS层是大数据分析的基石,为企业决策提供可靠数据源。本文深入探讨ODS层设计原则、实施要点和最佳实践,涵盖金融、零售等行业应用。重点关注云环境下ODS层部署策略,以及实时数据集成、数据湖技术等创新趋势。文章还分析了数据体量增长、实时性需求等挑战,提供实用解决方案。whether助您构建高效、安全、可扩展的ODS层,为数字化转型奠定坚实基础。#数据仓库 #ODS层 #大数据分析 #云计算 #数据湖

一个8年大数据开发工程师的碎碎念 1万+

理解WebKit和Chromium

WebKit 简介 Chromium WebKit和Chromium代码目录结构 WebKit的代码目录结构 Chromium多进程模型 优缺点 Chromium的进程模型和IPC WebKit是渲染引擎,Chromium是浏览器 WebKit的功能 Chromium的功能 Misc WebKit Misc Chromium WebKit 简介 狭义的Web...

performance 4345

实战指南 | Adjust 与 Facebook、Google Ads 自归因配置全流程解析

本文详细解析了Adjust与Facebook、Google Ads自归因配置的全流程,帮助移动应用出海推广者解决广告归因难题。通过自归因功能(SAN),开发者可以获取更准确的数据、简化配置流程并扩大安装来源覆盖,显著提升广告效果监测和ROI计算效率。

weixin_42528780的博客 539

理解WebKit和Chromium: WebKit渲染基础

转载请注明原文地址:http://blog.youkuaiyun.com/milado_nju/article/details/7292131 # WebKit渲染基础 ## 概述 WebKit是一个渲染引擎,而不是一个浏览器,它专注于网页内容展示,其中渲染是其中核心的部分之一。本章着重于对渲染部分的基础进行一定程度的了解和认识,主要理解基于DOM树来介绍Render树和RenderLayer树...

weixin_33804990的博客 1050

Apache Paimon-实时数据湖

Flink社区希望能够将 Flink 的 Streaming 实时计算能力和 Lakehouse 新架构优势进一步结合,推出新一代的 Streaming Lakehouse 技术,促进数据在数据湖上真正实时流动起来,并为用户提供实时离线一体化的开发体验。Flink 社区内部孵化了 Flink Table Store (简称 FTS )子项目,一个真正面向 Streaming 以及 Realtime的数据湖存储项目。

m0_57307642的博客 2193

微信小程序 - 实现客户支付订单连接小票打印机自动打印订单小票功能,微信小程序如何对接小票打印机自动打印小票,小程序收到新订单的时候可以联动商家打印出小票/单据/标签/发货单/电子面单等(详细教程)

微信小程序调用小票打印机,小程序接单后小票机自动打印订单,微信小程序云开发订单微信支付与小票和标签打印的完整高效流程,如何实现微信订单连接小票打印机并自动接单打印,微信小程序连接打印机打印单据小票打印,微信小程序云开发调用小票打印机实现方案,微信小程序怎么配置小票打印机,微信支付电子小票,外卖小程序实战-接单后小票机自动打印订单,微信小程序连接蓝牙打印小票,打印购物小票,调用小票打印机打印小票,微信订单如何连接小票打印机并实现自动接单打印,实现微信订单连接小票打印机并自动接单打印,微信小程序小票打印机打印教

🏆 前端领域优质创作者 1万+

Chromium内核和Webkit的关系到底是什么?

Chrome内核和Webkit的关系到底是什么?WebkitChromium拓展 作为web工程师还不清楚那是不可以的,来看看一个爱做小编的程序员的新闻吧 Webkit 同时WebKit 也是苹果Mac OS X 系统引擎框架版本的名称,主要用于Safari,Dashboard,Mail 和其他一些Mac OS X 程序。WebKit 前身是 KDE 小组的 KHTML,WebKit 所包含的 WebCore 排版引擎和 JSCore 引擎来自于 KDE 的 KHTML 和 KJS,当年苹果比较了 Ge

gztrljh 7045

(四)美赛画图篇:画图模板+画图工具

美赛画图篇:画图模板+画图工具(一)画图模板(二)画图工具 因为散点图、折线图等多与数据有关,且需相关软件生成,故此处多是通用模板。直接替换文字内容即可。 (一)画图模板 1、Visio圆圈图 适合于:指标体系(E题常用) 点击下载:1 C币 如果不想花费且时间充足,悄咪咪地说,在visio-模板搜索可以找到很多。(稍微会耗一点时间) 2、简单指标体系图PPT 适合于指标体系 点击下载:0 C币...

weixin_43689393的博客 1万+

理解WebKit和Chromium: Chromium软件渲染

转载请注明原文地址:http://blog.youkuaiyun.com/milado_nju/article/details/7455348 # Chromium的软件渲染基础 ## 概述 本章将介绍chromium渲染的最基础部分,同时也是最常见的部分-软件渲染。故名思路,软件渲染就是利用CPU,根据一定的算法来计算生成网页的内容,其没有那么多复杂难懂的概念和架构。如果了解了那么多地关于硬件...

weixin_34294649的博客 333

YOLO数据集实现数据增强的方法(裁剪、平移 、旋转、改变亮度、加噪声等)

数据集样本太少怎么办?数据集优质图像不够怎么办?如何做到更好的数据预处理?一文带你学会数据增强,还可实现带标签的扩充。

路人贾的博客 4万+

详解AUTOSAR:AUTOSAR架构中的配置文件(拓展篇—7)

查看AUTOSAR代码包时会发现一些这样格式的文件:xxx_PBcfg.c、xxx_Lcfg.c和xxx_Cfg.h,本篇博文讲一讲这几个配置文件的作用和特点。

不脱发的程序猿 2147

webkit之渲染基础

使用以下基础的前端代码来说明。 <!DOCTYPE html> <html lang="en"> <head></head> <body> <div>abc</div> <canvas id="webg1" width="80" height="80"></canvas>...

qq_37653449的博客 1112

LVS 负载均衡面试题及参考答案

什么是 LVS 负载均衡?它的主要作用是什么? LVS(Linux Virtual Server)是一个基于 Linux 内核的开源负载均衡项目。它通过将请求流量按照一定的算法分发到后端的多个真实服务器(Real Server)上,从而实现负载均衡的功能。 从原理上来说,LVS 工作在网络层和传输层之间。当客户端发起请求时,请求首先到达 LVS 服务器,LVS 会根据预先设定的规则和算法,比如轮询(Round - Robin)、加权轮询(Weighted Round - Robin)、最少连

大模型大数据攻城狮的专栏 1469

WebKit Inside: 渲染树

经过CSS的匹配,就要进入渲染树的构建。渲染树也叫树,因为渲染树上每一个节点,都是的子类。首先来看一下的继承类图。

chaoguo1234的专栏 897

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

webkit渲染过程

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

巴黎的妖 1414

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

WebKit渲染过程

WebKit笔记 WebKit 是一个开源的浏览器引擎,浏览器渲染的过程就是根据描述或定义构建数据模型,通过模型生成图像的过程, 浏览器的渲染引擎就是将HTML/CSS/JavaScript文本及其相应的资源文件转换成图像结果的模块。 主流的渲染引擎WebKit(对应的平台Safari,Chromium/Chrome,Android浏览器,ChromeOS,webOS) 渲染引擎提供的主要功能包括: HTML解释器,将文本解析未DOM树,若解析到Javascript的node结点,则提交个javaScr

jiodg45的博客 424

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

webkit的网页渲染过程

本文章内容参考webkit技术内幕 webkit的网页渲染过程 1.加载和渲染 浏览器的主要作用就是将用户输入的“URL”转变成可视化的图像。这其中包含以下两个过程,但这两个过程也会交叉,很难有明显的区分: (1)网页加载过程,从“URL”到构建DOM数; (2)网页渲染过程,从DOM树到生成可视化图像。 网页渲染还有一个特性,那就是网页通常比我们的屏幕可视面积要大(在移动设备上尤其明显),而当前可视化的区域,我们称为视图(viewport),因为网页比可视区域大,所以浏览器在渲染网页的时候,一般会加入滚动

u011035700的博客 335

理解WebKit和Chromium: WebKit渲染基础 Render树和RenderLayer树

http://blog.youkuaiyun.com/milado_nju/article/details/7292131 转载请注明原文地址:http://blog.youkuaiyun.com/milado_nju/article/details/7292131 # WebKit渲染基础 ## 概述 WebKit是一个渲染引擎,而不是一个浏览器,它专注于网页内容展示,其中渲染是其中核心的部

梦想狂奔的专栏 1104

WebKit/Blink 渲染网页的主要步骤

1.  发送网络资源请求。      WebKit在渲染网页之前,首先需要从网络上下载资源文件,这里把资源文件分为两类,一类称为主资源文件,比如Frame,另外一类成为子资源文件,比如图片,JavaScript脚本,CSS脚本,字体,音频视频文件等等。以前WebKit在加载这两种资源文件时采用不同的路径,主资源文件通过DocumentLoader类来加载,子资源文件通过DocLoader类来加载

HTML5, Chromium和WebKit技术 3783

深入WebKit:揭秘复杂文档的高效渲染之道

WebKit 的布局引擎是一个复杂而精密的系统,它通过多种策略来优化复杂文档的渲染。从避免全局重排到利用硬件加速,WebKit 确保了即使在面对大量数据和复杂布局时,也能提供流畅的用户体验。开发者们可以通过合理使用 CSS 属性、利用动画帧、以及在必要时手动触发浏览器的优化机制,来进一步提升网页的性能。随着 WebKit 的不断进步,我们可以期待未来在网页渲染方面会有更多创新和突破。

2401_85742452的博客 1274
上一篇: DOM事件流
下一篇: WebKit 中CSS的实现
Superr爬爬虫
博客等级 码龄19年 72粉丝 93原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值