Chrome浏览器是如何工作的?(二)

简介: Chrome浏览器是如何工作的?(二)

image.png

Chrome浏览器是如何工作的?(二)


image.png

七.页面绘制 Paint


      经过前面几个步骤,此时完整的页面结构已经差不多可以绘制了。但是还有一个问题在于 Render 进程还不知道你是否在某些 DOM 元素 设置了绝对定位如 display:absolute、sticky 或者调整了一些元素的 z-index 属性。因为我们之前说过,绘制 DOM 的时候,Render 是不关心样式的,所以下一步就是解决这个问题的。

这时 Render 进程的主线程(Main Thread)会去遍历 Layout Tree 从而绘制出一个绘制记录表(Paint Record),来保证页面绘制的顺序不会出错。

当主线程遍历完成后,会生成图层树Layer Tree

随后 Render 进程的主线程会把设计图交付给合成器线程,合成器线程拿着设计图(Layer Tree)和绘制记录表(Paint Record)将这些信息绘制成人类可以识别的像素点坐标信息。这个过程被称为栅格化Rastering

合成器线程的栅格原理并不是从页面的最顶部一直渲染到最底部的过程。而是将整个页面分为多个图块交给多个栅格化线程(Raster Thread),类似于下图这样。

image.png

栅格线程将每个图块的栅格化信息保存在 GPU 的内存中。

image.png

当整个页面都栅格化完成后,主线程此时将收集栅格线程生成的 Draw Quads 信息,这些信息记录了每个图块在内存中的位置和每个图块需要在页面的哪个位置渲染的信息。(再通俗易懂一点讲的话,可以这样简单理解 const Draw = x 坐标,y 坐标等绘制信息

根据这些 Draw Quads 的信息,合成器线程会生成一个合成器帧Compositor Frame)。然后这个合成器帧会通过 IPC (inter process communication)传送给浏览器进程。就是这个)

image.png

紧接着浏览器进程合成器帧传递给 GPU 进程。(不要忘记我们之前第一篇所说的,浏览器进程负责调度各个进程之间的合作)

image.png

最终 GPU 将页面渲染到页面上,恭喜你🎉!经历九九八十一难你终于看到了最终的页面效果。

我们可以在 Chrome 的调试工具下,选择 Performance 选项卡来发现浏览器绘制的每一帧对应的页面。

image.png

八.重排(reflow)和重绘(repaint)


此时如果我们开始滚动页面,合成器线程就会再次生成一个合成器帧通过 IPC 传递给浏览器进程,浏览器进程再传递给 GPU , GPU 再次绘制新的一帧,然后呈现出新的页面到屏幕上。此时就会重新进行 Layout 以后的所有步骤。这个过程我们叫做重排(reflow)。由此可见重排的代价是很大的

image.png

常见会引发重排的动作比如更改 DOM元素 高度,定位、伪元素等等。(不是本文重点,请自行查阅相关知识)

当页面只是简单的更改了背景颜色等动作时,只会触发样式计算绘制,并不会进行其它的任务。这个过程我们叫做重绘(repaint)

image.png

从上面的图我们可以清晰的看到,无论是重排还是重绘都是进行在主线程上的。别忘了还有一重量级选手 JavaScript 也是运行在主线程上的。那么如果在同一时间进行了大量的重绘重排,其中还穿插着 JS 代码的运行,那么就会造成页面的卡顿。“卡”的产生原因我们继续往下看。

九.渲染帧数


目前我们主流的显示器帧数都是在60HZ以上。也就是说我们电脑的性能支持显示器在 1000ms 内完成60次页面的刷新,(并不是指F5刷新的那个刷新...😂)那么我们1000/60=16.7777可以得出。浏览器必须在16ms的间隔绘制出新的一帧,才能保证用户觉得“不卡”。

进一步解释就是浏览器要在16ms内完成一次下图的调度过程,用户才能得到最好的体验。那么当主线程 JS 的代码过于耗时的时候,无法及时归还主线程在以便在16ms内进行 LayoutLayer,那么就造成“卡了一下”的现象。(想象打游戏丢帧)

image.png

十.Transform的优点


我们经常会看到建议使用Transform来代替topleft等位置变化属性。其根本原因就是:

      Transform 属性完成的动画不会重新 LayoutLayer,而是直接运行在合成器线程栅格线程中的的那也就意味着它不会抢夺主线程的使用,也不会影响JS代码的执行。

