前端动画优化及性能检测工具使用

前端使用动画可以分为两类:

  • css 动画
  • js 动画

我们提倡能够使用 css 完成的动画尽量使用 css ( 即使用 animation 和 keyframes )。因为处理 css 是浏览器渲染线程,并不会占用 js 线程,也不会被 js 线程所影响。因而会更加流畅。

但是 css 动画在复杂的场景下并不能满足需求。一些复杂的动画需要通过 js 进行一些计算。如果使用 js 渲染动画可能会出现因为 js 线程忙于计算其他任务,而迟迟不到下一个事件循环导致动画得不到更新,表现出卡顿。

另外,不管是 css 还是 js 动画都要尽量去减少重排重绘。因为频繁的重排和重绘会使页面的使用流畅度和体验下降。

使用 GPU 运算合成图层

浏览器渲染过程:

DOM树 + CSSOM树 --> render tree --> 分成很多图层 --> GPU 渲染 --> 合成图层

GPU 的工作并不会加速而是会将某个元素拿到一个新的图层中,然后单独进行渲染,然后在动画结束后将多个图层合并到一个图层中,最终展示在浏览器中。将动画分到单独的合成图层中,在每次重排和重绘时,只需要重排重绘自己的图层,而不影响其他图层。

GPU 带来的损耗是内存占用,每个合成层都会有内存损耗,过多的合成层可能会带来性能问题。但总体来说,一些频繁更新的动画使用 GPU 加速更好。

“ GPU 是廉价的”,我们可以去使用 GPU 进行一些动画的渲染和运算。触发 GPU 渲染的css 属性:

  • transform 中使用3d ,translate3d 、 scale3d、 rotate3d
  • opacity
  • will-change

使用window.requestAnimationFrame

告诉浏览器——你希望执行一个动画,并且要求浏览器在下次重绘之前调用指定的回调函数更新动画。该方法需要传入一个回调函数作为参数,该回调函数会在浏览器下一次重绘之前执行
在每次浏览器重新渲染之前更新动画,我们可以避免无用的更新,替代 setInterval 的更新。

这里写了一个小 demo:

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>test</title><style>html {height: 100%;width: 100%;}body {margin: 0;width: 100%;height: 100%;display: flex;justify-content: center;align-items: center;}.container {height: 800px;width: 800px;border: 3px solid black;position: relative;}.ball {position: relative;width: 100px;height: 100px;border-radius: 50%;background-color: pink;}</style><link rel="stylesheet" type="text/css" href="./test.css" /></head><body><div class="container"><div class="ball"></div></div></body><script>let speedX = 10;let speedY = 10;//容器const Container = document.querySelector(".container");let containerWidth = Container.clientHeight;let containerHeight = Container.clientWidth;//球const Ball = document.querySelector(".ball");let ballWidth = Ball.offsetWidth;let ballHeight = Ball.offsetHeight;let positionX = 0;let positionY = 0;const maxOffsetLeft = containerWidth - ballWidth; //最大的右边界const maxOffsetTop = containerHeight - ballHeight; //最大的下边界let ballOffsetLeft = 0;let ballOffsetTop = 0;function moveBall() {window.requestAnimationFrame(() => {ballOffsetLeft += speedX;ballOffsetTop += speedY;if (checkBoundry(ballOffsetLeft, ballOffsetTop)) {speedX = -speedX;speedY = -speedY;}// 使用left和top或者margin 进行的移动并不能创建合成图层和 GPU 运算// Ball.style.left = ballOffsetLeft + "px";// Ball.style.top = ballOffsetTop + "px";//使用transform中的translate3d可以将动画移动到合成图层中加速运算Ball.style.transform = `translate3d(${ballOffsetLeft}px ,${ballOffsetTop}px,0px)`;window.requestAnimationFrame(moveBall);});}moveBall();function checkBoundry(x, y) {if (x <= 0 || x >= maxOffsetLeft || y <= 0 || y >= maxOffsetTop) {return true;}return false;}</script>
</html>

动画性能分析工具 rendering

在chrome 的开发者工具中有很多工具

在开发者工具中可以使用 rendering 工具进行查看页面渲染的图层、重绘以及掉帧情况。

勾选 paint flashing 可以高亮显示出需要重绘的元素,图中使用了 translate3d 便进入了合成图层使用了 GPU 加速,因此只需要重绘自己的合成层就好,因此没有高亮。

而当我们使用 left 和 top 移动这个球时:

这个球会被绿色高亮出来,因为使用 left 和 top 并不能新建合成图层,仍然在文档流中。

另一个工具是 performance monitor


可以看到 layouts/sec 是 30 即每秒进行了 30 次重排

而使用 translate3d 时 :

layouts / sec 是 0 即正常文档流中没有进行重排

使用performance 进行帧数分析


可以看到 30 fps ,不算高。
正常浏览器渲染页面是 60fps左右,即 16.7ms/帧

