webkit 浏览器内幕之渲染基础

994 阅读2分钟

RenderObject 树

RenderObject 对象保存着为缓制Dom 节点所需要的各种信息,例如布局信息,经过webkit 处理之后,RenderObject 对象知道如何绘制自己,RenderObject 对象同DOM 节点类似,它们也构成一棵树,可以称之为RenderObject 树。 RenderObject 树是基于 Dom 树建立起来的一棵树,是为了布局计算和渲染等机制而构建的一种新的内部表示。RenderObject 树节点与DOM 节点不是一一对应的关系。以下三条规则会为Dom 树节点创建一个RenderObject 对象。

  • Dom 树的 document 节点。
  • Dom 树中的可视节点,如 html、body、 div 、p 等等。webkit 不会会非可视节点创建 RenderObject 节点,如 head script。
  • 某些情况下,webkit 需要建立 RenderObject 节点,该节点不应对于 dom 树中的任何节点,而是webkit 处理上的需要,典型的例子就是匿名的RenderBlock 节点。

网页层次和 RenderLayer 树

网页是分层的,一是方便开发者设置网页的层次,二是为了webkit 处理上的便 利,也是就为了简化渲染的逻辑。RenderLayer 树是基于 RenderObject 树建立起来的一棵新树。RenderLayer 节点和 RenderObject 节点不是一一对应的关系,而是一对多的关系。下面三条原则 RenderObject 节点需要建立 新的 RenderLayer 节点。

  • DOM 树的Document 节点对应的RenderView 节点。
  • DOM 树中的Document 的子女节点,也就是HTML 节点对应的RenderBlock 节点
  • 显式的指定css 位置的RenderObject 节点。
  • 有透明效果的 RenderObject 节点。
  • 有节点溢出(overflow、alpha)反身等效果的 RenderObject 节点。
  • 使用 Canvas 2D 3D (WEBGL)技术的 RenderObject 节点。
  • Video 节点对应的RenderObject 节点。

渲染方式

  • 绘图上下文 RenderObject 对象知道如何绘制自己,但是 RenderObject 是用什么来绘制内容的呢? webkit中,绘图操作被定义了一个抽象层,这就是绘图上下文 ,所有绘图的操作都是在该文中进行的。
  • 绘图上下文分为两种方式,第一种是绘制2D图形上下文,第二种是绘制3D图形的上下文,称之为3D图形的上下文。
  • 网页渲染的方式,目前主要有两种,第一种是软件渲染,第二种是硬件加速渲染,还有一种混合模式。

硬件加速机制

  • 硬件加速是指使用GPU 的硬件能力来帮助渲染网页,因为GPU的主要作用是用来绘制3D 图形并且性能特别好,这是它的专长所在。