整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

探秘网页性能提升利器之CSS硬件加速

天我们将为大家介绍一个令网页性能大幅提升的神奇技术——CSS硬件加速。随着移动互联网的蓬勃发展和网页设计越发复杂,如何优化网页性能成为了前端开发者们亟待解决的问题。在这篇文章中,我们将深入了解CSS硬件加速的原理,并通过一个生动的案例来展示它如何帮助我们改善网页的渲染性能。

一、什么是CSS硬件加速

在传统的网页渲染中,浏览器使用中央处理器(CPU)来处理CSS样式和页面渲染。然而,随着网页变得越来越复杂,例如包含大量动画、过渡效果或复杂的变换,CPU可能会承担较重的负担,导致页面加载缓慢或卡顿。CSS硬件加速是一种解决方案,它充分利用了计算机的图形处理单元(GPU)来加快CSS样式的处理和渲染,从而提高页面性能和流畅度。

1.1 CPU

CPU 即中央处理器。

CPU是计算机的大脑,它提供了一套指令集,我们写的程序最终会通过 CPU 指令来控制的计算机的运行。它会对指令进行译码,然后通过逻辑电路执行该指令。整个执行的流程分为了多个阶段,叫做流水线。指令流水线包括取指令、译码、执行、取数、写回五步,这是一个指令周期。CPU会不断的执行指令周期来完成各种任务。

1.2 GPU

GPU 即图形处理器。

GPU,是Graphics ProcessingUnit的简写,是现代显卡中非常重要的一个部分,其地位与CPU在主板上的地位一致,主要负责的任务是加速图形处理速度。GPU是显卡的“大脑”,它决定了该显卡的档次和大部分性能,同时也是2D显示卡和3D显示卡的区别依据。2D显示芯片在处理3D图像和特效时主要依赖CPU的处理能力,称为“软加速”。3D显示芯片是将三维图像和特效处理功能集中在显示芯片内,也即所谓的“硬件加速”功能。

二、CSS硬件加速原理

CSS硬件加速的原理涉及到浏览器的渲染引擎、GPU以及优化渲染的过程。

2.1 浏览器的渲染流程

一个完整的渲染步骤大致可总结为如下:

  • 渲染进程将HTML内容转换为能够读懂的DOM树结构。
  • 渲染引擎将CSS样式表转化为浏览器可以理解的 styleSheets ,计算出DOM节点的样式。
  • 创建布局树,并计算元素的布局信息。
  • 对布局树进行分层,并生成分层树。
  • 为每个图层生成绘制列表,并将其提交到合成线程。
  • 合成线程将图层分成图块,并在光栅化线程池中将图块转换成位图。
  • 合成线程发送绘制图块命令DrawQuad给浏览器进程。
  • 浏览器进程根据DrawQuad消息生成页面,并显示到显示器上。

2.2 CSS硬件加速触发

在传统的渲染过程中,布局和绘制是由CPU来完成的,而在CSS硬件加速下,GPU参与了渲染的处理,从而提高了性能。

CSS 中的以下几个属性能触发硬件加速:

1.transform属性:该属性用于应用2D或3D变换效果,如旋转、缩放、平移等。当使用transform属性时,浏览器会将变换任务交给GPU处理,从而实现硬件加速。

2.opacity属性:该属性用于设置元素的不透明度。虽然它主要用于控制透明度,但是一个不为1的值(例如0.99)也可以触发硬件加速。

3.will-change属性:will-change属性用于提示浏览器一个元素将要发生的变化,以便浏览器在渲染过程中做出优化。

一旦CSS硬件加速被触发,相关的渲染任务将被GPU处理。GPU在处理图形和动画方面通常比CPU更快和更高效。对于复杂的CSS动画和变换,GPU可以并行处理多个任务,从而提高性能和流畅度。

请注意,CSS硬件加速并不是适用于所有情况。虽然它在许多情况下可以带来显著的性能提升,但有时也可能导致额外的GPU资源占用,从而影响其他应用程序的性能。因此,在使用CSS硬件加速时,我们应该进行性能测试和优化,确保在特定情况下确实能获得性能的提升。

三、CSS硬件加速案例

现在,我们来看一个实际的案例,通过启用CSS硬件加速来改善网页性能。

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8" />

<meta name="viewport" content="width=device-width, initial-scale=1.0" />

<title>Document</title>

<style>

.app {

position: relative;

width: 400px;

height: 400px;

}

.box {

position: absolute;

left: 0;

top: 0;

width: 100px;

height: 100px;

background-color: yellowgreen;

}

