Flash制作动画,最基础的概念就是帧,但在Flash中,帧频的控制比较简单,只需要编译前指定一下目标帧频就可以了。

实际运行时,不需要我们关心定时器的问题,flash player会定时触发EnterFrame消息,推动Movieclip播放。

在js这一侧,需要我们设定一个定时器,并推动相应的绘制逻辑执行。

最简单:

var FPS = 60;setInterval(draw, 1000/FPS);

这个简单做法,如果draw带有大量逻辑计算,导致计算时间超过帧等待时间时,将会出现丢帧。除外,如果FPS太高,超过了当时浏览器的重绘频率,将会造成计算浪费,例如浏览器实际才重绘2帧,但却计算了3帧,那么有1帧的计算就浪费了。

成熟做法:

引入requestAnimationFrame,这个方法是用来在页面重绘之前,通知浏览器调用一个指定的函数,以满足开发者操作动画的需求。

这个函数类似setTimeout,只调用一次。

function draw() { requestAnimationFrame(draw); // ... Code for Drawing the Frame ...
}

递归调用,就可以实现定时器。

但是,这样完全跟浏览器帧频同步了,无法自定义动画的帧频,是无法满足需求的。

接下来需要考虑如何控制帧频。

简单做法:

var fps = 30;
function tick() {setTimeout(function() {requestAnimationFrame(tick);draw(); // ... Code for Drawing the Frame ...}, 1000 / fps);
}
tick();

这种做法,比较直观的可以发现,每一次setTimeout执行的时候,都还要再等到下一个requestAnimationFrame事件到达,累积下去会造成动画变慢。

自行控制时间跨度:

var fps = 30;
var now;
var then = Date.now();
var interval = 1000/fps;
var delta;function tick() {requestAnimationFrame(tick);now = Date.now();delta = now - then;if (delta > interval) {// 这里不能简单then=now,否则还会出现上边简单做法的细微时间差问题。例如fps=10,每帧100ms,而现在每16ms(60fps)执行一次draw。16*7=112>100,需要7次才实际绘制一次。这个情况下,实际10帧需要112*10=1120ms>1000ms才绘制完成。then = now - (delta % interval);draw(); // ... Code for Drawing the Frame ...}
}
tick();

针对低版本浏览器再优化:

如果浏览器没有requestAnimationFrame函数,实际底层还只能用setTimeout模拟,上边做的都是无用功。那么可以再改进一下。

var fps = 30;
var now;
var then = Date.now();
var interval = 1000/fps;
var delta;
window.requestAnimationFrame = window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || window.msRequestAnimationFrame;function tick() {if(window.requestAnimationFrame){requestAnimationFrame(tick);now = Date.now();delta = now - then;if (delta > interval) {// 这里不能简单then=now,否则还会出现上边简单做法的细微时间差问题。例如fps=10,每帧100ms,而现在每16ms(60fps)执行一次draw。16*7=112>100,需要7次才实际绘制一次。这个情况下,实际10帧需要112*10=1120ms>1000ms才绘制完成。    then = now - (delta % interval);draw(); // ... Code for Drawing the Frame ...   }}else{setTimeout(tick, interval);    draw();}
}
tick();


最后,还可以加上暂停。

var fps = 30;
var pause = false;
var now;
var then = Date.now();
var interval = 1000/fps;
var delta;
window.requestAnimationFrame = window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || window.msRequestAnimationFrame;function tick() {if(pause)return;if(window.requestAnimationFrame){...}else{...}
}
tick();

指定FPS帧频,requestAnimationFrame播放动画相关推荐

  1. JS:指定FPS帧频,requestAnimationFrame播放动画

    Flash制作动画,最基础的概念就是帧,但在Flash中,帧频的控制比较简单,只需要编译前指定一下目标帧频就可以了. 实际运行时,不需要我们关心定时器的问题,flash player会定时触发Ente ...

  2. cocosBuilder播放动画

    Working with Animations 动画 You can use CocosBuilder for creating character animations, animating com ...

  3. Android PowerImageView实现,可以播放动画的强大ImageView

    本文转载自:http://blog.csdn.net/guolin_blog/article/details/11100315 转载请注明出处:http://blog.csdn.net/guolin_ ...

  4. Android 入门第九讲01-音频(本地音乐播放,暂停,继续播放,获取播放时间,快进到指定位置,变速播放,播放data/data/目录下的音频文件,播放网络歌曲)

    Android 入门第九讲01-音频(本地音乐播放,暂停,继续播放,获取播放时间,快进到指定位置,变速播放,播放data/data/目录下的音频文件,播放网络歌曲) 准备 1.储存在raw文件夹 2. ...

  5. CSS 帧动画 播放动画

    CSS3 帧动画 amimation @keyframes 在 CSS3 出现之前,动画都是通过 JavaScript 动态的改变元素的样式属性来完成了,这种方式虽然能够实现动画,但是在性能上存在一些 ...

  6. [UWP]使用离散式关键帧播放动画

    这篇文章介绍离散式关键帧,并使用它做些有趣的动画. 1. 什么是离散式关键帧 以DoubleAnimationUsingKeyFrames为例,它支持四种Double的关键帧,其中EasingDoub ...

  7. 【游戏开发】定时器循环播放动画

    //Windows窗口头文件 #include <windows.h>//swprintf_s函数包含的头文件 #include <tchar.h>//PlaySound函数包 ...

  8. 让任务管理器播放动画

    一.源起 原先在B站上看到各式各样拿Windows任务管理器播放动画的视频,感觉很新奇,也有人无私分享代码.有些视频中的动画是后期加上的,也有些是实时渲染的.不管怎样,像实时渲染这类程序就非常&quo ...

  9. android 自定义view 动画效果,Android自定义view----音乐播放动画

    先给大家看一下效果,因为我也不知道这个东西具体叫什么,标题上面写的是"音乐播放动画",可能描述的不太准确. 效果图.gif 前言 最近项目中做了一个音频播放的功能,播放条上需要一个 ...

最新文章

  1. sqlplus column命令用法
  2. java定时扫描_springmvc 定时扫描
  3. LeetCode 简要日记 455 104
  4. wdcp 去掉index.php,Nginx环境下Oneindex去除网址内的“?”
  5. k短路-洛谷P2483 [SDOI2010]魔法猪学院
  6. P3512 [POI2010]PIL-Pilots
  7. Bristol的第6篇密码学
  8. cacti linux io,【cacti】Linux磁盘I/O监控
  9. DBImport v3.0 中文版发布:支持各大数据库数据互导(IT人员必备工具)
  10. 读书会 | 第一季读书会《蛤蟆先生去看心理医生》完美收官啦
  11. Android大话设计模式 第一章----针对接口编程---问世间情为何物 直教人生死相许
  12. 软件项目管理六要素分别是什么?
  13. uniapp获取手机状态栏和头部导航栏高度(可用于制作头部自定义导航栏)
  14. 孩子学习arduino好还是单片机好
  15. LeetCode Daily challenge - Course Schedule
  16. JVM探秘:垃圾收集器
  17. matlab实现大气湍流退化模型算法,matlab与图像处理
  18. python 全栈开发,Day91(Vue实例的生命周期,组件间通信之中央事件总线bus,Vue Router,vue-cli 工具)...
  19. 数理统计——参数估计的无偏性、有效性以及一致性(相合性)
  20. python yaml dump_使用Python处理yaml格式的数据简单到爆!

热门文章

  1. 弘辽科技:如何将新品打造成爆款?选对方法,教你轻松打造爆款
  2. 51、基于51单片机的GPS定位系统(GSM短信)
  3. Java == equals() hashCoed()的区别
  4. Https丢包分析及底层原理解析
  5. jz2440恢复出厂设置
  6. 北邮在线计算机,北邮在线圆我IT梦
  7. 《精进:如何成为一个很厉害的人》读书笔记(转载)
  8. 家庭教育之学生不愿做家务怎么办?
  9. Google Play邮件提示: 您必须声明您的广告 AD_ID 权限
  10. oracle安装时创建应答文件,12c 应答方式安装 (二) 创建cdb+pdb+netca