前言

在研究canvas的2D pixi.js库的时候,其动画的刷新都用requestAnimationFrame替代了setTimeout 或 setInterval

但是jQuery中还是采用了setInterval,我这章就研究下顺便改造下jQuery的动画

定时器

jQuery动画的实现考虑到兼容与易用性采用了setInterval来不断绘制新的属性值,从而达到动画的效果。

大部分浏览器的显示频率是16.7ms,由于浏览器的特性,setInterval会有一个丢帧的问题

即使向其传递毫秒为单位的参数,它们也不能达到ms的准确性。这是因为javascript是单线程的,可能会发生阻塞

jQuery会有一个全局设置jQuery.fx.interval = 13 设置动画每秒运行帧数。

默认是13毫秒。该属性值越小,在速度较快的浏览器中(例如,Chrome),动画执行的越流畅,但是会影响程序的性能并且占用更多的 CPU 资源

那么归纳一点最关键的问题:

开发着并不知道下一刻绘制动画的最佳时机是什么时候

requestAnimationFrame

requestAnimationFrame 是专门为实现高性能的帧动画而设计的一个API

说简单点

  • setInterval、setTimeout是开发者主动要求浏览器去绘制,但是由于种种问题,浏览器可能会漏掉部分命令
  • requestAnimationFrame 就是浏览器什么要开始绘制了浏览器自己知道,通过requestAnimationFrame 告诉开发者,这样就不会出现重复绘制丢失的问题了

目前已在多个浏览器得到了支持,包括IE10+,Firefox,Chrome,Safari,Opera等,在移动设备上,ios6以上版本以及IE mobile 10以上也支持requestAnimationFrame,

唯一比较遗憾的是目前安卓上的原生浏览器并不支持requestAnimationFrame,不过对requestAnimationFrame的支持应该是大势所趋了,安卓版本的chrome 16+也是支持requestAnimationFrame的。

比较

区别:

  1. requestAnimationFrame 会把每一帧中的所有DOM操作集中起来,在一次重绘或回流中就完成,并且重绘或回流的时间间隔紧紧跟随浏览器的刷新频率,一般来说,这个频率为每秒60帧
  2. 隐藏或不可见的元素中,requestAnimationFrame将不会进行重绘或回流,这当然就意味着更少的的cpu,gpu和内存使用量。
  3. requestAnimationFrame也会像setTimeout一样有一个返回值ID用于取消,可以把它作为参数传入cancelAnimationFrame函数来取消requestAnimationFrame的回调

兼容处理

摘自HTML5 Canvas 核心技术

window.requestNextAnimationFrame = (function () {var originalWebkitRequestAnimationFrame = undefined,wrapper = undefined,callback = undefined,geckoVersion = 0,userAgent = navigator.userAgent,index = 0,self = this;// Workaround for Chrome 10 bug where Chrome// does not pass the time to the animation functionif (window.webkitRequestAnimationFrame) {// Define the wrapper
wrapper = function (time) {if (time === undefined) {time = +new Date();}self.callback(time);};// Make the switch
originalWebkitRequestAnimationFrame = window.webkitRequestAnimationFrame;window.webkitRequestAnimationFrame = function (callback, element) {self.callback = callback;// Browser calls the wrapper and wrapper calls the callback
originalWebkitRequestAnimationFrame(wrapper, element);}}// Workaround for Gecko 2.0, which has a bug in// mozRequestAnimationFrame() that restricts animations// to 30-40 fps.if (window.mozRequestAnimationFrame) {// Check the Gecko version. Gecko is used by browsers// other than Firefox. Gecko 2.0 corresponds to// Firefox 4.0.
index = userAgent.indexOf('rv:');if (userAgent.indexOf('Gecko') != -1) {geckoVersion = userAgent.substr(index + 3, 3);if (geckoVersion === '2.0') {// Forces the return statement to fall through// to the setTimeout() function.
window.mozRequestAnimationFrame = undefined;}}}return  window.requestAnimationFrame ||window.webkitRequestAnimationFrame ||window.mozRequestAnimationFrame ||window.oRequestAnimationFrame ||window.msRequestAnimationFrame ||function (callback, element) {var start,finish;window.setTimeout(function () {start = +new Date();callback(start);finish = +new Date();self.timeout = 1000 / 60 - (finish - start);}, self.timeout);};
}());window.cancelNextRequestAnimationFrame = window.cancelRequestAnimationFrame|| window.webkitCancelAnimationFrame|| window.webkitCancelRequestAnimationFrame|| window.mozCancelRequestAnimationFrame|| window.oCancelRequestAnimationFrame|| window.msCancelRequestAnimationFrame|| clearTimeout;

对比

通过requestAnimationFrame与setInterval同样的效果对比

一段动画采用setInterval与requestAnimationFrame,分别给出了webKit下调用刷新的次数

setInterval实现,调用了144次左右

requestAnimationFrame 实现调用了120次左右

通过对比,在同样的时间里,通过定时器刷新的次数是要更多,当然定时器跟设置的时间是有关系的