image.png

饮水思源:

感谢B站up主 objtube的卢克儿 的这期视频,让我通俗易懂的理解了大致的流程。(🍉文章内部分截图来自于这期视频)

image.png


相关实践学习
部署Stable Diffusion玩转AI绘画(GPU云服务器)
本实验通过在ECS上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。
相关文章
|
3月前
|
Web App开发 数据采集 存储
WebDriver与Chrome DevTools Protocol:如何在浏览器自动化中提升效率
本文探讨了如何利用Chrome DevTools Protocol (CDP) 与 Selenium WebDriver 提升浏览器自动化效率,结合代理IP技术高效采集微博数据。通过CDP,开发者可直接操作浏览器底层功能,如网络拦截、性能分析等,增强控制精度。示例代码展示了如何设置代理IP、cookie及user-agent来模拟真实用户行为,提高数据抓取成功率与稳定性。适用于需要频繁抓取互联网数据的应用场景。
495 3
WebDriver与Chrome DevTools Protocol:如何在浏览器自动化中提升效率
|
21天前
|
Web App开发 缓存 安全
WIN11 Chrome 双击打不开闪退及Chrome浏览器不能拖拽文件crx
【11月更文挑战第6天】本文介绍了 WIN11 系统中 Chrome 浏览器双击打不开闪退及不能拖拽文件 crx 的原因和解决方法。包括浏览器版本过旧、扩展程序冲突、硬件加速问题、缓存过多、安全软件冲突、系统文件损坏、用户配置文件损坏等问题的解决方案,以及 crx 文件的屏蔽、权限问题和文件格式问题的处理方法。
|
22天前
|
Web App开发 Linux iOS开发
Chrome浏览器如何导出所有书签并导入书签
【11月更文挑战第4天】本文介绍了如何在 Chrome 浏览器中导出和导入书签。导出时,打开书签管理器,点击“整理”按钮选择“导出书签”,保存为 HTML 文件。导入时,同样打开书签管理器,点击“整理”按钮选择“导入书签”,选择之前导出的 HTML 文件即可。其他主流浏览器也支持导入这种格式的书签文件。
|
29天前
|
Web App开发 JavaScript 前端开发
使用 Chrome 浏览器的内存分析工具来检测 JavaScript 中的内存泄漏
【10月更文挑战第25天】利用 Chrome 浏览器的内存分析工具,可以较为准确地检测 JavaScript 中的内存泄漏问题,并帮助我们找出潜在的泄漏点,以便采取相应的解决措施。
161 9
|
2月前
|
Web App开发 开发者
|
2月前
|
Web App开发 JSON 安全
Chrome浏览器的跨域问题
【10月更文挑战第6天】
|
2月前
|
Web App开发 缓存 安全
Chrome浏览器启动参数大全
这是一组用于定制浏览器行为的命令行参数,包括但不限于:不停用过期插件、放行非安全内容、允许应用中心脚本、停用GPU加速视频、禁用桌面通知、禁用拓展及各类API、调整缓存设置、启用打印预览、隐身模式启动、设定语言、使用代理服务器、无头模式运行等。通过这些参数,用户可以根据需求灵活调整浏览器功能与性能。
|
3月前
|
Web App开发 存储 前端开发
Chrome浏览器的跨域问题
Chrome浏览器的跨域问题
|
4月前
|
Web App开发
Chrome——谷歌浏览器chrome如何模拟其他客户端
Chrome——谷歌浏览器chrome如何模拟其他客户端
106 1
Chrome——谷歌浏览器chrome如何模拟其他客户端
|
4月前
|
Web App开发 JSON 安全
【跨域难题终结者】:一键解锁Chrome浏览器神秘设置,彻底告别开发阶段的跨域烦恼!
【8月更文挑战第20天】跨域是前端开发常遇难题,尤其在前后端分离项目中。浏览器因安全考量会阻止不同源间的请求。本文对比CORS、JSONP、代理服务器等解法,并介绍开发阶段通过调整Chrome设置来临时禁用跨域限制的方法,提供启动Chrome及使用`fetch`API示例,适合快速测试。但请注意这不适用于生产环境,存在一定安全风险。
989 1