.box-run1 {

-webkit-animation: run1 4s infinite;

animation: run1 4s infinite;

}

.box-run2 {

-webkit-animation: run2 4s infinite;

animation: run2 4s infinite;

}

@keyframes run1 {

0% {

top: 0;

left: 0;

}

25% {

top: 0;

left: 200px;

}

50% {

top: 200px;

left: 200px;

}

75% {

top: 200px;

left: 0;

}

}

@keyframes run2 {

0% {

transform: translate(0, 0);

}

25% {

transform: translate(200px, 0);

}

50% {

transform: translate(200px, 200px);

}

75% {

transform: translate(0, 200px);

}

}

</style>

</head>

<body>

<div class="app">

<div class="box"></div>

</div>

<button class="btn1">循环转换</button>

<button class="btn2">硬件加速</button>

<script>

let box = document.querySelector(".box");

let btn1 = document.querySelector(".btn1");

let btn2 = document.querySelector(".btn2");

btn1.addEventListener("click", function (e) {

box.classList.remove("box-run2");

box.classList.add("box-run1");

});

btn2.addEventListener("click", function (e) {

box.classList.remove("box-run1");

box.classList.add("box-run2");

});

</script>

</body>

</html>

此时我们可以运行代码,在页面上可以看到,2个按钮均能使box在app当中循环移动。但对于这两种方式的移动,他们的效率却有着很大的差异。我们可以使用开发者工具里的Performance去查看。

当我们点击btn1时,此时box盒子通过定位的left和top进行循环移动时。

此时我们可以看到细节模块的记录详情。

蓝色(Loading):网络通信和HTML解析

黄色(Scripting):Javascript执行

紫色(Rendering):样式计算和布局,即重排

绿色(Painting):重绘

灰色(Other):其他事件花费的时间

白色(Idle):空闲时间

细节模块有4个面板,Summary面板每个事件都会有,其他三个只针对特定事件会有。

当我们点击btn2时,此时box盒子通过transform属性进行css硬件加速后进行循环移动时。

通过对比我们不难发现,当启用硬件加速时,方块的变换会更加流畅,其样式计算和布局、重绘的时间都会减少。因为GPU参与了渲染过程。

总结

CSS硬件加速是一个强大的前端技术,可以显著提高网页的性能和流畅度。通过启用硬件加速,我们可以将一些渲染任务交给GPU来处理,减轻CPU的负担,从而优化网页的渲染性能。然而,我们需要注意不要滥用硬件加速,避免触发不必要的GPU渲染,以确保真正获得性能提升。在日常的网页开发中,我们可以灵活运用CSS硬件加速,为用户带来更好的浏览体验。

o语言中文网,致力于每日分享编码、开源等知识,欢迎关注我,会有意想不到的收获!

1 题目描述

给定一个单链表L: L0 → L1 → … → Ln-1 → Ln,将其重排为L0 → Ln → L1 → Ln-1 → L2 → Ln-2→…。请勿更改节点中的值。

例子1:

给定1 -> 2 -> 3 -> 4,重排为1 -> 4 -> 2 -> 3;

例子2:

给定1 -> 2 -> 3 -> 4 -> 5,将其重排为1 -> 5 -> 2 -> 4 -> 3。

题目出处:

https://leetcode.com/problems/reorder-list/

2 解决思路

2.1)从头至尾遍历原链表节点构建一个双向链表;

2.2)两个指针分别从头至尾、从尾至头同时遍历该双向链表来建立所要求的顺序关系,直至汇合即完成重排。重排过程如下图所示。

3 golang实现代码

https://github.com/olzhy/leetcode/blob/master/143_Reorder_List/test.go

原文:https://leileiluoluo.com/posts/leetcode-reorder-linked-list.html

本文作者:磊磊落落的博客,原创授权发布

.行内元素/块级元素 非替换元素/替换元素

2.img的title和alt属性 (title是全局属性)

3.meta标签

4.DOCTYPE标签 (标准模式、兼容模式)

5.script标签的defer和async

6.WC3盒模型和怪异和模型 (box-sizing)

7.水平垂直居中的方法

8.BFC (BFC是什么、触发条件、特性及作用)

9.清除浮动的方法

10.position属性

11.CSS隐藏元素的方式 (display:none和visibility:hidden的区别)

12.Flex布局

13.双栏布局 三栏布局

14.重排和重绘

15.CSS选择器 (类型、优先级有那些)

16.CSS动画 (关键帧动画animation属性、过渡动画transition属性)

17.CSS实现三角形

18.CSS Sprites

19.px rem em

20.伪类/伪元素