willchange 优化性能的原理是什么

news2024/9/27 9:30:55

写在前面

今天说一下性能优化部分的其中一个点,这个点叫做 willchange,说他的原因主要有以下几个:第一很多人知道用这个可以提高性能但是不知道原因是什么,第二,我们用的时候他虽然可以提高性能,但是不代表就可以肆意的使用,第三,讲一下他的工作原理是什么,下面我尽可能的说明白这三件事

什么是 willchange

willchange 可以先大概看一下 MDN 的解释,首先他是一个 css 的属性值,大概的意思就是设置了这个属性之后的元素之后相当于提前告诉浏览器你这块后面可能要做的事情,比如你要反转,移动,透明度改变等等,当然你如果不确定你后面可能要做的变化,你可以直接写上 auto,这个时候意思就是让浏览器自己想后面我们可能会做的操作,这个就是浏览器自己想办法预测你的变化,不过比较好的情况是你使用之前最好是之后你后面想要做什么事情,这样浏览器可以针对你的提前告知进行对应准确的准备,这个就是 wilchaneg 大概做的一件事。

当我们给一个块盒添加了 willchange 属性之后,浏览器做了什么

上面那段话已经说了,当设置willchange 之后,相当于我们提前告知了浏览器我们后面可能要做的事情,那么浏览器知道了之后他怎么准备呢?他首先是将你设置 willchange 属性的元素单独列了一层,那么这层独立出来之后,你后面的操作就相当于和别的元素没有任何关联,他单独处理这一块,而且是单独使用 GPU 加速处理,这里GPU 加速可以理解为一个比 CPU渲染能力更强更快的处理方式,但是因为 GPU 能做的事情比较有限,一般都是和显示相关的,所以他的性能更强,因为做的事情比较单一。

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<div class="shouLayout" style="background-color: aqua;">1</div>
		<div class="shouLayout" style="background-color:#f40">3</div>
		<div class="shouLayout" style="background-color: aquamarine;">4</div>
		<div class="shouLayout" style="background-color: black;">5</div>
		<div class="shouLayout" style="background-color: brown;">6</div>
		<div class="shouLayout" style="background-color: chartreuse;">7</div>
		<div class="shouLayout" style="background-color: cornflowerblue;">8</div>
		<div class="shouLayout" style="background-color: darkblue;">9</div>
		<div class="shouLayout" style="background-color: darkgreen;">10</div>
	</body>
	<style>
		.shouLayout {
			will-change: transform;
		}
	</style>
</html>

在这里插入图片描述

为什么添加了层之后就可以提高性能(浏览器是怎么高性能的渲染一个页面的)

这里就要简单的说一下浏览器渲染的过程了,早期的浏览器是将一个页面平铺到画面中,拿到 html 代码之后,(这里不做 js 解析过程的说明)通过样式代理也就是浏览器自己的预处理样式、用户自己定义的样式,按照样式优先级做了计算之后得到最终的计算样式结果,也就是最终的样式列表,按照样式进行绘制画面,绘制的过程可以参考 canvas,因为 canvas 也是通过调用了浏览器本身的绘制功能工作的,最后绘制结果展示给用户,这个就是浏览器渲染的一个过程,当然真正的是远比我描述的复杂的多的,只是这里只是讲解一下 willchange 提高性能的原因说明一下,前面说了他如果都是平铺的,那么我们改动其中一个元素的几何位置的时候,也就是改变他的坐标,绘制也是通过坐标进行的,坐标加上像素点绘制的,改动其中元素位置的时候会导致 reflow 也就是重新排版,继而后面继续重新绘制,repaint,这个是很消耗性能的,整个页面完成渲染本身就很复杂,其中一个小改动还导致这么多的重排操作,就会导致页面很不流畅,后面浏览器为了解决这个问题,想到一个比较巧妙的解决方案,将页面按照层级分层,经常不动的,一个层,经常改动的一个层,这样经常改动的层改变的时候就只会影响他自己那个层,不会影响不动的那个层,这样就大大的减少了重排元素的数量,同时每一个单独的层都会使用独立的 GPU 加速处理,看到这里也许你们就可以明白为什么 willchange 可以提高性能了,因为他独立出来了一个层,符合了浏览器性能优化的一个点

分析一个例子

