前端性能优化-raf 以及其他达到60fps的方法

image.png
在现代 Web 开发中,前端性能优化已经成为一个非常重要的话题。随着互联网应用程序变得越来越复杂,用户对网页渲染速度和交互体验的要求也越来越高。如果我们的网页性能不佳,用户将会遇到困惑和不满,这可能会导致他们去寻找其他更好的替代品。因此,我们需要采取一些措施来提高网页的渲染性能和流畅度,从而提高用户的体验。

如何达到 60FPS?

首先,我们需要了解什么是 FPS。FPS 表示每秒帧数,它代表着动画每秒钟刷新的次数。因此,帧率(FPS)越高,动画就越流畅、越自然。一般来说,为了实现平滑的动画效果以及更好的用户体验,我们需要将帧率保持在 60 FPS(即每秒渲染 60 帧)以上。

那么,如何在前端开发中实现 60 FPS 的渲染呢?下面将逐一介绍几种实现方法。

1. requestAnimationFrame(简称 rAF)

image.pngrequestAnimationFrame 是 HTML5 新增的 API,主要用于在浏览器的下一次重绘之前调用指定的回调函数。该方法可以自动根据浏览器的性能情况控制动画的刷新频率,从而达到 60 FPS 的渲染速度。

下面是一个简单的示例,使用 requestAnimationFrame 实现一个移动的小球:

javascriptCopy Code

let ball = document.querySelector('.ball');

let x = 0;

let speed = 5;



function moveBall() {

  x += speed;

  if (x > window.innerWidth - ball.clientWidth || x < 0) speed = -speed;

  ball.style.left = x + 'px';
  window.requestAnimationFrame(moveBall);

}



window.requestAnimationFrame(moveBall);

上述代码中,我们定义了一个 moveBall 函数,里面实现了小球的运动逻辑,然后通过 window.requestAnimationFrame 方法来循环调用该函数,从而实现小球的平滑移动。

2. 使用硬件加速

在某些情况下,对于复杂的动画效果,使用 CSS3 的硬件加速功能可以提高动画的性能。一般来说,可以通过 transformopacity 两个属性来开启硬件加速。

例如,在下面的示例中,使用 transformopacity 属性实现一个移动的小球,并开启硬件加速:

cssCopy Code
.ball {
  position: absolute;
  top: 50%;
  left: 0;
  width: 50px;
  height: 50px;
  background-color: red;
  border-radius: 50%;
  transform: translateX(-100%);
  opacity: 0.7;
  will-change: transform, opacity;
  animation: moveBall 2s alternate infinite ease-in-out;
}

@keyframes moveBall {
  from {
    transform: translateX(-100%) rotate(0deg);
  }
  to {
    transform: translateX(100%) rotate(360deg);
  }
}

3. 减少 DOM 操作

在动画效果中,DOM 操作往往是 Web 应用程序的性能瓶颈之一。为了减小这种性能损耗,我们应该尽可能减少 DOM 操作的次数。例如,在实现小球移动的时候,我们可以先将需要修改的 CSS 样式进行缓存,等到下一帧时再将修改应用到 DOM 上,这样可以减少浏览器的重绘次数,从而提高渲染性能。

javascriptCopy Code

let ball = document.querySelector('.ball');

let x = 0;

let speed = 5;



function moveBall() {

  x += speed;

  if (x > window.innerWidth - ball.clientWidth || x < 0) speed = -speed;

  ball.style.transform = `translateX(${x}px)`;
  window.requestAnimationFrame(moveBall);

}



window.requestAnimationFrame(moveBall);

上述代码中,我们通过 translateX() 方法来修改小球的位置信息,然后再将修改应用到 DOM 上,从而减少了 DOM 操作的次数。

4. 使用 CSS 动画

在合适的情况下,可以使用 CSS 动画来实现复杂动画效果。相比于 JavaScript 实现动画效果,使用 CSS 动画可以减少 JavaScript 的计算量和 DOM 操作次数,从而提高渲染性能。

例如,在下面的示例中,使用 CSS 过渡实现一个淡入淡出的效果:

htmlCopy Code
<style>
  .fade {
    opacity: 1;
    transition: opacity 1s;
  }
  .hide {
    opacity: 0;
  }
</style>
<div id="box" class="fade">Hello, World!</div>
<script>
  setTimeout(() => {
    document.querySelector('#box').classList.add('hide');
  }, 3000);
</script>

上述代码中,我们通过添加 transition 属性来实现淡入淡出的效果,然后通过添加 .hide 类来触发该效果。

5. 避免强制同步布局

强制同步布局是指由于某些操作需要获取元素的位置或尺寸等信息,从而导致浏览器强制刷新 DOM 并重新计算布局的过程。这样的操作会降低渲染性能,因此我们应该尽量避免这种情况的发生。

以下是一些可能引起强制同步布局的操作:

  • 获取元素的 offsetTop、offsetLeft、offsetWidth、offsetHeight 等属性;
  • 获取元素的 scrollTop、scrollLeft、scrollWidth、scrollHeight 等属性;
  • 改变元素的 className 属性;
  • 改变元素的 style 属性;
  • 改变页面的字体大小。

在动画效果中,我们应该尽量避免这些操作的出现,从而提高渲染性能。

raf 的实现原理

image.png
了解了 requestAnimationFrame 方法之后,我们不妨来了解一下它的实现原理。它的实现原理主要有两个方面:同步性和智能性。

同步性

requestAnimationFrame 方法的回调函数被插入到浏览器维护的“帧队列”中,这意味着它的运行时机是在浏览器下一次重绘之前。在下一次重绘之前,所有需要刷新的回调函数都会被依次处理。

这样做的好处在于,可以将多个回调函数压缩成一个或者几个任务,从而避免了过多的重布局和绘制操作,提高了渲染性能和流畅度。

智能性

除了同步性之外,requestAnimationFrame 方法还具有智能性。它可以根据当前设备的性能情况来动态调整帧率,以达到更好的用户体验。

例如,在低性能设备上,requestAnimationFrame 方法可能会将帧率降低到 30 帧或者更低,以保证流畅度。而在高性能设备上,它则会自动提高帧率,从而达到更加细腻的渲染效果。

总结

通过以上的介绍,我们了解了如何使用 requestAnimationFrame 方法来实现 60 FPS 的渲染速度,以及一些其他的优化技巧。在实际开发中,我们应该根据项目需求和设备性能等因素,选择合适的优化方案,从而提高网页性能和用户体验。

最后,我们再来简单总结一下本文涉及的内容:

  • 了解了什么是 FPS,以及为什么要将帧率保持在 60 FPS 以上;
  • 学习了如何使用 requestAnimationFrame 方法实现动画效果,并了解了它的实现原理;
  • 掌握了使用硬件加速、减少 DOM 操作、使用 CSS 动画和避免强制同步布局等优化技巧。

希望本文对你有所帮助,感谢阅读!

© 版权声明
THE END
喜欢就支持一下吧
点赞0

Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MY3UozAS' (Errcode: 28 - No space left on device) in /www/wwwroot/583.cn/wp-includes/class-wpdb.php on line 2345
admin的头像-五八三
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

图形验证码
取消
昵称代码图片