实现Animating使用requestAnimationFrame,尽量不用setInterval,setTimeout

requestAnimationFrame(基于脚本的动画的控制),最初是在某html5教程里看到的,是用来代替setInterval(),setTimeout()进行绘制动画更平滑更高效的方法。

requestAnimationFrame 方法可以解决丢失帧的问题,因为它使应用能够在浏览器需要更新页面显示时(而且仅在这种情况下)获得通知。 因此,应用可与浏览器的绘制时间间隔保持完全一致,并且仅使用适量的资源。从 setTimeout 切换到 requestAnimationFrame 非常容易,因为它们都规划单个回调。要实现持续的动画,请在调用动画函数后再次调用 requestAnimationFrame。

此方法的普通JS实现如下:

 1 // handle multiple browsers for requestAnimationFrame()
 2 window.requestAFrame = (function () {
 3     return window.requestAnimationFrame ||
 4             window.webkitRequestAnimationFrame ||
 5             window.mozRequestAnimationFrame ||
 6             window.oRequestAnimationFrame ||
 7             // if all else fails, use setTimeout
 8             function (callback) {
 9                 return window.setTimeout(callback, 1000 / 60); // shoot for 60 fps
10             };
11 })();
12
13 // handle multiple browsers for cancelAnimationFrame()
14 window.cancelAFrame = (function () {
15     return window.cancelAnimationFrame ||
16             window.webkitCancelAnimationFrame ||
17             window.mozCancelAnimationFrame ||
18             window.oCancelAnimationFrame ||
19             function (id) {
20                 window.clearTimeout(id);
21             };
22 })();

使用此方法,为了得到更好的效果,可以配合window.performance.now()来获取当前时间,它是一个DOMHighResTimeStamp,是从页面导航开始时测量的高精确度时间,以毫秒为单位,精确到千分之一毫秒。此时间值不直接与 Date.now() 进行比较,后者测量自 1970 年 1 月 1 日至今以毫秒为单位的时间。将时间值从 DOMTimeStamp 更改为 DOMHighResTimeStamp 是 W3C 针对基于脚本动画计时控制规范的最新编辑草案中的最新更改。

参考:

https://msdn.microsoft.com/zh-cn/library/ie/hh920765(v=vs.85).aspx

https://msdn.microsoft.com/zh-cn/library/ie/hh973355(v=vs.85).aspx

https://msdn.microsoft.com/zh-cn/library/ie/hh773174(v=vs.85).aspx

http://www.paulirish.com/2011/requestanimationframe-for-smart-animating/

http://hacks.mozilla.org/2010/08/more-efficient-javascript-animations-with-mozrequestanimationframe/

时间: 2024-10-17 19:03:08

实现Animating使用requestAnimationFrame,尽量不用setInterval,setTimeout的相关文章

setInterval setTimeout 详解

JavaScript的setTimeout与setInterval是两个很容易欺骗别人感情的方法,因为我们开始常常以为调用了就会按既定的方式执行, 我想不少人都深有同感, 例如 setTimeout( function(){ alert('你好!'); } , 0); setInterval( callbackFunction , 100); 认为setTimeout中的问候方法会立即被执行,因为这并不是凭空而说,而是JavaScript API文档明确定义第二个参数意义为隔多少毫秒后,回调方法

requestAnimationFrame与setInterval,setTimeout

自打学习canvas动画以来,都说requestAnimationFrame好,就一直用,也没觉得有什么太过于特殊的地方,直到刚才,在写完前面的"小球碰撞墙壁----干掉误差"之后,,突然想去看看如果这里改回setInterval,会是个什么样,差距究竟有多大? 结果....一看吓一跳,差距太大了,说难听点,setInterval...简直像屎一样 具体结果,只需要将前面那篇里面的gamleLoop方法和该方法前面的那句gameLoop()  替换成下面的代码,一看就知道了. func

Javascript 的定时器 setInterval,setTimeout,clearInterval

今天开通博客.来1个.哇哈哈哈~~ 今天本来想复习BOM的看到定时器也算DOM一种 ?(是这样吗).分享一下 参考源于:八神吻你 http://www.cnblogs.com/lmfeng/archive/2011/06/24/2089237.html 单次定时器即执行 1 //单次定时器即执行 2 3 setInterval(console.log(1),1000); //执行1次 4 5 //------------------------------------ 6 7 var a = f

js计时器方法 setInterval(),setTimeout()

window.setInterval() 周期性地调用一个函数(function)或者执行一段代码. 1 var intervalID = window.setInterval(func, delay[, param1, param2, ...]); 2 var intervalID = window.setInterval(code, delay); //不推荐 window.clearInterval() 取消掉用setInterval设置的重复执行动作. 1 window.clearInt

setInterval setTimeout clearInterval

setTimeout() 只执行 code 一次.如果要多次调用,请使用 setInterval() 或者让 code 自身再次调用 setTimeout(). //第一次load的时候就先刷新一次 setTimeout( function() { $.get('<%= sdn_topo_vnets_url%>', function( data ) { $( "#time_div" ).replaceWith( data ); var max_len = 0; var mi

as3 setInterval,setTimeOut,Timer及获取系统时间

1. setInterval 1 //setInterval:设置函数每隔多久会执行一次,除非remove,否则会一直执行下去. 2 //setInterval(函数名,延迟时间,参数); eg: 3 package{ 4 import flash.display .Sprite; 5 import flash.utils .*; 6 7 public class as3test02 extends Sprite{ 8 9 public function as3test02(){ 10 var

setInterval(),setTimeout(),location.reload(true)

1,setInterval() setInterval()方法可以按照指定的周期来调用函数或表达式,他会不停地调用函数,直到调用clearInterval()方法或窗口关闭.由setInterval()返回的ID值,可用作clearInterval()的参数. 语法: var id = setInterval(code,millisec); clearInterval(id); 实例: 1 <html> 2 <body> 3 4 <input type="text&

js动画之requestAnimationFrame回调函数代替setTimeout

继续完善我上一篇博客:https://www.cnblogs.com/duanhuarong/p/12195466.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <style> * {margin: 0;padding: 0;} #div1 {wi

javascript线程解释(setTimeout,setInterval你不知道的事)

原文:http://www.iamued.com/qianduan/1645.html 今天看到这篇文章,学到了不少东西 特此发出来 和大家分享 JavaScript的setTimeout与setInterval是两个很容易欺骗别人感情的方法,因为我们开始常常以为调用了就会按既定的方式执行, 我想不少人都深有同感, 例如 setTimeout( function(){ alert('你好!'); } , 0); setInterval( callbackFunction , 100); 认为se