前端动画优化及性能检测相关推荐

  1. Web前端 HTML 优化启动性能

    Web前端 HTML 优化启动性能 一个在软件应用开发中经常被忽视的方面-即便在那些专注于性能优化的软件中-就是启动时的表现.你的应用需要花费多长时间启动?当应用加载时是否会卡住用户的设备或浏览器?这 ...

  2. 前端如何优化网站性能?

    前端如何优化网站性能? 1.减少HTTP的请求数量 在浏览器与服务器进行通信的时候,主要是通过HTTP进行通信,浏览器与服务器需要经过三次握手,每次握手需要花费大量的时间,而且不同浏览器对资源文件并发 ...

  3. Unity性能优化之性能检测工具汇总

    Unity Profiler 简述:Unity自带的性能分析工具,可以分析CPU.GPU以及内存消耗,支持真机调试. 官方教程:https://docs.unity3d.com/Manual/Prof ...

  4. web前端 网页加载 性能优化大全

    web前端 性能优化 - - 如何提高网页加载速度 文章目录 web前端 性能优化 --- --- 如何提高网页加载速度 1. 减少DNS查找 2. 使用CDN托管资源 3. 减少Http请求 浏览器 ...

  5. Android 性能优化(62)---存检测、卡顿优化、耗电优化、APK瘦身——详解篇

    Android 性能优化,内存检测.卡顿优化.耗电优化.APK瘦身--详解篇 自2008年智能时代开始,Android操作系统一路高歌,10年智能机发展之路,如今 Android 9.0 代号P  都 ...

  6. CSS3 动画卡顿性能优化解决方案--摘抄

    最近在开发小程序,与vue类似,它们都有生命周期这回事. onLoad 监听页面加载 onReady 监听页面初次渲染完成 onShow 监听页面显示 到底是什么意思? 所以这又触碰到了我的知识盲区, ...

  7. 前端开发:Web性能优化有哪些方法?

    Web性能优化,主要分为前端和后台两个部分性能优化,后台性能优化决定了Web能不能用,前端优化决定了其好不好用,也就是牵涉到前端用户体验和Web易用性等情况,所以前端性能与用户体验是有着极大的关联的. ...

  8. 前端搞工程化:从零打造性能检测库「源码 + 视频」

    工程化体系专栏永远首发自我的 Github,大家可以关注点赞,通常会早于发布各大平台一周时间以上. 本文涉及到的源码及视频地址: 源码 视频,因为制作肯定比文字需要的时间多,所以本周才会更新完毕,大家 ...

  9. 前端框架/架构,性能优化,负载均衡,首屏渲染

    前端数据结构与算法- https://zhuanlan.zhihu.com/p/27659059 > 前端重构方案 前端重构方案了解一下- https://blog.csdn.net/vM199 ...

最新文章

  1. Rust 2020 调查报告出炉,95%的开发者吐槽Rust难学
  2. [DefaultProperty(Text),ToolboxData()]
  3. linux tar 提示 time stamp xxx in the future 解决方法
  4. Redis 高可用特性之 “持久化” 详解
  5. 【线上分享】探讨TensorRT加速AI模型的简易方案:以图像超分为例
  6. mysqlplus 批量插入_ibatis结合oracle批量插入三种方法的测评
  7. mysql取消mvvc机制_MySQL探秘(六):InnoDB一致性非锁定读
  8. 微信小程序选择图片,查看图片信息,浏览图片,图片上传
  9. 185.部门工资前三高的员工
  10. 关于win10系统常用的c盘清理技巧
  11. linux下运行comsol,在 Linux 上安装 COMSOL
  12. 关于表格冻结行和列的方法
  13. php做支付宝接口测试,支付宝接口调试经验总结
  14. 花一星期折腾后,我劝你好好考虑下书签同步这个问题
  15. chatter投稿&メール通知
  16. moment.js时间操作
  17. 语句摘抄——第16周
  18. 微信的服务器 上海,昨下午部分用户无法收发文字信息和登录 微信回应:上海机房服务器发生故障 现已恢复...
  19. idl 7.1 64 linux,ubuntu 16.04下IDL7.1输入idlde闪退问题
  20. 贝尔商道赚钱思维36道第12道:养成微习惯

热门文章

  1. python编译pyd
  2. window10 android-ndk-r10d 编译ffmpeg 3.4
  3. Shell中NR/NF的意义
  4. 下载CentOS7、CentOS8镜像(ISO)
  5. 计算机等级考试2018改革,2018全国计算机等级考试调整方案公布,这些科目取消了!...
  6. java git服务器_windowsServer服务器上搭建GIt服务器
  7. android 摇一摇监听,Android摇一摇功能实现(摇一摇监听)
  8. python中分支结构有几种各有什么特点_「武鹏有课」Python分支结构的种类
  9. hbase 单机 java api,HBase学习(一)hbase安装(单机模式)和javaapi客户端访问hbase例子...
  10. 解决Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.7.0:compile