前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Web 性能优化-CSS3 硬件加速(GPU 加速)

Web 性能优化-CSS3 硬件加速(GPU 加速)

作者头像
李振
发布于 2021-11-26 03:36:40
发布于 2021-11-26 03:36:40
3.3K00
代码可运行
举报
文章被收录于专栏:乱码李乱码李
运行总次数:0
代码可运行

CSS3 硬件加速简介

上一篇文章学习了重绘和回流对页面性能的影响,是从比较宏观的角度去优化 Web 性能,本篇文章从每一帧的微观角度进行分析,来学习 CSS3 硬件加速的知识。

CSS3 硬件加速又叫做 GPU 加速,是利用 GPU 进行渲染,减少 CPU 操作的一种优化方案。由于 GPU 中的 transform 等 CSS 属性不会触发 repaint,所以能大大提高网页的性能。

我做了一个页面,左边元素的动画通过 left/top 操作位置实现,右边元素的动画通过 transform: translate 实现,你可以打开 chrome 的 “Paint flashing” 查看,绿色部分是正在 repaint 的内容。

查看地址

从 demo 中可以看到左边的图形在运动时外层有一圈绿色的边框,表示元素不停地 repaint,并且可以看到其运动过程中有丢帧现象,具体表现为运动不连贯,有轻微闪动。

动画与帧

之前学习 flash 的时候,就知道动画是由一帧一帧的图片组成,在浏览器中也是如此。我们首先看一下,浏览器每一帧都做了什么。

  1. JavaScript:JavaScript 实现动画效果,DOM 元素操作等。
  2. Style(计算样式):确定每个 DOM 元素应该应用什么 CSS 规则。
  3. Layout(布局):计算每个 DOM 元素在最终屏幕上显示的大小和位置。由于 web 页面的元素布局是相对的,所以其中任意一个元素的位置发生变化,都会联动的引起其他元素发生变化,这个过程叫 reflow。
  4. Paint(绘制):在多个层上绘制 DOM 元素的的文字、颜色、图像、边框和阴影等。
  5. Composite(渲染层合并):按照合理的顺序合并图层然后显示到屏幕上。

动画与图层

浏览器在获取 render tree(详细知识可以查看Web性能优化-页面重绘和回流(重排))后,渲染树中包含了大量的渲染元素,每一个渲染元素会被分到一个图层中,每个图层又会被加载到 GPU 形成渲染纹理。GPU 中 transform 是不会触发 repaint 的,这一点非常类似 3D 绘图功能,最终这些使用 transform 的图层都会由独立的合成器进程进行处理。

过程如下:

render tree -> 渲染元素 -> 图层 -> GPU 渲染 -> 浏览器复合图层 -> 生成最终的屏幕图像。

TIPS: chrome devtools 中可以开启 Rendering 中的 Layer borders 查看图层纹理。 其中黄色边框表示该元素有 3d 变换,表示放到一个新的复合层(composited layer)中渲染,蓝色栅格表示正常的 render layer。

在文章开始给出的例子中,我们也可以开启 Layer borders,可以观察到,使用 transform: translate 动画的元素,外围有一个黄色的边框,可知其为复合层。

在 GPU 渲染的过程中,一些元素会因为符合了某些规则,而被提升为独立的层(黄色边框部分),一旦独立出来,就不会影响其它 DOM 的布局,所以我们可以利用这些规则,将经常变换的 DOM 主动提升到独立的层,那么在浏览器的一帧运行中,就可以减少 Layout 和 Paint 的时间了。

创建独立图层

哪些规则能让浏览器主动帮我们创建独立的层呢?

  1. 3D 或者透视变换(perspective,transform) 的 CSS 属性。
  2. 使用加速视频解码的 video 元素。
  3. 拥有 3D(WebGL) 上下文或者加速 2D 上下文的 canvas 元素。
  4. 混合插件(Flash)。
  5. 对自己的 opacity 做 CSS 动画或使用一个动画 webkit 变换的元素。
  6. 拥有加速 CSS 过滤器的元素。
  7. 元素有一个包含复合层的后代节点(换句话说,就是一个元素拥有一个子元素,该子元素在自己的层里)。
  8. 元素有一个兄弟元素在复合图层渲染,并且该兄弟元素的 z-index 较小,那这个元素也会被应用到复合图层。

