当前位置: 首页 > news >正文

最后一步:渲染和绘制

浏览器的工作步骤如下:

URL>字符流>词(token)流>DOM树(不含样式信息的 DOM)>DOM树+CSS规则(含样式信息的 DOM)>根据样式信息,计算了每个元素的位置和大小>根据这些样式信息和大小信息,为每个元素在内存中渲染它的图形,并且把它绘制到对应的位置

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


渲染(render):模型变成位图的过程

位图:就是在内存里建立一张二维表格,把一张图片的每个像素对应的颜色保存进去(位图信息也是 DOM 树中占据浏览器内存最多的信息,我们在做内存占用优化时,主要就是考虑这一部分)。浏览器中渲染这个过程,就是把每一个元素对应的盒变成位图。这里的元素包括 HTML 元素和伪元素,一个元素可能对应多个盒(比如 inline 元素,可能会分成多行)。每一个盒对应着一张位图。

只要分为两大类:图形,文字

盒的背景、边框、SVG 元素、阴影等特性,都是需要绘制的图形类,一般的操作系统会提供一个底层库,一般的浏览器会做一个兼容层来处理掉平台差异。

盒中的文字,也需要用底层库来支持,叫做字体库。字体库提供读取字体文件的基本能力,它能根据字符的码点抽取出字形。

另外:因为阴影,它可能非常巨大,或者渲染到非常遥远的位置,为了优化,浏览器实际的实现中会把阴影作为一个独立的盒来处理。

合成(compositing):因为渲染不会将子元素绘制到渲染的位图上,所以需要用到合成

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


<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 可能有很多复杂的子元素,所以当合成命中时,性能提升收益非常之高。

目前,主流浏览器一般根据 position、transform 等属性来决定合成策略,来“猜测”这些元素未来可能发生变化。但是,这样的猜测准确性有限,所以新的 CSS 标准中,规定了 will-change 属性,可以由业务代码来提示浏览器的合成策略,灵活运用这样的特性,可以大大提升合成策略的效果。从这里我们可以看到一些提高我们渲染性能的一些方法。

绘制

绘制是把“位图最终绘制到屏幕上,变成肉眼可见的图像”的过程,不过,一般来说,浏览器并不需要用代码来处理这个过程,浏览器只需要把最终要显示的位图交给操作系统即可。

CSS 性能优化,应该尽量避免“重排”和“重绘”,以提高性能。

总结:

渲染过程把元素变成位图,合成把一部分位图变成合成层,最终的绘制过程把合成层显示到屏幕上

小作业:自己实现一个玩具浏览器。

此文章为4月Day10学习笔记,内容来源于极客时间《重学前端》

相关文章:

最后一步:渲染和绘制

浏览器的工作步骤如下&#xff1a; URL>字符流>词&#xff08;token&#xff09;流>DOM树&#xff08;不含样式信息的 DOM&#xff09;>DOM树CSS规则&#xff08;含样式信息的 DOM&#xff09;>根据样式信息&#xff0c;计算了每个元素的位置和大小>根据这些…...

C++类和对象终章——友元函数 | 友元类 | 内部类 | 匿名对象 | 关于拷贝对象时一些编译器优化

文章目录&#x1f490;专栏导读&#x1f490;文章导读&#x1f337;友元&#x1f33a;概念&#x1f33a;友元函数&#x1f341;友元函数的重要性质&#x1f33a;友元类&#x1f341;友元类的重要性质&#x1f337;内部类&#xff08;不常用&#xff09;&#x1f33a;内部类的性…...

拼多多按关键字搜索商品 API

一、拼多多平台优势&#xff1a; 1、独创拼团模式 拼团拼单是拼多多独创的营销模式&#xff0c;其特点是基于人脉社交的裂变传播&#xff0c;非常具有传播性。 由于本身走低价路线&#xff0c;加上拼单折扣&#xff0c;商品的分享和人群裂变效果非常明显&#xff0c;电商前期…...

全链路日志追踪

背景 最近线上的日志全局追踪 traceId 不好使了&#xff0c;不同请求经常出现重复的 traceId&#xff0c;或者通过某个请求的 traceId 追踪搜索&#xff0c;检索出了与该请求完全不相干的日志。我领导叫我去排查解决这个问题&#xff0c;这里我把我排查的过程思路以及如何解决…...

ZYNQ:【1】深入理解PS端的TTC定时器(Part1:原理+官方案例讲解)

碎碎念&#xff1a;好久不见&#xff0c;甚是想念&#xff01;本期带来的是有关ZYNQ7020的内容&#xff0c;我们知道ZYNQ作为一款具有硬核的SOC&#xff0c;PS端很强大&#xff0c;可以更加便捷地实现一些算法验证。本文具体讲解一下里面的TTC定时器&#xff0c;之后发布的Part…...

蓝牙设备如何自定义UUID

如何自定义UUID 所有 BLE 自定义服务和特性必须使用 128 位 UUID 来识别&#xff0c;并且要确保基本 UUID 与 BLE 定义的基本 UUID&#xff08;00000000-0000-1000-8000-00805F9B34FB&#xff09;不一样。基本 UUID 是一个 128 位的数值&#xff0c;根据该值可定义标准UUID&am…...

