大家好,本文讨论了Web 3D是否需要WebAssembly,结论是:

对于使用原生3D技术的程序员,需要;

对于使用Javascript语言的前端程序员,不需要,有其它方法可以达到接近WebAssdembly的性能。

WebAssembly是什么?

WebAssembly简称wasm,是一种数据格式,对应的文件后缀名为.wasm,文件由字节码组成;

而Javascript对应的文件后缀名为.js,文件由字符串组成。

两者都可以在浏览器上直接运行。

一份典型的.wasm 文件如下所示(引用自恕我直言,90% 的应用场景都不需要用WebAssembly!):

00000000: 0061 736d 0100 0000 0108 0260 017f 0060  .asm.......`...`
00000010: 0000 0215 0203 656e 7603 6d65 6d02 0001 ......env.mem...
00000020: 026a 7303 6c6f 6700 0003 0201 0107 0b01 .js.log.........
00000030: 0765 7861 6d70 6c65 0001 0a23 0121 0041 .example...#.!.A
00000040: 0042 c8ca b1e3 f68d c8ab ef00 3703 0041 .B..........7..A
00000050: 0841 f2d8 918b 0236 0200 4100 1000 0b .A.....6..A....

可以通过Emscripten等编译器,将原生语言(如C++等)编译为wasm程序。

比较wasm与js

优点

对于使用Javascript语言的前端程序员,wasm的优点为:

  • 体积更小

    白鹭引擎团队测试过:

将大约300k左右(压缩后)JavaScript逻辑改用WebAssembly重写后,体积仅有90k左右。虽然使用WebAssembly需要引入一个50-100k的JavaScript类库作为基础设施,但是总体来看资源尺寸的优势还是很大的。

  • 执行性能高(但是通过JIT优化,js程序的执行性能接近wasm)

    wasm属于AOT: Ahead-of-Time compilation,即在执行前,通过编译生成浏览器能够直接执行的、优化过的字节码,这样浏览器在执行它时不需要进行编译,性能高。

    但是,因为chrome浏览器的v8引擎支持JIT: Just-in-Time compilation,所以js程序的执行性能接近wasm(对于Web 3D程序,性能热点的逻辑会在主循环中多次被执行。而v8会在多次执行后,确定热点代码,会将其优化为字节码;然后从下次执行开始,直接执行字节码)

    要提高js代码在JIT中的性能,需要保证类型的健壮性,如不要轻易改变变量的类型

    因为js是弱类型和动态语言,直接写js代码很容易造成类型混乱,降低JIT的性能,所以我们应该使用编译为js的强类型语言(如Reason语言),通过编译检查来保证类型的健壮性。
  • 更加安全

    因为wasm文件是字节码,无法直接阅读,所以增加了安全性。

缺点

对于使用Javascript语言的前端程序员,wasm的缺点为:

  • 需要熟悉C++等原生语言

    因为wasm是由原生语言编译而来,所以需要程序员学习原生语言,增加了学习成本

  • 不能直接操作原生图形API(如OpenGL),只能通过js调用WebGL

    所以与其在wasm中调用webgl,还不如直接用js来调用webgl,这样更方便,性能应该也差不多

    参考资料

    How to use WebGL shaders in WebAssembly

When compiling, emscripten will map our code to the WebGL API.

WebAssembly 的出现是否会取代 JavaScript? - doodlewind的回答 - 知乎

调 OpenGL 都要走回 JS 到 WebGL

  • 增加了维护成本

    我们通常用这种方案来应用wasm:一部分逻辑用wasm实现,负责需要高性能的密集计算;另一部分逻辑用js实现,负责dom操作和webgl调用。

    这样就需要同时维护wasm和js代码,增加了成本。

结论

对于使用原生3D技术(如基于C++语言和DirectX、OpenGL等原生图形API)的程序员

可以用wasm技术,将3D程序编译为wasm文件,从而原生3D应用搬到浏览器上运行

对于使用Javascript语言的前端程序员

不需要用wasm技术,而是通过下面的方法来获得接近wasm的性能:

1、使用强类型语言(如Reason)编译为js。这样可提高js代码在JIT中的性能

2、把需要高性能的计算逻辑,放到worker线程中进行计算;或者使用WebGPU的compute shader,将其从CPU端移到GPU端进行计算,大幅提升性能。

关于WebGPU,可以参考 WebGPU学习

参考资料

恕我直言,90% 的应用场景都不需要用WebAssembly!

如何评论浏览器最新的 WebAssembly 字节码技术? - 罗志宇的回答 - 知乎

WebAssembly在白鹭引擎5.0中的实践

