【问题标题】:Why is asm.js project running faster in Chrome then FireFox?为什么 asm.js 项目在 Chrome 中运行比在 FireFox 中更快?
【发布时间】:2014-04-25 01:45:17
【问题描述】:

我使用 emscripten 为我的大学课程从 C/C++ 移植了一个游戏引擎项目到 JavaScript。 asm.js 优化标志已设置,我一直在测量性能。 但令人费解的是,Firefox 的性能很差。虽然该项目在 Chrome 和 Opera 中运行良好。鉴于 FireFox 是使用 asm.js 优化的浏览器,这对我来说没有意义。

这个项目是一个使用 SDL 和 WebGL 的速降激流回旋赛车游戏。在我的笔记本电脑上的 Firefox 中运行分析器显示演示完全受 CPU 约束,瓶颈出现在 _SDL_LockSurface() 和 _TTF_RenderText_Solid() 周围。这些用于呈现动态文本等。

然而,在 Chrome 中,CPU 在同一系统上的大部分时间都是空闲的。 Opera 中的表现也差不多。 这是否意味着 asm.js 优化不起作用? Firefox 报告 asm.js 代码已成功编译。那么为什么这种优化会适得其反并导致执行最多只有一半的帧速率呢? 我已经使用 FF 版本 28 进行了测试,也是当前的夜间版本。可以在这里找到演示, http://www.susurrus.mars-station.com/page7.php?lang=en

【问题讨论】:

  • 可能相关。没有把握。 stackoverflow.com/questions/17951449/…
  • 也是如此。这个问题的最佳答案是从 ams.js 调用 js 函数是有成本的,反之亦然。在我的情况下,我没有看到任何迹象.. 虽然无论哪种方式我都想要一个更明确的答案。
  • 是的,我真的不认为这是重复的。只是一点额外的信息。我在 Chrome 中获得了三倍以上的帧速率。我想我记得听说他们基本上已经尝试针对 ASM 进行优化,但不需要声明性,因此可能只是优化得更好。不过不确定。
  • SDL_LockSurface() 和 TTF_RenderText_Solid 都是图形调用,不是吗?所以很可能是它的图形位很慢,而不是 asm.js 位....
  • 是的,它们是图形调用。但这些都可以在同一系统上运行,但在 Chrome 下运行。

标签: javascript c++ performance webgl asm.js


【解决方案1】:

这个问题我想了很久,或许可以给你一个答案。简单地说,摆脱canvas.getContext('2d')。我猜 asm.js 根本不是你的问题。

正如@BorisZbarsky 所说,这些是与 asm.js 无关的图形调用。你回答说这些运行没有困难。我自己测试了它,并且在 getContext 之后可以进行很多事情,因为 2D 是繁重的图形操作,你真的不能在实时 fps 下做。

那里有一个简单的例子:http://jsfiddle.net/windkiller/8r3gP/ 这是非常简单的动画,但它占用了我 60% 的 CPU。

【讨论】:

  • 这是一个 webgl 应用程序,因此在这种情况下 GPU 和 CPU 都在使用。也许我没有说清楚。 asm.js 函数使用了大约 80% 的 CPU,这在 Firefox 中已达到极限。因此,整整 23% 的 CPU 时间都花在了 SDL_Locksurface 上。对于在 Chrome 中运行的完全相同的程序,这些函数不会出现在 CPU 跟踪中。我不明白你的意思是摆脱 getContext。
猜你喜欢
  • 2013-07-12
  • 1970-01-01
  • 2017-02-03
  • 1970-01-01
  • 1970-01-01
  • 2015-10-01
  • 1970-01-01
  • 2020-10-03
相关资源
最近更新 更多