好看的html登录界面,

界面效果&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html><head><title>Login Page</title><style>body {background-color: #f2f2f2;font-family: Arial, sans-serif;}form {background-color: #fff;border-radius: 5px;box-shado…...

Java模拟星空

目录 前言 JavaFX基础 1. GraphicsContext 2. AnimationTimer 代码实现 完整代码 前言 看了Python模拟星空很漂亮&#xff0c;Java也应该必须有一个&#xff01; 环境&#xff1a;只需要JDK1.8就好&#xff01;不需要外部包&#xff01;&#xff01;&#xff01; Jav…...

YGG 代表 Web3 Gaming 参加 2023 年游戏开发者大会

Yield Guild Games&#xff08;YGG&#xff09;在 2023 年 3 月 20 日至 24 日在加州旧金山举行的游戏开发者大会&#xff08;GDC&#xff09;上大显身手&#xff0c;这是游戏开发者的重要交流学习活动。虽然 GDC 本身提供了多种多样的活动&#xff0c;包括讲座、小组讨论、圆桌…...

水库安全运行智慧管理平台解决方案筑牢防汛“安全墙”

解决方案 水库安全运行智慧管理系统解决方案&#xff0c;系统主要由降雨量监测站、水库水位监测站、大坝安全监测中的渗流量、渗流压力和变形监测站及视频和图像监测站等站点组成&#xff0c;同时建立规范、统一的监测平台&#xff0c;集数据传输、信息共享、数据储存于一体&a…...

Exchange升级部署方案

目录 前言 一、需求分析 二、升级前准备 1.备份当前 Exchange Server 数据...

AE开发之图层渲染20210603

AE开发之图层渲染比例符号化地图的整饰唯一值符号的符号化过程点符号设置&#xff0c;线符号设置标注图层&#xff0c;&#xff08;写得不好&#xff0c;不推荐看) 唯一值符号化&#xff0c;字段进行设置&#xff0c;这里用到了UniqueValueRenderer接口&#xff0c;这里面有一…...

需要了解的过滤器

过滤器 1. 概念 过滤器&#xff1a; 从名字上理解就是对于事件的过滤操作&#xff0c;在web 中的过滤器&#xff0c;就是对于请求进行过滤操作&#xff0c;我们使用过滤器&#xff0c;就可以对于请求进行拦截操作&#xff0c;然后进行响应的处理操作&#xff0c;实现很多的特殊…...

VUE3的setup函数

文章目录 目录 文章目录 前言 一、setup函数是什么&#xff1f; 二、使用步骤 三、vue3中文文档和面向vue3的组件库 总结 前言 Vue3是一个面向数据驱动的渐进式JavaScript框架&#xff0c;其的设计理念包括简洁、灵活和高效。相比Vue2&#xff0c;Vue3的架构设计有很大的不同&…...

停车场管理系统文件录入(C++版)

❤️作者主页&#xff1a;微凉秋意 ✅作者简介&#xff1a;后端领域优质创作者&#x1f3c6;&#xff0c;CSDN内容合伙人&#x1f3c6;&#xff0c;阿里云专家博主&#x1f3c6; 文章目录一、案例需求描述1.1、汽车信息模块1.2、普通用户模块1.3、管理员用户模块二、案例分析三…...

线程(Thread)的三种等待唤醒机制详解

1、为什么需要线程的等待和唤醒 线程的等待唤醒机制是一种经典的“生产者和消费者”模型。例如食品加工厂&#xff0c;食品加工人员和原料补给人员&#xff0c;在有充足原料时&#xff0c;补给人员是在等待&#xff0c;等到原料不够时&#xff0c;食品加工人员通知补给人员&am…...

从零学习python - 13模块的导入与使用(实现单例模式)

模块基础知识 # 项目 > 包 > 模块 > 变量\方法\类 # 在python中,模块是代码组织的一种方式,把功能相近的函数或类放到一个文件中,一个文件(.py)就是一个模块,模块名就是文件名去掉py后缀. # 好处:提高代码可复用性和可维护性,一个模块编写完成后,很方便在其他项目中导…...

国产SSD、内存卷哭国外大厂,三星宣布减产涨价在路上了

PC 圈有一句话是这么说的&#xff1a;论价格屠夫还得看国产品牌&#xff01; 可不是嘛&#xff0c;国产长鑫、长江算是彻底将全球存储芯片市场搅局者这一「骂名」坐实了&#xff01; 不说特别早期&#xff0c;前几年吧&#xff0c;普通单条 8G DDR4 内存都能卖到六七百元&…...

数据库管理-第六十六期 SQL Domain(20230413)

数据库管理 2023-04-13第六十六期 SQL Domain1 基本介绍2 Domain的表达式和条件3 语法4 语义5 示例总结第六十六期 SQL Domain 上一期一笔带过了部分Oracle 23c的新特性&#xff0c;这一期重点讲一下SQL Domain新特性。 【https://docs.oracle.com/en/database/oracle/oracle-…...

《Vue3实战》 第一章 nods/npm安装、配置

1、nods.js安装&#xff08;Windows&#xff09; 1.1、下载并安装node https://nodejs.org/en/ , 安装到d盘nodejs目录 1.2、配置环境变量 path配置 1.3、配置全局包存放目录和缓存目录 在根目录下创建node_global&#xff08;全局包存放目录&#xff09;和node_cache&…...

收藏!程序员转型AI大模型应用开发,必学四大核心技能(小白友好版)

当下AI大模型风口持续爆发&#xff0c;越来越多程序员想抓住机遇转型入局&#xff0c;但大多陷入“盲目跟风、无从下手、学了没用”的困境——其实&#xff0c;转型AI大模型应用开发无需急于求成&#xff0c;不用追求“面面俱到”&#xff0c;先吃透核心技能&#xff0c;搭建完…...

【Java边缘运行时部署终极指南】:20年专家亲授5大避坑法则与3步极速上线实战

第一章&#xff1a;Java边缘运行时部署全景认知与演进脉络Java在边缘计算场景中的运行时部署正经历从传统云中心化架构向轻量、自治、低延迟方向的深刻演进。早期Java应用依赖完整JDK和重量级容器&#xff08;如Tomcat&#xff09;部署于虚拟机或Kubernetes集群&#xff0c;难以…...

从‘虚拟’到‘物理’:程序员视角下的内存块、页框与页到底是怎么协作的?

从‘虚拟’到‘物理’&#xff1a;程序员视角下的内存块、页框与页到底是怎么协作的&#xff1f; 当你调试程序时遇到"Segmentation fault"或"Page fault"错误&#xff0c;是否好奇这些术语背后究竟发生了什么&#xff1f;作为开发者&#xff0c;我们每天都…...

MacBook Pro用户必看:5分钟搞定StarUML破解(M1/M2芯片专用指南)

M1/M2芯片MacBook高效配置StarUML全流程指南 当你在M1/M2芯片的MacBook上第一次打开StarUML时&#xff0c;可能会遇到各种兼容性问题。作为一款强大的UML建模工具&#xff0c;StarUML在ARM架构下的表现确实有些水土不服。但别担心&#xff0c;经过多次实践&#xff0c;我总结出…...

别再只用DoDragDrop了!手把手教你用WPF实现一个能拖拽合并数据的自定义控件(附完整源码)

WPF高级拖拽交互实战&#xff1a;从原生API局限到自定义控件设计 在构建现代桌面应用时&#xff0c;流畅自然的拖拽交互往往能极大提升用户体验。WPF虽然提供了基础的DoDragDrop API&#xff0c;但当我们需要实现复杂场景如卡片合并、动态数据交换时&#xff0c;原生方案就显得…...

BURSTER 8645-5005 扭矩传感器

BURSTER 8645-5005&#xff08;德国波斯特&#xff09;是一款非接触式、磁致伸缩原理、高精度动态旋转扭矩传感器&#xff0c;量程 5 N・m&#xff0c;内置放大器&#xff0c;专为连续旋转工况下的动态扭矩测量设计一、型号与量程型号&#xff1a;BURSTER 8645-5005系列&#x…...

【项目实战】ESP8266 WiFi模块从零接入物联网 - 硬件连接、固件烧录与云端通信

1. ESP8266 WiFi模块入门指南 第一次拿到ESP8266这个小玩意儿时&#xff0c;我完全没想到它能在物联网领域掀起这么大风浪。这个比硬币大不了多少的模块&#xff0c;内置了完整的WiFi功能&#xff0c;价格还不到一杯奶茶钱。记得去年帮学弟调试毕业设计时&#xff0c;我们用ESP…...

Qwen2-VL-2B-Instruct环境配置详解:Anaconda虚拟环境管理与依赖冲突解决

Qwen2-VL-2B-Instruct环境配置详解&#xff1a;Anaconda虚拟环境管理与依赖冲突解决 每次准备跑一个新的大模型&#xff0c;最头疼的往往不是模型本身&#xff0c;而是环境配置。特别是像Qwen2-VL-2B-Instruct这种多模态模型&#xff0c;它需要PyTorch、Transformers、CUDA&am…...

只剩马斯克自己!xAI 11个联合创始人跑光了

11位联合创始人三年出清、只剩马斯克一人&#xff0c;xAI这场「天团散伙」背后&#xff0c;藏着AI时代最残酷的人才战争与帝国裂缝。3月28日&#xff0c;Ross Nordeen悄悄摘掉了自己在X平台上的xAI员工认证标识。他发了一张照片——「触碰一些草」。没有长篇告别信&#xff0c;…...

告别繁琐权限,uTools hosts插件一键切换与管理的效率革命

1. 为什么我们需要更优雅的hosts管理方案 每次修改hosts文件都要经历这样的痛苦循环&#xff1a;先要回忆文件藏在系统哪个角落&#xff0c;接着得用管理员身份打开文本编辑器&#xff0c;小心翼翼地修改内容&#xff0c;最后还要担心格式错误导致系统异常。作为经常需要切换开…...