这里我要强调一点,有效值,就是我们在浏览器能接受的范围内,给出一个最佳的渲染时间,这样才是一个性能优化的最佳的选择

本文转自艾伦 Aaron博客园博客,原文链接:http://www.cnblogs.com/aaronjs/p/4283109.html,如需转载请自行联系原作者

动画requestAnimationFrame相关推荐

  1. js动画requestAnimationFrame详解

    看这篇文章之前我希望你会用setTimeout做简单的动画,也就是利用递归来代替setInterval做动画. requestAnimationFrame() 他的作用就是代替定时器做更加流畅高性能的 ...

  2. 高逼格的帧动画-requestAnimationFrame

    在Web应用中,实现动画效果的方法比较多,Javascript 中可以通过定时器 setTimeout 来实现,css3 可以使用 transition 和 animation 来实现,html5 中 ...

  3. react开发模式_通过开发带有精灵动画的游戏来学习高级React模式

    react开发模式 by Pavel Vlasov 通过帕维尔·弗拉索夫(Pavel Vlasov) 通过开发带有精灵动画的游戏来学习高级React模式 (Learn advanced React p ...

  4. vue商品列表滚动效果_vue+帧动画 实现 获奖奖品列表滚动循环展示

    实现效果 初级方法: 实现原理: 由于列表的总数是变化的,所以不能用css把动画写死,通过定时器移动列表,实现动画效果 计算总高度,建一个变量存储移动距离,两者之前比较,当移动距离>=总高度 就 ...

  5. html中canvas动画游戏显示,【Fes】基于canvas的前端动画/游戏入门(一)

    前言 本系列虽说是基础教程,但这是相对动画/游戏领域来说,在前端领域算是中级教程了,不适合前端小白或萌新.阅读前请确保自己对前端三大件(JavaScript+CSS+HTML)的基础已经十分熟悉,而且 ...

  6. three.js创建简单动画(vue中使用three.js59)

    简单动画 1.demo效果 2.知识要点 2.1 three.js动画分类 2.1.1基础动画 2.1.2移动相机 2.1.3变形和蒙皮 2.1.4加载外部动画 2.2 基础动画实现方式 2.2.1 ...

  7. canvas实现雨滴动画

    <!doctype html><!--声明文档类型:html--> <html lang="en"><head><!--头部- ...

  8. JavaScript绘制动画爱心

    东西内容比较多,不细述写,但很多代码里面都有对应注释供学习参考 ​ <!DOCTYPE html> <html> <head><meta http-equiv ...

  9. three相机在模型上_基于 three.js 的 3D 粒子动效实现

    作者:个推web前端开发工程师 梁神 一.背景 粒子特效是为模拟现实中的水.火.雾.气等效果由各种三维软件开发的制作模块,原理是将无数的单个粒子组合使其呈现出固定形态,借由控制器.脚本来控制其整体或单 ...

最新文章

  1. 解决crond引发大量sendmail、postdrop进程问题
  2. linux下文件无法删除不能编辑
  3. php怎么看回调的异步通知的数据_php app支付宝回调(异步通知)详解
  4. python多线程并行编程_Python并行编程(二):基于线程的并行
  5. 怎么让电脑不自动休眠_【平安惠阳提醒您】电脑应设置自动休眠 避免产生火灾隐患...
  6. Visual Studio 代码提示选不中
  7. vue实现搜索框搜索新增_基于Vue el-autocomplete 实现类似百度搜索框功能_含真_前端开发者...
  8. firefox 模拟手机
  9. 前端SSR的落地实践
  10. 深度系统官网linux安装打印机,在Deepin 20下安装brother打印机驱动及设置网络打印机...
  11. 2022考公务员难还是考研难?
  12. AI基础:图解Transformer
  13. stm32cube,hal库来实现PS2手柄数据发送
  14. PyCharm社区版安装教程和环境配置及使用
  15. 记一次软考高项【信息系统项目管理师】重点
  16. 华盛顿大学 计算机专业排名,圣路易斯华盛顿大学计算机专业世界排名好不好?...
  17. D53 LeetCode 587.安装栅栏(困难)
  18. 基于python开发pre-commit hook达到对git提交时间的控制
  19. Folding@Home 常见问题解答
  20. 平安又开始大面积裁员了,从外包蔓延到内勤!

热门文章

  1. 从农场女孩到首位图灵奖女性获得者,回顾法兰西斯·艾伦的辉煌一生
  2. win10系统上安装cmder并实现右键启动
  3. 基于MVC4+EasyUI的Web开发框架经验总结(8)--实现Office文档的预览
  4. MVC+Ninject+三层架构+代码生成 -- 总结(一、數據庫)
  5. C#代码像QQ的右下角消息框一样,无论现在用户的焦点在哪个窗口,消息框弹出后都不影响焦点的变化,那么有两种方法...
  6. Maven3.x 插件开发入门
  7. Spring 使用注解方式进行事务管理
  8. ExecutorService线程池
  9. NAnt学习笔记(2) -- 节点的含义解释
  10. C++ 虚函数表解析