window12 最近比较火的一个演示界面,使用 html 实现的,我们可以简单的看一下

  • 首先他的基础页面分层就比较严重
  • 在这里插入图片描述
  • 当我们打开一个控件的时候分层就更严重了
  • 在这里插入图片描述
  • 可以看到他是分了很多层在做不同的事情,但是并没有使用任何的优化方式,仅仅是使用 z-index 将不同的控件放到不同的 z 轴上
  • 在这里插入图片描述
    在这里插入图片描述
  • 我们看一眼他的源码
  • 在这里插入图片描述
  • 在这里插入图片描述
  • 可以很清楚的看到,当我们切换不同的层级的时候,他其实就是在变化不同的 div 的一个 z 轴排列情况,当然处理方式各异,只是这样的话会导致肉眼可见的一些卡顿罢了。因为这个的特殊性,很少有需求会在浏览器中模拟一个操作系统哪怕是界面,毕竟操作系统本身是一个极其复杂的软件,浏览器本身做的事情就是相对有限的,这种操作交互极其多的情况,即使优化之后也难免会出现卡顿!

怎么合理的使用

这里可能有人会说,那我直接所有的元素都添加上 willchange 是不是就性能无敌了,当然不是,我们可以看一下 CSDN 主页的分层情况

在这里插入图片描述

我们可以清晰的看到,CSDN 的官方网站首页也就是三个层而已,一个是滚动条,一个是工具栏,一个就是 content,为什么他没有将模块挨个分一下呢?因为每新加一个 GPU都是对浏览器性能的消耗,所以他提高性能的同时也是对性能的一种消耗,所以最好的是找到这中间的一种平衡,而不是无脑的倾向某一个方向!

写到后面

相信写到这里大家对这个属性有了一定的了解,也知道后面怎么合理的使用了,这里多说一句,浏览器的图层分析是默认不显示的,大家可以自己点击浏览器后面的工具里面的更多选择调试出来即可!喜欢的可以关注一下,拜拜!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/985201.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Revit SDK 介绍:GenericModelCreation常规模型的创建

前言 这个例子介绍了如何创建拉伸、放样、扫掠、融合、放样融合&#xff0c;涵盖了一个建模软件需要的基本建模方法。 内容 CreateExtrusion 生成的放样融合接口&#xff1a; m_creationFamily.NewExtrusion(true, curve, sketchPlane, bottomProfile, topProfile)核心逻辑&…

msvcr100.dll丢失应该怎么解决,比较靠谱的五种解决方法分享

首先&#xff0c;我们需要了解什么是msvcr100.dll。msvcr100.dll是Microsoft Visual C 2010 Redistributable Package的一部分&#xff0c;它包含了一些运行时库&#xff0c;用于支持某些程序的运行。简单来说&#xff0c;msvcr100.dll就是一个“桥梁”&#xff0c;连接了我们的…

组织架构图怎么做?手把手教你绘制完美的组织架构图

组织架构图是企业和组织中不可或缺的工具&#xff0c;它以图形化的方式展示了各级层次的关系&#xff0c;帮助人们更好地理解和管理整体结构。本文将为你详细介绍绘制组织架构图的要素、步骤和技巧&#xff0c;并推荐四款强大的绘图软件&#xff0c;让你轻松绘制完美的组织架构…

无涯教程-JavaScript - DELTA函数

描述 DELTA函数测试两个值是否相等。如果number1 number2,则返回1&#xff1b;否则返回1。否则返回0。 您可以使用此功能来过滤一组值。如,通过合计几个DELTA函数,您可以计算相等对的计数。此功能也称为Kronecker Delta功能。 语法 DELTA (number1, [number2])争论 Argum…

RK3588算法盒子maskrom模式下系统烧录

先在firefly官网下载bulidroot文件&#xff0c;然后进行烧录相关文件。 点击upgrade&#xff0c;进行烧录升级&#xff1b; 等待烧录完成后&#xff0c; 重新开机进入loader模式下&#xff0c; 进行烧录Untunt20.04系统的操作就行。

企业电脑文件加密系统 / 防泄密软件——「天锐绿盾」

「天锐绿盾」是一种公司文件加密系统&#xff0c;旨在保护公司内网数据安全&#xff0c;防止信息泄露。该系统由硬件和软件组成&#xff0c;其中包括服务端程序、控制台程序和终端程序。 PC访问地址&#xff1a; isite.baidu.com/site/wjz012xr/2eae091d-1b97-4276-90bc-6757c…

python趣味编程-太空入侵者游戏

在 Python 中使用 Turtle 的简单太空入侵者游戏免费源代码 使用 Turtle 的简单太空入侵者游戏是一个用Python编程语言编码的桌面游戏应用程序。该项目包含克隆实际太空入侵者游戏的多种功能。该项目可以使正在学习计算机相关课程的学生受益。该应用程序易于学习,可以帮助您发现…

软件设计师(八)算法设计与分析

