谈谈CSS3 硬件加速(GPU 加速)

迈不过友情╰ 2023-10-10 20:09 149阅读 0赞

前言

CSS3 硬件加速又叫做 GPU 加速,是利用 GPU 进行渲染,减少 CPU 操作的一种优化方案。页面css做图片滑动,滚动,特别是手机端,可能出现卡顿,闪白等情况,解决这些动画卡顿的情况,我们通常可以采用GPU加速的方式。由于 GPU 中的 transform 等 CSS 属性不会触发 repaint,所以能大大提高网页的性能。e1faa4447f0b4acf8cf9a3dfd06810be.png

如何开启 GPU 加速

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

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

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

  1. .haorooms_element {
  2. -webkit-transform: translateZ(0);
  3. -moz-transform: translateZ(0);
  4. -ms-transform: translateZ(0);
  5. -o-transform: translateZ(0);
  6. transform: translateZ(0);
  7. /**或者**/
  8. transform: rotateZ(360deg);
  9. transform: translate3d(0, 0, 0);
  10. }

通过-webkit-transform:transition3d/translateZ开启GPU硬件加速之后,有些时候可能会导致浏览器频繁闪烁或抖动,可以尝试以下办法解决之:

  1. -webkit-backface-visibility:hidden;
  2. -webkit-perspective:1000;

通过-webkit-transform:transition3d/translateZ开启GPU硬件加速的适用范围:

1、使用很多大尺寸图片(尤其是PNG24图)进行动画的页面。

2、页面有很多大尺寸图片并且进行了css缩放处理,页面可以滚动时。

3、使用background-size:cover设置大尺寸背景图,并且页面可以滚动时。

4、编写大量DOM元素进行CSS3动画时(transition/transform/keyframes/absTop&Left)。

5、使用很多PNG图片拼接成CSS Sprite时。

will-change

这个属性作用很单纯,就是“增强页面渲染性能”。那它是如何增强的呢?

我们可能听听说过,3D transform会启用GPU加速,例如translate3D, scaleZ之类,但是呢,这些属性业界往往称之为hack加速法。我们实际上不需要z轴的变化,但是还是假模假样地声明了,欺骗浏览器,这其实是一种不人道的做法。 而will-change则天生为此设计,顾名思意“我要变形了”,礼貌而友好。

语法

  1. /* 关键字值 */
  2. will-change: auto;
  3. will-change: scroll-position;
  4. will-change: contents;
  5. will-change: transform; /* <custom-ident>示例 */
  6. will-change: opacity; /* <custom-ident>示例 */
  7. will-change: left, top; /* 两个<animateable-feature>示例 */
  8. /* 全局值 */
  9. will-change: inherit;
  10. will-change: initial;
  11. will-change: unset;

will-change虽然可以加速,但是,一定一定要适度使用。遵循最小化影响原则。

可以让父元素hover的时候,声明will-change,这样,移出的时候就会自动remove,触发的范围基本上是有效元素范围。

  1. .will-change-parent:hover .will-change {
  2. will-change: transform;
  3. }
  4. .will-change {
  5. transition: transform 0.3s;
  6. }
  7. .will-change:hover {
  8. transform: scale(1.5);
  9. }

如果使用JS添加will-change, 事件或动画完毕,一定要及时remove. 比方说点击某个按钮,其他某个元素进行动画。点击按钮(click),要先按下(mousedown)再抬起才出发。因此,可以mousedown时候提示浏览器准备GPU加速, 动画结束自带回调,移除GPU加速:

  1. dom.onmousedown = function() {
  2. target.style.willChange = 'transform';
  3. };
  4. dom.onclick = function() {
  5. // target动画哔哩哔哩...
  6. };
  7. target.onanimationend = function() {
  8. // 动画结束回调,移除will-change
  9. this.style.willChange = 'auto';
  10. };

使用硬件加速的注意事项

内存。如果GPU加载了大量的纹理,那么很容易就会发生内容问题,这一点在移动端浏览器上尤为明显,所以,一定要牢记不要让页面的每个元素都使用硬件加速。

使用GPU渲染会影响字体的抗锯齿效果。这是因为GPU和CPU具有不同的渲染机制。即使最终硬件加速停止了,文本还是会在动画期间显示得很模糊。

发表评论

表情:
评论列表 (有 0 条评论,149人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Chrome硬件加速

    > 提升浏览器丝滑度 电脑配置:Mac电脑(M1芯片) 问题描述:在以往使用 Chrome 浏览器的时候,访问特定网站总是会特别卡(例如知乎),这让我一度怀疑是不是 Ch

    相关 svm使用gpu加速

    sklearn里面的svm拿来训练真的贼慢,还不能使用多线程加速,哪怕你的cpu是8核或者16核,训练的时候只使用1核,找了各种方式没有找到 最终发现一个库,叫做thunde

    相关 PyTorch_GPU加速测试

    初步学校pytorch,初步了解gpu 怎样利用gpu 进行运算,参考网上的资料。现在还有有问题,第一次采用计算慢怎样优化的问题。以后学习解决。 import tor

    相关 GPU加速是什么

    GPU加速是什么 by  [被单][Link 1] on  2017-04-11 众所周知,网页不仅应该被快速加载,同时还应该流畅运行,比如快速响应的交互,如丝般顺滑