最新版 Firefox 中 asm.js 性能改进让游戏飞起来!

上周发布的最新版 Firefox 包含用户界面和同步功能等方面的重大更新。此版本在 asm.js 性能方面也带来了显著的改进,正如我们将在下面看到的那样,这对游戏等方面非常重要。为了将 Firefox 性能的这一方面置于背景中,我们将看一下 Firefox 与其他浏览器的基准测试结果,结果显示 Firefox 在执行 asm.js 代码方面更快。

asm.js 加速

asm.js 是 JavaScript 的一个子集,非常容易优化,特别适用于将 C 或 C++ 代码移植到 Web。我们已经发布了博客文章,介绍了 Firefox 如何使用 32 位浮点运算优化 asm.js 代码,这些优化与其他所有优化 asm.js 的工作一起,使其运行速度约为将相同的 C/C++ 代码本地编译后运行速度的 1.5 倍慢。因此,虽然还没有达到本地速度,但已经非常接近了。在发布该博客文章时,这些优化只在 nightly 版本中可用,但现在它们已经到达了 Firefox 29 的数亿 Firefox 用户手中,而 Firefox 29 现在是 Firefox 的正式版本。

另一组重要的 asm.js 优化涉及 启动速度。正如 Luke 在几个月前发布的博客文章中所述,Firefox 执行预先编译 (AOT),并且可以缓存结果,从而显著提高启动速度。这些优化也已随 Firefox 29 发布到了用户手中。

Web 浏览器比较

现在所有这些优化都已经发布了,看看 asm.js 代码的最新浏览器比较很有意思。上图显示了 Emscripten 基准测试套件 在 Windows 8.1 上运行 Google Chrome、Internet Explorer 和 Firefox 的最新稳定版本的结果。在这里,所有结果中较小的数字都更好,这些结果是编译为 asm.js 的实际代码库(参见图表中的注释)。

Unity、Emscripten 和 asm.js

asm.js 是 JavaScript 的一个子集,因此它只是众多 JavaScript 风格中的一种。但它代表了一个重要的用例。正如我们在 GDC 上宣布的那样,我们宣布Unity(市场上最流行的游戏创作工具之一)将通过使用 Emscripten 将其引擎编译为 asm.js 来支持 Web

但是,视频不能替代实际情况!您可以现在在您的浏览器中尝试那里显示的游戏,包括 Unity 最近发布的Dead Trigger 2Angry Bots 演示。如果您在最新版本的 Firefox 中运行这些游戏,您将看到之前提到的许多 asm.js 优化在起作用。例如,如果您多次访问其中一个链接,那么 asm.js 缓存将允许它避免重新编译游戏(因此它启动得更快),而且游戏玩法也将由于更快的 asm.js 执行而更加流畅。

能够有效地执行 asm.js 风格的代码使得像这样的游戏能够在 Web 上良好运行,而无需专有的、非标准插件。这就是为什么看到更多 asm.js 优化在 Firefox 29 中到达 Firefox 用户手中令人兴奋的原因。虽然基准测试结果有时看起来只不过是抽象的数字,但 asm.js 基准测试的加速直接改善了游戏等方面,在这些方面,性能至关重要,而且非常明显。

(感谢 Marc Schifer 帮助进行基准测试测量。)

关于 Robert Nyman [名誉编辑]

Mozilla Hacks 的技术布道者和编辑。发表关于 HTML5、JavaScript 和开放 Web 的演讲和博客文章。Robert 是 HTML5 和开放 Web 的坚定支持者,自 1999 年以来一直在从事 Web 前端开发工作,足迹遍布瑞典和纽约市。他还定期在 http://robertnyman.com 上发布博客文章,喜欢旅行和结识新朋友。

更多由 Robert Nyman [名誉编辑] 编写的文章…


