我正在使用Paul Irish的以下代码段:
// requestAnimationFrame shim & fallback
window.requestAnimFrame = (function () {
return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || function (callback) {
window.setTimeout(callback, 1000 / 60);
};
})();
我也看到了polyfill,但是我尚未在所有浏览器中测试过此填充程序,因此我不确定是否需要polyfill。也许我不会,节省文件大小。
我想知道我是否真的需要在某个地方调用
cancelAnimationFrame
,如果可以,我想我需要另一个垫片。类似于上面的内容:// cancelAnimationFrame shim & fallback
window.cancelAnimFrame = (function () {
return window.cancelAnimationFrame || window.webkitCancelAnimationFrame || window.mozCancelAnimationFrame || function (callback) {
window.clearTimeout(callback);
};
})();
基本上我尝试
console.log
在requestAnimationFrame
中运行的功能,并且可以看到停止记录的时间,因此我猜不再使用动画帧...我的函数
step()
像这样结束:if (progress == 1) return;
requestAnimFrame(step);
我真的很在乎这一点,但我仍然在整体上学习动画。
为我创建动画非常痛苦,尤其是使用缓动方程式时。直接回答就可以了,如果需要取消,请给我一个例子。现在,我相信cancelAnimationFrame仅用于手动取消或某些复杂的动画。好吧,这只是我的想法,我不确定。
最佳答案
cancelAnimationFrame
用于从动画功能之外停止动画。在您的step()
示例中,您将从动画函数内部停止动画。两者都是可行的,但内部止损可能更常见。
您想使用cancelAnimationFrame
的主要原因是,如果您不想进行动画循环计算何时应该停止动画。如果您有多个情况可以停止动画,则将条件设置为true时,检查动画循环中的每个情况实际上比调用cancelAnimationFrame
效果差。
例如,假设您想在progress == 1
时停止动画,但在用户暂停游戏时progress
只能设置为1。由于用户不会经常暂停游戏,因此实际上您是在浪费时钟周期来查看每帧变量(即使只有几毫秒)。如果还必须检查用户是否死亡(progress == 2
)或跳至主菜单(progress == 3
),那么您将检查3 if语句每帧。由于您已经具有在动画循环之外检查这些条件的代码,因此在代码运行时调用cancelAnimationFrame
可以帮助动画更快地运行。