前端开发前端

《webkit技术内幕》读书笔记

2016-10-19  本文已影响1095人  狐尼克朱迪

第一章 浏览器和浏览器内核

  1. 渲染引擎的组成:HTML解释器、CSS解释器、布局(Layout)、JS引擎、绘图等
  2. Blink和Webkit的不同:
  1. 浏览器和对应的渲染引擎:

Trident | Gecko | Webkit
:------------: | :-------------:
IE | Firefox | Safari Chrome Android浏览器 ChromeOS等

第二章 HTML网页和结构

  1. Webkit渲染过程:
  1. 由于有些资源是异步的,所以DOMContentLoadedonLoad事件一般不是同步的,前者要完成的早一些。
  2. DOM构建过程中会执行js代码,因此需要注意js的位置,防止在DOM还没构建的情况下被js代码访问。

第三章 Webkit架构和模块

  1. 浏览器是多进程的,包括:Browser进程每个网页的Render进程插件进程GPU进程等进程:
  1. 浏览器中的进程基本上是多线程的,如Browser进程包括UI线程和I/O线程等,网页的Render进程包括渲染线程和I/O线程等,GPU进程包括I/O线程和GL线程等:

第四章 资源加载和网络栈

  1. 资源加载是一个很耗时的过程。异步执行资源(如图片、css等)的加载和执行是不会影响当前Webkit的渲染过程。同步执行的js文件会阻塞主线程的渲染过程,这会严重影响Webkit下载资源的效率;因为后面还有需要要下载的资源。这种情况下Webkit会启动另外一个线程去遍历后面的HTML网页,收集需要的资源URL,然后发送请求,这样可以避免被阻塞。与此同时,Webkit能够并发下载这些资源,甚至并发下载js代码,这种机制对于网页的加载提速是很明显的。

  2. 渲染引擎、js引擎、js加载三者是互斥的?至少前两者是的。

  3. 由于安全(Render进程是没有权限去获取资源的)和效率上的考虑,Render进程的资源获取实际上是通过进程间通信将任务交给Browser进程来完成,Browser进程有权限从网络和本地获取资源。

  4. Chroumium的本地缓存包括一个索引文件和四个数据文件(如果缓存比较大,那么是一个数据文件)。

  5. SDPY协议是HTTP2的基础,它的核心思想是多路复用,仅使用一个连接链传输一个网页中的众多资源:

第五章 HTML解释器和DOM模型

  1. HTML解释器的流程:字节流(bytes)->字符流(characters)->词语(token)->Xss验证(可选)->节点->DOM树。 DOM树的创建只能在渲染线程上创建和访问,从字符串到词语这个阶段可以交给单独的线程来做。

  2. 当渲染引擎接收到一个事件的时候,它会通过HitTest(Webkit中一种检查触发事件在哪个区域的算法)检查哪个元素是直接的事件目标。

  3. 影子(Shadow)DOM:如<vedio>标签,其内部功能是很复杂的,但是对外只暴漏一个html标签;相当于对节点内部封装,外部看到的有限,但是内部逻辑是很复杂的。它主要解决了一个文档中可能需要大量交互的多个DOM树建立和维护各自功能边界的问题。 createShadowRoot是js中提供的创建影子DOM的方法。

第六章 CSS解释器和样式布局

  1. CSS的样式规则、选择器(标签、类型、ID、属性、后代、子女、相邻同胞)、盒模型、包含块(Containing Block)模型、样式属性(背景、文本、字体、列表、表格、定位)。

  2. CSSOM:CSS对象模型。它的思想是在DOM中的一些节点接口中加入获取和操作CSS属性或者接口的js接口

  3. 布局计算是一个递归的过程,这是因为一个节点的大小通常需要计算它的子女节点的位置、大小等信息。当首次加载、viewport大小改变、动画以及通过js改变样式信息时都会触发重新计算布局。

第七章 渲染基础

  1. Webkit的布局计算使用RenderObject树并保存计算结果到RenderObject树中,RenderObject树同其他树(如:RenderLayer树)构成Webkit渲染的主要基础设施。

  2. 为一个DOM树节点创建RenderObject对象的规则:

  1. 为RenderObject节点创建新的RenderLayer节点的规则是:(不同于css3硬件加速中的复合图层)
  1. Webkit的渲染方式主要包括三种:

硬件渲染比较适合于3D绘图。2D绘图时GPU不一定比使用CPU有优势,主要因为:1.CPU的缓存机制有效的减少了重复绘制;2.GPU资源相对CPU的内存来说比较紧张; 3. 软件渲染对待更新区域的处理可能优化到只需计算一个极小的区域,而硬件渲染可能需要重新绘制一层或则多层。

  1. 软件渲染结果基本上存储在CPU内存的一块区域,多数情况下是一个位图(Bitmap);存储结果会被copy到Browser的存储空间,然后通过Browser进程渲染出来。

第八章 硬件加速机制

  1. GPU主要用来绘制3D图形,而且性能很好。GPU不能像软件渲染那样只计算其中更新的区域,需重绘所有区域;因此为了提高GPU的性能,需要对网页进行分层。分层后,部分区域的更新只在网页的一层或者几层,而不需将整个网页重绘;绘制完成后把层合成起来,即利用了GPU能力,又能减少不必要的重绘开销。

  2. 硬件加速机制在RenderLayer树建立后需要做三件事情来完成网页渲染:

  1. RenderLayer对象具有以下特征之一,那么它就是合成层(参考css3硬件加速中的复合图层):
  1. 硬件加速最终会调用OpenGL/OpenGLES库。GPU进程最终绘制的结果不再像软件渲染那样通过共享内存传递给Browser进程,而是直接将页面的内容绘制在浏览器的标签窗口内。

  2. 页面加载后进行绘制时,会经历计算布局绘图合成三个阶段,前两者耗时较多。鉴于此提升浏览器渲染性能的两者方法:

第九章 JavaScript引擎

  1. 解释性语言(如 js)和编译型语言(如 java c++)的区别:编译确定位置、偏移信息共享以及偏移信息查找。 三者概括起来讲是因为编译型语言可以在编译的时候确定指针位置,而解释性语言只有在执行的时候才会确定。如果找js的属性只能通过属性名匹配去查找,而c++中可以根据偏移位置去直接找到。

  2. 一个js引擎要包括一下几部分:

  1. 引擎的流程:
    源代码 -> 抽象语法树 -> 字节码 -> 解释器 -> JIT -> 本地代码

  2. v8引擎的工作原理

  1. JavaScriptCore和V8不同,它会生成平台无关的字节码(和java类似),然后基于此做优化,同时它的句柄不论在32位还是64位平台上,都使用64位来表示。

  2. 编写高效的JavaScript代码:

上一篇 下一篇

猜你喜欢

热点阅读