Web 3D是否需要WebAssembly?的更多相关文章

  1. 基于HT for Web 3D呈现Box2DJS物理引擎

    上篇我们基于HT for Web呈现了A* Search Algorithm的3D寻路效果,这篇我们将采用HT for Web 3D来呈现Box2DJS物理引擎的碰撞效果,同上篇其实Box2DJS只是 ...

  2. 无插件纯web 3D机房 (第四季:大型园区、地球仪效果和其他扩展应用)

    前言 初次见面的朋友们大家好,这篇文章是"无插件纯web 3D机房"系列的第四季,感兴趣的朋友可从头开始观看,以下是正确的阅读顺序: 无插件纯web 3D机房(第一季:从零开始搭建 ...

  3. ArcGIS Portal 10.4 本地坐标系的web 3d地形展示制作说明

    原文:ArcGIS Portal 10.4 本地坐标系的web 3d地形展示制作说明 ArcGIS Portal 10.4 本地坐标系的web 3d地形展示制作说明 By 李远祥 ArcGIS Por ...

  4. [转CSDN多篇文章]WEB 3D SVG CAD 矢量 几种实现方案

    WEB 3D SVG CAD 矢量 几种实现方案 原创 2014年10月24日 08:34:11 标签: WEB3D / CADSVG / 矢量 2665 一.全部自己开发,从底层开始 VML+SVG ...

  5. 实践 ArcGIS Web 3D

    ArcGIS 产品家族的 Web 3D 功能众多用户期待已久.从 ArcGIS 10.3.1 版本号開始,Esri 放了个大招,千呼万唤始出来的 Web 3D 功能,最终不再犹抱琵琶半遮面了. 那究竟 ...

  6. Impress.js上手 - 抛开PPT、制作Web 3D幻灯片放映

    前言: 如果你已经厌倦了使用PPT设置路径.设置时间.设置动画方式来制作动画特效.那么Impress.js将是你一个非常好的选择. 用它制作的PPT将更加直观.效果也是嗷嗷美观的. 当然,如果用它来装 ...

  7. 透过HT for Web 3D看动画Easing函数本质

    http://www.hightopo.com/guide/guide/plugin/form/examples/example_easing.html 50年前的这个月诞生了BASIC这门计算机语言 ...

  8. 基于HT for Web 3D技术快速搭建设备面板

    以真实设备为模型,搭建出设备面板,并实时获取设备运行参数,显示在设备面板上,这相比于纯数值的设备监控系统显得更加生动直观.今天我们就在HT for Web的3D技术上完成设备面板的搭建. 我们今天模拟 ...

  9. HT for Web 3D游戏设计设计--汉诺塔(Towers of Hanoi)

    在这里我们将构造一个基于HT for Web的HTML5+JavaScript来实现汉诺塔游戏. 汉诺塔的游戏规则及递归算法分析请参考http://en.wikipedia.org/wiki/Towe ...

随机推荐

  1. C++ 第四次作业 继承

    继承 继承时从新的类从已有类那里得到新的特征.继承实现了代码的重用,极大地减少了代码量,同时通过新增成员,加入了自身的独有特性,达到了程序的扩充. 派生类继承了基类的全部数据类和除了构造函数.析构函数 ...

  2. SuperSocket证书节点新增配置属性 "storeLocation"

    你可以指定你想要加载的证书的存储地点: <certificate storeName="My" storeLocation="LocalMachine" ...

  3. SVN中如何执行clean up

    在要清理的文件夹上点右键,菜单:TortoiseSVN--选择cleanup,会出现一个菜单栏,在你菜单栏有一个属性breaklock意思是打破锁定,你勾选打破锁定,然后cleanup就会成功,之后再 ...

  4. SVN提示update更新成功,但是本地文件却没有更新

    问题描述:将仓库的最新版本代码check out到本地后,然后最某个文件做了修改,保存后想通过svn的update来重新得到最新的版本,发现失效. 原因:经过多方查找原因,主要看了以下两篇文档 htt ...

  5. SourceYard 制作源代码包

    本文带大家走进SourceYard开发之旅 在项目开发中,将一个大的项目拆为多个小项目解耦,减少模块之间的耦合.因为如果将代码放在一起,即使有团队的约束,但只要能写出的代码就会有小伙伴写出,很快就发现 ...

  6. SpringMVC 非注解配置

    web.xml配置: <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>o ...

  7. thinter图形开发界面

    tkinter编程步骤 导入Tkinter 创建控件 import thinter 创建主窗口 #win = tkinter.Tk() 设置标题 win.title("xiaoxin&quo ...

  8. ASP.NET MVC4.0+EF+LINQ+bui+bootstrap+网站+角色权限管理系统(3)

    接下来完成用户.角色的增删查改,以及用户角色.权限的设置 对用户表.角色表做了一些扩展如下[可以更加自己需要增减字段] 相应的M_UserProfile.cs.M_Roles.cs进行扩展 using ...

  9. dotnet 获取指定进程的输入命令行

    本文告诉大家如何在 dotnet 获取指定的进程的命令行参数 很多的程序在启动的时候都需要传入参数,那么如何拿到这些程序传入的参数? 我找到两个方法,一个需要引用 C++ 库支持 x86 和 x64 ...

  10. STM32 命名方法

    1.STM32型号的说明:以STM32F103RBT6这个型号的芯片为例,该型号的组成为7个部分,其命名规则如下: STM32  ST公司生产的Cortex-M内核的32位微控制器 F F代表产品类型 ...