【问题标题】:Efficiency of Javascript Animation, clearRect()?Javascript动画的效率,clearRect()?
【发布时间】:2013-12-08 00:02:57
【问题描述】:

为了准备 Flash 的衰落,我正在尝试在 AS3 和 Javascript 之间进行转换。

但是,有些事情让我感到困惑(可能是由于缺乏知识)。在 Flash 中,我可以创建并显式修改我在舞台上绘制的对象的物理属性。在 Canvas/HTML5 中,我可以使用 fillText()fillRect(),但我不能“动画”而不必先清除整个舞台然后重绘所有内容,这让我觉得效率很低。除此之外,我没有对这些对象的显式访问权限,因此我可以修改它们的物理属性,而不必首先删除所有内容。

我应该如何以不同的方式处理这个问题?

【问题讨论】:

  • which strikes me as really inefficient 实际上,Flash 也以这种方式绘制图像,每次都清除屏幕。
  • 您可以使用KinecticJS 或其他类似的框架,让您更轻松地在canvas 上绘制和制作动画。

标签: javascript html canvas


【解决方案1】:

在您看到动画的所有位图中,必须清除或覆盖位图,包括 Flash。

不同之处在于,Flash 会为您处理,而在画布上您必须自己处理它,或者使用诸如 Kinect 之类的库来平滑从 Flash 到 HTML5 Canvas 的过渡。

至于效率,clearRect() 是清除画布效率第二高的东西。一种更快的方法(至少在某些浏览器中)是设置canvas.width = canvas.width;。但我不会推荐它,原因有两个:

  1. 这很“骇人听闻”。
  2. 并非所有浏览器都这样运行(Safari 是我最后一次检查的浏览器)。

您可以使用drawImage() 而不是clearRect(),只要不发生缩放,它也很快。当然,这仅在您打算用图像(甚至是离屏画布)填充背景时才有用。

还有fillRect(),它并不真正用于此用途,并且是其中最慢的。

将此与requestAnimationFrame 结合起来,您将在此上下文中获得最有效的组合。话虽这么说:Canvas 的瓶颈实际上是 JavaScript 本身,所以我建议在这方面增加努力以提高代码效率。有许多仅使用画布的令人印象深刻的演示。

【讨论】:

    猜你喜欢
    • 2011-12-25
    • 2014-02-01
    • 1970-01-01
    • 2017-10-13
    • 2020-08-09
    • 1970-01-01
    • 2018-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多