RequestAnimationFrame 用于多个画布

Posted

技术标签:

【中文标题】RequestAnimationFrame 用于多个画布【英文标题】:RequestAnimationFrame for multiple canvases 【发布时间】:2011-09-08 23:19:25 【问题描述】:

我有一个包含分层 <canvas> 元素的页面,如答案 here 中所述。画布共同组成了一个动画,因此每个画布都被清除并根据需要重新绘制。

现在我正在尝试使用cross browser shim 合并requestAnimationFrame。但我真的不知道requestAnimationFrame 在幕后做什么。

可以让它在每个循环中更新多个画布吗?每个画布都应该有自己的循环吗?答案取决于浏览器吗?

【问题讨论】:

【参考方案1】:

使用这种格式的 js 文件中的画布,以便多个画布的 RequestAnimationFrame 将起作用

(function() ... )();

【讨论】:

您能否为您的答案添加解释?为什么使用您提供的代码有效?问题是什么?【参考方案2】:

使用requestAnimationFrame 只是让浏览器控制页面上何时发生重排/重绘。

最好在一个回调中更改所有画布,这样浏览器就可以一次重绘它们。

This explanation of requestAnimationFrame was pretty helpful

【讨论】:

【参考方案3】:

在单个 requestAnimationFrame 中更新所有画布是完全可以的。

如果画布彼此独立并出现在页面的不同部分,那么您可能希望使用单独的requestAnimationFrame 处理程序,将canvas 元素作为第二个参数传递。这样,只有当前可见的画布会得到更新。 (不过,将元素作为第二个参数传递是特定于 WebKit 的。)

requestAnimationFrame 所做的是告诉浏览器您想要更新页面的外观。当页面或元素接下来要重绘时,浏览器会调用回调。当页面/元素可见时就会发生这种情况,而且频率永远不会超过屏幕刷新率。

【讨论】:

【参考方案4】:

如果 shim 不可用,shim 只会退回到计时器。

你应该没事的。在同一个循环中更新所有这些。

requestAnimFrame 没有“绑定”到画布或任何东西,只是您传递给它的函数。因此,您可以将它与三个画布或零个画布一起使用。

【讨论】:

以上是关于RequestAnimationFrame 用于多个画布的主要内容,如果未能解决你的问题,请参考以下文章

深入理解requestAnimationFrame

requestAnimationFrame 使用小记

requestAnimationFrame、cancelAnimationFrame用法

RequestAnimationFrame 用于多个画布

requestAnimationFrame定时器

浏览器原理 37 # 任务调度:有了setTimeOut,为什么还要使用 requestAnimationFrame?