算法被公认为是计算机科学的基石&#xff0c;算法理论研究的是算法的设计技术和分析技术。 一、算法设计和分析的基本概念 1、算法 &#xff08;Algorithm&#xff09; 算法&#xff1a;是对特定问题求解步骤的一种描述&#xff0c;它是指令的有限序列&#xff0c;其中每一条…

element树形筛选

<el-inputv-model"projectName"placeholder"请输入名称"clearablemaxlength"10"clear"clearTree" /> <el-divider /> <el-treeref"tree"class"filter-tree":data"treeList":props"…

技术面试与HR面:两者之间的关联与区别

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

华为OD机试 - 二维伞的雨滴效应(Java JS Python)

题目描述 普通的伞在二维平面世界中,左右两侧均有一条边,而两侧伞边最下面各有一个伞坠子,雨滴落到伞面,逐步流到伞坠处,会将伞坠的信息携带并落到地面,随着日积月累,地面会呈现伞坠的信息。 1、为了模拟伞状雨滴效应,用二叉树来模拟二维平面伞(如下图所示),现在输…

波奇学C++:多态

组合和继承 继承是白箱复用(whiter-box-reuse),获得继承类的内部细节 组合是黑盒测试(black-box-reuse),无法得走类的内部实现 class C {// }; //组合 class E { private:C _cc; }; is-a 关系用继承&#xff0c;人-学生&#xff1b;has-a 关系用组合 车-轮胎。 多态&#…

制作精美房地产电子传单的秘诀与技巧揭秘

如果您是一个房地产从业者或者是想要自己制作一个房地产电子传单的小白&#xff0c;那么本文将为您提供一个简单易懂的制作教程。我们将使用乔拓云网在线制作平台来制作这个电子传单。 第一步&#xff0c;登录乔拓云网在线制作平台。在浏览器中输入并打开乔拓云网的官方网站&am…

Cortex-M3如何跳出BusFault,跳过出错代码,程序往下执行

为了方便演示如何实现该方法&#xff0c;采用构造触发BusFault&#xff0c;方便分析 首先需要对系统Handler控制及状态寄存器SHCSR.MEMFAULTENA使能 往SRAM reserved写入数据&#xff0c;触发BusFault 如上图所示&#xff0c;可以看到触发BusFault前BFSR寄存器第7为高&#…

你参与的APP开发项目安全吗?

Android将安全设计贯穿系统架构的各个层面&#xff0c;覆盖系统内核、虚拟机、应用程序框架层以及应用层各个环节&#xff0c;力求在开放的同时&#xff0c;也恰当保护用户的数据、应用程序和设备的安全。Android安全模型主要提供以下几种安全机制&#xff1a; 进程沙箱隔离机…

IDEA集成Apipost Helper实现一键部署接口(避免参数注释)

先说好处&#xff1a; 1.一次性导入所有接口&#xff0c;不要一个一个扒。 2.对于字段的注释不要一个一个的去手写&#xff0c;映射实体类&#xff0c;自己上传&#xff08;最重要&#xff09;。 3.目录自动归类划分&#xff0c;避免接口混乱。 安装插件 首先&#xff0c;我们打…

Android性能优化深入解析,将你的APP优化到极致的操作~

作为一个Android程序员&#xff0c;性能优化是无法避开的事情&#xff0c;并且性能优化也是Android中最有挑战的工作之一&#xff0c;更是每个工程师都需要掌握的核心技能。 性能问题和Bug不同&#xff0c;后者的分析和解决思路更清晰&#xff0c;很多时候从应用日志即可直接找…

使用“vue init mpvue/mpvue-quickstart“初始化mpvue项目时出现的错误及解决办法

当使用"vue init mpvue/mpvue-quickstart"初始化 mpvue 项目时出现 "vue-cli Failed to download repo mpvue/mpvue-quickstart: connect ETIMEDOUT IP地址"原因是 github 的 IP 解析失败&#xff0c;连接超时 解决办法&#xff1a;更改最新的 github 的 …

面试问题总结(1)

(꒪ꇴ꒪ )&#xff0c;Hello我是祐言QAQ我的博客主页&#xff1a;C/C语言&#xff0c;数据结构&#xff0c;Linux基础&#xff0c;ARM开发板&#xff0c;网络编程等领域UP&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff0c;让我们成为一个强大的攻城狮&#xff0…

Golang RabbitMQ实现的延时队列

文章目录 前言一、延时队列与应用场景二、RabbitMQ如何实现延时队列实现延时队列的基本要素整体的实现原理如下 三、Go语言实战生产者消费者 前言 之前做秒杀商城项目的时候使用到了延时队列来解决订单超时问题&#xff0c;本博客就总结一下Golang是如何利用RabbitMQ实现的延时…