浏览器工作的后续

一: HTML代码(response body 部分) 构建成 DOM 树:

  • 字符流,经过状态机的处理,变成 词(token)

    绝大多数语言的 词法部分,都是用状态机来实现的

  • 词(token),通过栈,来构建 DOM 树。

    HTML 有很强的容错能力,如果是 XHTML(有严谨的语法格式),那这个过程就会轻松很多。

二:把 CSS 属性,添加到 DOM 树上:

  • 并不上把 DOM 全构建完,再来添加 CSS 属性的。 浏览器的整个过程都是一个流式处理的过程。
  • CSS 也是一门语言,需要经过词法分析和语法分析的步骤,变成计算机可以理解的结构。 这部分涉及到 编译原理 里的内容。

三: 排版

排版: 浏览器的里文字、图片、表格等等,确定他们位置的这个过程。

在这之前的工作是可以流式处理的,产出的是一个一个的元素。但在排版的时候,就需要拿到全部元素了。

  • 最基本的排版方式就是 正常流排版。跟我们平时书写的方向一致。

  • 浏览器的文字排版遵循工人的文字排版规范,这是一个很复杂的系统。

    规定了行模型 和 文字在行模型的排布,行模型规定了行顶、行底、文字区域、基线等对齐方式。

    英语本上的四条线就是一个简单的行模型。

  • 浏览器还支持元素和文字的混排。元素占据一个矩形区域,允许边框、边距、留白。

    这个就是我们所说的 盒模型。

  • 在正常流上,元素还支持 绝对定位元素、浮动元素。

    绝对定位元素:从正常流中抽离出来,不参加排版计算。 由 left、top确定位置。需要逐层找到其父级的 position 非 static 元素。

    浮动元素:在正常流中向左或向右移动到边界,占据排版空间。

  • 还有其他的用的较多的 flex 排版。

四: 渲染、绘制

根据之前工作得到的样式信息、元素的位置、大小信息。为每个元素在内存中渲染他的图形,并且绘制到相应的位置上去。

  • 渲染, render。

    在图形学中指: 把模型变成位图的过程。

    位图: 内存里的一张二维表。把每一张图片的每一个像素对应的颜色保存进去。

    位图信息是 DOM 树中占据浏览器内存最多的信息,最内存优化时,主要考虑这里。

    图形的渲染:

    盒的背景、边框、SVG元素、阴影等特性,都是需要绘制的图形类。

    需要一个底层库来支持。操作系统一般都会提供,比如 Android 里有 Skia,Windows平台有 GDI。

    浏览器的实际实现会把阴影作为一个独立的盒来处理。

    文字的渲染:

    也需要底层库来支持,叫字体库。 常用的是 Freetype,C++编写的开源字体库。

    字体库可以读取字体文件、根据字符的码点抽取出字形。

    字形分为,

    像素字形:6px、8px这样的小尺寸用像素字形。
    矢量字形:大尺寸用矢量字形。

  • 合成,compositing

    是可选的步骤。 主要是对性能的一个考量。

    渲染不会把子元素渲染到位图上,合成就是把一部分子元素渲染到合成的位图上面。

    那要怎么选呢,就是“猜测“可能变化的元素,把他排除到合成之外。

  • 绘制

    绘制: 位图或合成层,最终绘制到屏幕上,变成肉眼可见的图像。

    浏览器只需要位图交给操作系统来处理即可。一般显示的位图位于显存中。

    一种 too young too simple 的方法;

    之前拿到了每个元素的位置,也进行了合成,就根据 z-index 把他们依次绘制到屏幕上。

    想一个情形:滑动鼠标。每次移动都要重新绘制,否则,就会有残影。

    计算机图形学中,使用”脏矩阵“算法。

    就是把屏幕均匀地分成了若干个矩阵。每次需要重新绘制时,只绘制他所影响到的几个矩形区域即可。