问题 三和ASMjs


我最近开始对ASM进行一些调查,我在网上玩了一些演示。我必须说Unreal演示非常令人印象深刻......我现在已经开发了一个使用Three的应用程序了很多个月。它在快速机器上运行得很漂亮,但在低端机器上却很容易挣扎。当我在低端机器上运行虚幻演示时,演示就像一场梦。我的问题是,ASM与Three有什么关系 - 它可以大大加快发动机的速度吗?在调查或开发利用两者并基于浏览器在它们之间切换的解决方案时是否值得?还有什么计划让Three在将来利用它?

我来自C ++背景,并且对开发某些东西的前景非常感兴趣。但与此同时,它意味着必须重新学习语言,甚至更多的问题可能是将它带到可用点所花费的大量时间。

你怎么看?


7251
2017-08-25 09:57


起源



答案:


这是我的意见:

首先,asm.js并不是真正意图手工编写的。尽管如此我还是可以写它,因为它有一个验证器。虚幻的演示是用emscripten编译成asm.js的东西。它也不需要与编译后的代码之外的其他代码进行交互。所以它生成高度优化的代码,因为虚幻的演示已经是C ++中高度优化的代码,它由编译器优化,然后通过asm.js进行另一次优化运行。

其次,asm.js实际上只有firefox支持。尽管所有其他浏览器都可以执行它,但在大多数情况下它仍然会导致性能下降。如果您比较与普通javascript代码相同的asm.js代码,则会受到惩罚。只是搜索 jsperf.com 举例来说。

好的,这是关于asm.js的一些一般指导方针。现在让我们谈谈Three.js。

首先,因为THREE.js必须与用户代码交互,所以编写asm.js库并不容易,因为它有很多限制(没有对象)。

其次,对于asm.js强大的计算,Three.js在性能方面不会获得太多的性能。但是从浏览器的未来更新中获得更多。 (例如,在chrome中创建typedarrays现在很快就会成为THREE.js的痛点。 V8问题

第三,asm.js中的代码需要管理自己的内存。这意味着THREE.js必须找到一种方法来使大型应用程序在有限的内存中工作。或者让每个应用程序都非常耗费内存。

第四,将虚幻演示与three.js进行比较有点不公平,因为three.js试图允许每个人编写3D应用程序,而虚幻引擎是3D游戏的高度优化引擎。

正如你所注意到的,我主要是反对三个.js中的asm.js。但是,这就是说现在最好的方法是现在还为时过早。 asm.js很可能最终会在three.js中获得一个位置,但更多的是仅限于渲染器 - 例如。但就目前而言,围绕asm.js仍有太多未解决的问题。

但是如果你想使用asm.js并使用C ++,那么我建议 emscripten 用于构建虚幻演示。

这当然是我的意见。但我认为这有点代表@ Mr.doob和@WestLangley的想法。对于长篇文章感到抱歉。


14
2017-08-26 08:28



谢谢Gero3,这正是我想要的。你已经确认了很多我的想法和希望。我对铬有点困惑。当我在v22中测试时,虚幻的演示打破了整个浏览器,但在金丝雀中它起作用了。我用谷歌搜索是否被包括在内并听到提及它 - 所以我认为它被添加了。但是再看一遍,我发现它没有得到支持。我也完全接受了Unreal v Three的观点。三个确实是一个很棒的图书馆,我只是想看看ASM上有什么想法,还有三个使用虚幻演示作为我的谈话要点。再次感谢! - Mat


答案:


这是我的意见:

首先,asm.js并不是真正意图手工编写的。尽管如此我还是可以写它,因为它有一个验证器。虚幻的演示是用emscripten编译成asm.js的东西。它也不需要与编译后的代码之外的其他代码进行交互。所以它生成高度优化的代码,因为虚幻的演示已经是C ++中高度优化的代码,它由编译器优化,然后通过asm.js进行另一次优化运行。

其次,asm.js实际上只有firefox支持。尽管所有其他浏览器都可以执行它,但在大多数情况下它仍然会导致性能下降。如果您比较与普通javascript代码相同的asm.js代码,则会受到惩罚。只是搜索 jsperf.com 举例来说。

好的,这是关于asm.js的一些一般指导方针。现在让我们谈谈Three.js。

首先,因为THREE.js必须与用户代码交互,所以编写asm.js库并不容易,因为它有很多限制(没有对象)。

其次,对于asm.js强大的计算,Three.js在性能方面不会获得太多的性能。但是从浏览器的未来更新中获得更多。 (例如,在chrome中创建typedarrays现在很快就会成为THREE.js的痛点。 V8问题

第三,asm.js中的代码需要管理自己的内存。这意味着THREE.js必须找到一种方法来使大型应用程序在有限的内存中工作。或者让每个应用程序都非常耗费内存。

第四,将虚幻演示与three.js进行比较有点不公平,因为three.js试图允许每个人编写3D应用程序,而虚幻引擎是3D游戏的高度优化引擎。

正如你所注意到的,我主要是反对三个.js中的asm.js。但是,这就是说现在最好的方法是现在还为时过早。 asm.js很可能最终会在three.js中获得一个位置,但更多的是仅限于渲染器 - 例如。但就目前而言,围绕asm.js仍有太多未解决的问题。

但是如果你想使用asm.js并使用C ++,那么我建议 emscripten 用于构建虚幻演示。

这当然是我的意见。但我认为这有点代表@ Mr.doob和@WestLangley的想法。对于长篇文章感到抱歉。


14
2017-08-26 08:28



谢谢Gero3,这正是我想要的。你已经确认了很多我的想法和希望。我对铬有点困惑。当我在v22中测试时,虚幻的演示打破了整个浏览器,但在金丝雀中它起作用了。我用谷歌搜索是否被包括在内并听到提及它 - 所以我认为它被添加了。但是再看一遍,我发现它没有得到支持。我也完全接受了Unreal v Three的观点。三个确实是一个很棒的图书馆,我只是想看看ASM上有什么想法,还有三个使用虚幻演示作为我的谈话要点。再次感谢! - Mat


最好的方法是在C中编写一个小的演示(手工编写)然后编译成asm.js然后运行它,然后在JS中用Three.js编写相同的小演示(手动),然后运行它,并比较开发人员体验和性能的差异。


0
2018-04-06 18:01