Open Amybiubiu opened 3 years ago
首先,网络进程会查找本地缓存是否缓存了该资源,如果缓存了,返回资源给浏览器;没有的话,进行网络请求。
根据 URL 进行 DNS 解析,获取 IP 地址,利用 IP 地址和服务器建立 TCP 连接。建立连接后,浏览器构建请求行、请求头等信息,并与域名相关的 Cookie 等数据附加到请求头中,然后向服务器发送构建好的请求信息。
服务器收到请求后,根据请求生成响应数据(响应行、响应头、响应体等信息),并发给网络进程。网络进程(chromium多进程架构)接收到了响应头和响应行后,进行解析,如果状态码为 301(永久重定向)、 302(暂时重定向),则重定向至Location字段显示的网址。
如果是 200,根据响应数据类型进行处理。如果 Content-Type 是 application/octet-stream,按照下载类型处理。如果是 text/html ,则开始准备渲染进程。
默认情况下,Chrome会为每一个页面分配一个渲染进程,但是如果是同一站点(根域名相同,geekbang.org )下的两个页面,新页面会复用父页面的渲染进程,称为 process-per-site-instance。
是指浏览器进程将收到的 HTML 数据提交给渲染进程的过程。具体流程如下:
按照渲染的时间线,分为如下子阶段:构建 DOM 树、样式计算、 布局阶段、分层、绘制、分块、光栅化、合成。
HTML 文件经HTML解析器输出一颗包含节点和内容,但不包括样式的DOM树。
渲染引擎接收到 CSS 文本时,会执行一个转换,将它变成浏览器可以理解的结构----styleSheets。计算遵循 CSS 的继承与层叠规则。输出的内容是每个 DOM 节点的样式,并保存在 ComputedStyle 的结构中。
构建一颗只含可见元素的布局树,对于不可见的的节点如 head 的内容、display none 的元素。
有了布局树后计算布局树节点的坐标位置。
将布局树( LayoutTree )转换为图层树( LayerTree)。什么时候渲染引擎会为特定的节点创建新的图层?
如果设置的滚动条,滚动条也会成为单独的一层。
一些绘制的指令集合,比如绘制粉色矩形或者黑色的线等
有时候,有的图层很长,而视口只能展示一部分,没必要一下绘制出所有内容。基于这个原因,合成线程讲图层划分为图块,图块的大小是 256256 或者 512512。(如果下滑的话,渲染进程从那一步开始更新?栅格化前吧)
合成线程启动栅格化线程,在栅格化进程池中将(靠近视口的?)图块转换为位图。通常会使用 GPU 加速生成,生成的位图保存在 GPU内存中。而 GPU 操作是在 GPU 进程中,为跨进程操作。
所有的图块(靠近视口的图块?)被栅格化后,合成线程会生成 DrawQuad 命令发送给浏览器进程,浏览器进程根据这个命令,将位图存到内存(浏览器进程的内存),最后将其显示到屏幕上。
此内容为极课时间【浏览器工作原理及实践】总结,并非原创 参考文档
首先,网络进程会查找本地缓存是否缓存了该资源,如果缓存了,返回资源给浏览器;没有的话,进行网络请求。
根据 URL 进行 DNS 解析,获取 IP 地址,利用 IP 地址和服务器建立 TCP 连接。建立连接后,浏览器构建请求行、请求头等信息,并与域名相关的 Cookie 等数据附加到请求头中,然后向服务器发送构建好的请求信息。
服务器收到请求后,根据请求生成响应数据(响应行、响应头、响应体等信息),并发给网络进程。网络进程(chromium多进程架构)接收到了响应头和响应行后,进行解析,如果状态码为 301(永久重定向)、 302(暂时重定向),则重定向至Location字段显示的网址。
如果是 200,根据响应数据类型进行处理。如果 Content-Type 是 application/octet-stream,按照下载类型处理。如果是 text/html ,则开始准备渲染进程。
默认情况下,Chrome会为每一个页面分配一个渲染进程,但是如果是同一站点(根域名相同,geekbang.org )下的两个页面,新页面会复用父页面的渲染进程,称为 process-per-site-instance。
是指浏览器进程将收到的 HTML 数据提交给渲染进程的过程。具体流程如下:
按照渲染的时间线,分为如下子阶段:构建 DOM 树、样式计算、 布局阶段、分层、绘制、分块、光栅化、合成。
HTML 文件经HTML解析器输出一颗包含节点和内容,但不包括样式的DOM树。
渲染引擎接收到 CSS 文本时,会执行一个转换,将它变成浏览器可以理解的结构----styleSheets。计算遵循 CSS 的继承与层叠规则。输出的内容是每个 DOM 节点的样式,并保存在 ComputedStyle 的结构中。
构建一颗只含可见元素的布局树,对于不可见的的节点如 head 的内容、display none 的元素。
有了布局树后计算布局树节点的坐标位置。
将布局树( LayoutTree )转换为图层树( LayerTree)。什么时候渲染引擎会为特定的节点创建新的图层?
如果设置的滚动条,滚动条也会成为单独的一层。
一些绘制的指令集合,比如绘制粉色矩形或者黑色的线等
有时候,有的图层很长,而视口只能展示一部分,没必要一下绘制出所有内容。基于这个原因,合成线程讲图层划分为图块,图块的大小是 256256 或者 512512。(如果下滑的话,渲染进程从那一步开始更新?栅格化前吧)
合成线程启动栅格化线程,在栅格化进程池中将(靠近视口的?)图块转换为位图。通常会使用 GPU 加速生成,生成的位图保存在 GPU内存中。而 GPU 操作是在 GPU 进程中,为跨进程操作。
所有的图块(靠近视口的图块?)被栅格化后,合成线程会生成 DrawQuad 命令发送给浏览器进程,浏览器进程根据这个命令,将位图存到内存(浏览器进程的内存),最后将其显示到屏幕上。