重学前端 15 # 浏览器工作解析(五)

简介: 重学前端 15 # 浏览器工作解析(五)

一、回顾


大致梳理一下前面四篇文章主要讲的内容。


  • URL 变成字符流
  • 把字符流变成词(token)流
  • 把词(token)流构造成 DOM
  • 把不含样式信息的 DOM 树应用 CSS 规则,变成包含样式信息的 DOM
  • 并且根据样式信息,计算了每个元素的位置和大小。




二、概括


本文是最后的步骤,就是根据这些样式信息和大小信息,为每个元素在内存中渲染它的图形,并且把它绘制到对应的位置。



三、渲染


本文中出现的“渲染”一词,统一指的是它在图形学的意义,也就是把模型变成位图的过程。


3.1、位图


在内存里建立一张二维表格,把一张图片的每个像素对应的颜色保存进去。

位图信息也是 DOM 树中占据浏览器内存最多的信息,做内存占用优化时,主要就是考虑这一部分。


3.2、图形和文字

浏览器中渲染这个过程,就是把每一个元素对应的盒变成位图。这里的元素包括 HTML 元素和伪元素,一个元素可能对应多个盒(比如 inline 元素,可能会分成多行)。每一个盒对应着一张位图。


  • 盒的背景、边框、SVG 元素、阴影等特性,都是需要绘制的图形类。
  • 盒中的文字,也需要用底层库来支持,叫做字体库。能根据字符的码点抽取出字形。字形分为像素字形和矢量字形两种。



四、合成


合成的过程,就是为一些元素创建一个“合成后的位图”(称为合成层),把一部分子元素渲染到合成的位图上面。


1、好的合成策略是“猜测”可能变化的元素,把它排除到合成之外。

举个例子:

<div id="a">
    <div id="b">...</div>
    <div id="c" style="transform:translate(0,0)"></div>
</div>


假设合成策略能够把 a、b 两个 div 合成,而不把 c 合成,执行以下代码时:

document.getElementById("c").style.transform = "translate(100px, 0)";


绘制的时候,只需要绘制 a 和 b 合成好的位图和 c,从而减少了绘制次数。如果 b 有很多复杂的子元素,那么性能提升收益非常高。


2、主流浏览器一般根据 position、transform 等属性来决定合成策略,新的 CSS 标准中,规定了 will-change 属性,提升合成策略的效果。



五、绘制


把任何位图合成到最终位图的操作称为绘制。


1、绘制发生的频率比我们想象中要高得多。

比如:鼠标的每次移动,都造成了重新绘制,如果我们不重新绘制,就会产生大量的鼠标残影。


2、计算机图形学中,使用的方案就是脏矩形算法限制绘制面积,也就是把屏幕均匀地分成若干矩形区域。

目录
相关文章
|
1月前
|
前端开发
调试前端时,在浏览器上修改参数并重新调用接口
有时候我们的页面点击过了,但是接口出问题,想修改参数再调用一次,一般是用apiPost工具把接口复制,再加上token和参数,但是这样非常的效率比较低。
42 0
|
1月前
|
资源调度 前端开发 JavaScript
构建高效前端项目:现代包管理器与模块化的深度解析
【2月更文挑战第21天】 在当今快速演变的前端开发领域,高效的项目管理和代码组织已成为成功交付复杂Web应用的关键。本文将深入探讨现代前端包管理器如npm, yarn和pnpm的工作原理,以及它们如何与模块化编程实践(例如CommonJS、ES6模块)协同工作以优化开发流程。我们将剖析这些工具的内部机制,了解它们如何解决依赖冲突,提高安装速度,并保证项目的健壮性。同时,本文还将介绍模块化编程的最佳实践,包括代码拆分、重用和版本控制,帮助开发者构建可维护且性能卓越的前端项目。
|
1月前
|
前端开发 UED
前端解析Excel文件
前端解析Excel文件
34 0
|
14天前
|
监控 前端开发 JavaScript
如何使用浏览器调试前端代码?
【4月更文挑战第11天】前端开发中,浏览器调试是关键技能,能提升代码质量。本文介绍了如何使用浏览器的调试工具:1) 打开调试窗口(F12或右键检查);2) Elements标签页检查DOM结构和样式;3) Console调试JavaScript,查看日志和错误信息;4) Sources设置断点调试JS文件;5) 利用Network、Performance和Memory等标签页优化性能。熟悉调试工具、利用日志和错误信息能有效定位问题,提高开发效率。
37 7
|
1月前
|
前端开发 JavaScript 程序员
推荐给前端程序员的5款浏览器插件
推荐给前端程序员的5款浏览器插件
|
1月前
|
SQL 存储 JavaScript
前端浏览器调试详解版
前端浏览器调试详解版
55 0
|
2月前
|
缓存 前端开发 JavaScript
前端性能优化实践与原理解析
【2月更文挑战第3天】 在当今互联网时代,前端性能优化已经成为了开发人员必须要面对的重要课题。本文将结合实际案例,探讨前端性能优化的一些实践方法,并深入分析其背后的原理,旨在帮助开发者更好地理解和应用前端性能优化技术。
21 5
|
2月前
|
JSON 前端开发 JavaScript
从前端到后端——Web开发的全流程解析
【2月更文挑战第2天】Web开发涉及多个方面,从前端设计到后端实现,需要开发者具备一定的技术能力和知识储备。本文将以一个简单的Web应用为例,详细介绍Web开发的全流程。
|
2月前
|
缓存 前端开发 JavaScript
深入解析前端性能优化策略
本文将探讨前端性能优化的关键策略,包括减少HTTP请求、使用CDN加速、缓存优化、代码压缩等方面的技术手段,帮助前端开发者提升网站性能和用户体验。
|
2天前
|
XML 人工智能 Java
Spring Bean名称生成规则(含源码解析、自定义Spring Bean名称方式)
Spring Bean名称生成规则(含源码解析、自定义Spring Bean名称方式)

推荐镜像

更多