15 条评论

  1. JulienW

    在 Angry Bots 中,我的法语键盘 azqw 键无法正常使用来移动角色。此外,听起来左右声道被交换了(Firefox 30,Linux)。这是正在解决的问题吗?

    2014 年 5 月 5 日 下午 7:36

    1. Anthony Hughes

      Julien,我已经尝试重现你的键盘问题和音频问题,但没有成功。我需要你提供更多信息才能进一步处理。你可以在我的 Mozillians 个人资料中与我联系,ashughes@mozillians.org。

      2014 年 5 月 5 日 下午 4:05

      1. shavounet

        哦,我想这是常见的 AZERTY 键盘问题(想象一下用 Q 代替 A,Z 代替 W 玩游戏)。应该有一种方法可以映射按键… :-)

        2014 年 5 月 6 日 上午 8:44

        1. Aki

          如果你没有使用 *WERTY 键盘布局,情况就更糟了!

          浏览器游戏中的限制因素不再是 3D 加速,而是可自定义的键盘控制,这有点滑稽。 :-)

          2014 年 5 月 12 日 下午 5:30

  2. Wernfried Rheinmaier

    “为了将 Firefox 性能的这一方面置于背景中,我们将看一下 Firefox 与其他浏览器的基准测试结果,结果显示 Firefox 在执行 asm.js 代码方面更快。”
    所以 asm.js 的唯一实现是最快的?我想这太棒了吧?
    “1.5 倍慢”——这些表达总是让我感到困惑,我总是弄错。
    是本地二进制文件执行时间的 250% 还是 150%?听起来像是 250%,但我希望它不会那么慢?

    感谢您提供的其他很棒的更新!

    2014 年 5 月 5 日 上午 9:16

    1. Alon Zakai

      好吧,也许针对性的 asm.js 优化(包括类型检查)比更通用的优化做得更好并不令人意外。但这并不一定是真的,所以我认为值得测量。

      在代码执行时间(图表中以毫秒为单位测量)的背景下,1.5 倍慢字面意思是它运行了 1.5 倍长。所以如果一个浏览器花了 100 毫秒,而另一个花了 150 毫秒,那么第二个浏览器比第一个浏览器慢 1.5 倍。我同意这可能会让人困惑,也许我们应该将数字报告为本地速度的百分比(尽管这也会造成潜在的混淆)?

      2014 年 5 月 5 日 上午 10:11

      1. njn

        不不不!请避免在性能比较中使用百分比。加速/减速因子更容易理解。

        2014 年 5 月 6 日 上午 3:08

      2. Wernfried Rheinmaier

        感谢您的回复!
        我对“1.5 倍长”的理解问题可能是我英语到德语翻译错误
        如果 A 长 1 英尺,而 B 比 A 长 1 英尺,那么 B 就是 2 英尺(1 英尺等于 A 的长度加上 1 英尺的长度)。我对此非常确定。
        如果 B 比 A 长 1.5 倍,那么 B 的长度就是 1 英尺(等于 A 的长度)加上 B 长度的 1.5 倍,也就是 1.5 英尺(B 比 A 多出的长度),总计为 2.5 英尺。
        我被教导说,如果 B 的长度是 1.5 英尺,那么 B 比 A 长 1.5 倍。
        但老师也说,核聚变是物质分离的过程,尽管德语有一个词“Fusion”,意思是核聚变。
        无论如何,我并不要求使用百分比,而且我对“150% 长”也会有同样的问题。我在发表初始评论之前已经用谷歌搜索过,并找到了我已知的答案:两种解释都被使用,但没有一种是唯一的正确解释,或者两种都是有效的。而且我认为两种解释都无效是不可能的;)
        谢谢!

        2014 年 5 月 6 日 下午 5:38

  3. Ryan

    我简直不敢相信,我点击了一个链接,几秒钟内就开始在我的浏览器中玩一款看起来不错的 3D 游戏。这比从 Steam 下载游戏或在 Xbox 上玩游戏快多了。太棒了!

    2014 年 5 月 12 日 下午 4:29

  4. Dereck L.

    asm.js 是我见过的最愚蠢的东西。无论你想要用它做什么,向后兼容性在面对糟糕的性能时变得无关紧要。你最好使用 PNaCl。

    2014 年 5 月 12 日 下午 6:08

    1. Mike

      实际上,这在 asm.js 项目的 FAQ 中有解释。虽然它不是未来的发展方向,但它在目前所有现代浏览器中都能正常工作。像 PNaCl 这样的解决方案可能更快,但它们只在 Chromium 中运行。我们需要等待新的互联网应用程序平台出现,才能满足现代 Web 应用程序的所有需求。

      2014 年 5 月 12 日 下午 11:50

  5. gaby de wilde

    这个东西看起来很酷,但文档还有很多需要改进的地方。

    我并不激动。

    2014 年 5 月 12 日 下午 8:37

  6. Mike

    嗨,

    我想知道使用 asm.js 运行的 3D 物理引擎的性能如何?它足够好,可以用于像虚幻引擎这样的游戏吗?

    2014 年 5 月 12 日 下午 11:46

    1. Alon Zakai

      是的,虚幻引擎和 Unity 引擎都使用 3D 物理,它运行得足够快。这里有一个专门针对物理的演示:http://kripken.github.io/ammo.js/examples/new/ammo.html

      2014 年 5 月 13 日 上午 10:09

  7. Brian

    Angry Bots 在我的浏览器中失败,控制台中显示内存不足错误。浏览器中没有显示错误消息。

    我的电脑有 16GB 内存,FF 使用不到 1.8GB。

    我不确定 Angry Bots 需要多少内存,但这可以通过将 FF 制作成 64 位可执行文件来解决。

    2014 年 5 月 13 日 上午 8:02

本文评论已关闭。