关于 z-index 导致的硬件加速的问题,可以查看这篇文章 CSS3硬件加速也有坑!!

开启 GPU 加速

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

  1. transform
  2. opacity
  3. filter
  4. will-change

如果有一些元素不需要用到上述属性,但是需要触发硬件加速效果,可以使用一些小技巧来诱导浏览器开启硬件加速。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.element {
    -webkit-transform: translateZ(0);
    -moz-transform: translateZ(0);
    -ms-transform: translateZ(0);
    -o-transform: translateZ(0);
    transform: translateZ(0); 
    /**或者**/
    transform: rotateZ(360deg);
    transform: translate3d(0, 0, 0);
}

注意:我在不同的资料中查到的 transform 是否能触发硬件加速的结果不同,自己测试后,发现结果是可以。

要注意的问题

(1)过多地开启硬件加速可能会耗费较多的内存,因此什么时候开启硬件加速,给多少元素开启硬件加速,需要用测试结果说话。 (2)GPU 渲染会影响字体的抗锯齿效果。这是因为 GPU 和 CPU 具有不同的渲染机制,即使最终硬件加速停止了,文本还是会在动画期间显示得很模糊。

参考文章

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-05-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
盒子端 CSS 动画性能提升研究
对于 Web 动画的性能问题,仅仅停留在感觉已经优化的OK之上,是不够的,想要在盒子端跑出高性能接近 60 FPS 的流畅动画,就必须要刨根问底,深挖每一处可以提升的方法。
Sb_Coco
2018/01/15
2.3K9
盒子端 CSS 动画性能提升研究
进阶|你的css经不住这层考验,就是失败...
前端爱好者的知识盛宴 今天的技术提供者是鹅厂的chokcoco. chokcoco是一位用css用得贼6的大神. 文末会有他的博客链接... 欢迎各位前端爱好者去他博客游玩下... 供稿者认为仅仅... 在PC 端、移动端的 Web 动画... 还需要经得住在盒子端的考验! 甚至达到60 FPS的快感... 跟着供稿者的思路... 你会锻炼出一种解决问题的方法论... 欢迎留言、转发! 以及提问供稿者! 马上去片! 流畅动画的标准 理论上说,FPS 越高,动画会越流畅... 目前大多数设备的屏幕刷新率为
用户1097444
2022/06/29
7040
进阶|你的css经不住这层考验,就是失败...
从浏览器渲染层面解析css3动效优化原理
在h5开发中,我们经常会需要实现一些动效来让页面视觉效果更好,谈及动效便不可避免地会想到动效性能优化这个话题:
winty
2021/10/11
6460
从浏览器渲染层面解析css3动效优化原理
盒子端 CSS 动画性能提升研究
不同于传统的 PC Web 或者是移动 WEB,在腾讯视频客厅盒子端,接大屏显示器(电视)下,许多能流畅运行于 PC 端、移动端的 Web 动画,受限于硬件水平,在盒子端的表现的往往不尽如人意。 基于此,对于 Web 动画的性能问题,仅仅停留在感觉已经优化的OK之上,是不够的,想要在盒子端跑出高性能接近 60 FPS 的流畅动画,就必须要刨根问底,深挖每一处可以提升的方法。 流畅动画的标准 理论上说,FPS 越高,动画会越流畅,目前大多数设备的屏幕刷新率为 60 次/秒,所以通常来讲 FPS 为 60fra
Sb_Coco
2018/05/28
7790
分享 | 前端性能优化(CSS动画篇)
最近拜读了一下html5rocks上几位大神写的一篇关于CSS3动画性能优化的文章,学到了很多,在这里记录一下,其中的知识都是来源于这俩篇文章,我只是截取了其中比较关注的内容出来,原文地址High Performance Animations及Accelerated Rendering in Chrome
疯狂的技术宅
2019/03/28
2K0
CSS动画与GPU
那么问题是:已经小心遵守这些规则了,为什么动画还会卡顿、跳帧?还能优化吗?要从哪里入手?
ayqy贾杰
2023/03/15
2.5K0
CSS动画与GPU
【Web动画】CSS3 3D 行星运转 && 浏览器渲染原理
承接上一篇:【CSS3进阶】酷炫的3D旋转透视 。 最近入坑 Web 动画,所以把自己的学习过程记录一下分享给大家。 CSS3 3D 行星运转 demo 页面请戳:Demo。(建议使用Chrome打开
Sb_Coco
2018/05/28
2.7K0
CSS3强制启用 GPU 加速渲染 CSS3 动画
css3 transform:translateZ(0)解决一个存在已久并早已知悉解决方案的渲染问题… 最终,只用了一小段的css代码就解决了
2Broear
2024/03/12
3570
每天10个前端小知识 【Day 16】
改变transform或opacity不会触发浏览器重新布局(reflow)或重绘(repaint),只会触发复合(compositions)。
程序媛夏天
2024/01/18
2290
每天10个前端小知识 【Day 16】
这一次,彻底搞懂 GPU 和 css 硬件加速
cpu (central process) 是计算机的大脑,它提供了一套指令集,我们写的程序最终会通过 cpu 指令来控制的计算机的运行。
神说要有光zxg
2021/09/06
1.2K0
GPU 加速到底是个啥?
一. GPU 加速能做什么? 首先我们要了解什么是 16ms 优化 大多数设备的刷新频率是 60 次/秒,(1000/60 = 16.6ms)也就说是浏览器对每一帧画面的渲染工作要在 16ms 内完成
AI研习社
2018/03/29
1.6K0
GPU 加速到底是个啥?
你所不知道的 CSS 动画技巧与细节
怕标题起的有点大,下述技巧如果你已经掌握了看看就好,欢迎斧正,本文希望通过介绍一些 CSS 不太常用的技巧,辅以一些实践,让读者可以更加深入的理解掌握 CSS 动画。 废话少说,直接进入正题,本文提到
Sb_Coco
2018/05/28
6970
CSS3动画性能优化集
在浏览器开始渲染页面,或者长时间执行某个 JS 时,主线程会一直在忙碌状态,此时对于用户的任何输入或是操作都不会有所响应。
2Broear
2024/03/12
2280
Web动画性能介绍
帧率(FPS):描述每秒播放的帧数,单位为 Hz 或者 frame/s (帧/秒)。
前端GoGoGo
2018/08/27
8940
Web动画性能介绍
制作60fps的高性能动画
说到web的高性能动画,这部分内容其实已经是老生常谈的了,不过其中还是有不少比较新的而且非常实用的内容可以和大家分享一下。
QQ音乐前端团队
2018/09/25
2.8K2
CSS 强制启用 GPU 加速
最近在学校机房上前端课,用到了之前偶然看到的 CSS 的 GPU 渲染,性能肉眼可见提升。
Cesirdy
2023/05/29
1.2K0
通过css来开启硬件加速提升网页应用流畅性
在进行网页开发中,经常会接触都网页的动画,例如css3的animations, transforms 以及 transitions,有时会发现有这些的页面运行起来会感觉很卡顿,非常不流畅,和预期的相比相差很多。原因是这些效果不会自动开启GPU加速,而是由浏览器的缓慢的软件渲染引擎来执行,所以会显得很卡顿,不流畅。那我们怎样才可以切换到GPU模式呢,很多浏览器提供了某些触发的CSS规则。
OECOM
2020/07/01
1.3K0
CSS动画的性能优化
在Web页面中使用动画效果已经不是什么稀奇的事情了。但凡优秀的UI界面都会有一些点缀用的动画效果。举个例子,Stripe Checkout小组通过UI动画效果来增强支付体验。
mmzhou
2018/08/06
1.9K0
CSS动画的性能优化
浏览器渲染之回流重绘
回流和重绘是前端开发的高频词汇之一,你可以在各种面经,性能优化相关文章可以看到,但是很多都是草草带过。本文带你从浏览器渲染流程中了解回流与重绘的原理。
政采云前端团队
2021/09/30
1.8K0
浏览器渲染之回流重绘
CSS硬件加速
近些年,我们总是听到硬件加速,以及它如何帮助我们提升网页的动画性能,让网页动画变得更好,在移动端更流畅。那么什么是硬件加速?如何触发硬件加速呢?
chuckQu
2022/08/19
6550
相关推荐
盒子端 CSS 动画性能提升研究
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档