基于 Webassembly 的一些问题

2024-03-11 16:44:30 +08:00
 seanwhy
最近在迁移公司 C/S 架构程序( C++、三维软件),想往浏览器端迁移,目前正在施行的方案是用 emscripten 编译的 webassembly 模块。
公司程序用了大量的三方库比如:gdal 、ffmpeg 、opengles ,三方库又依赖了大量其他的库,比如 gdal 依赖了 geos 、proj 、curl 、libtiff 、sqlite3 等。因此编译采用的是静态链接,即所有.a 最终生成的是一个.wasm 文件。
我这里基本用了最新的版本,以防对 webassembly 缺乏支持。
那么问题来了:
问题 1:基于如此巨量的三方库以及自有实现代码,这个 wasm 文件会很巨大(百兆体量),浏览器能加载的出来吗,或者此种体量是否规范?
问题 2:据说 webassembly 使用内存上限有限制,大概 4GB ,有方法能突破限制吗?我司程序就是个吃内存的家伙
问题 3:如此多的三方库,是要一个个验证能否在浏览器上运行测试用例吗?还是说只要经过 emscripten 编译过,就基本认定在浏览器端运行基本没有问题?
问题 4:性能衰减问题,大概是多少体量,自我感觉能效不高,怕迁移完毕卡成狗。
4338 次点击
所在节点    程序员
52 条回复
Beginner1
2024-03-11 17:47:14 +08:00
我司跟 3D 上 web 和他们一样,目前感觉也还好。不过我们主要使用 vtk ,代码确实进行了大量整改,就速度来说其实还好。可能我们功能没有他们那么复杂。当然 Ai 这些只有上云了。
seanwhy
2024-03-11 17:49:22 +08:00
@cat 说白了浏览器端二次开发者多,客户端二次开发式微了
seanwhy
2024-03-11 17:50:52 +08:00
@icyalala 这么严重么?看资料是原生的 1/3~2/3
gam2046
2024-03-11 18:02:17 +08:00
@seanwhy #20 一般情况下,纯计算能力,wasm 效率能到 native 的 50%都够呛。毕竟 wasm 还是一个虚拟机,还得交给浏览器解释执行。而且现阶段 wasm 对于 pthread 的支持还是有点磕磕绊绊,很多开源项目的 wasm ,我看他们的处理方式是直接改成单线程保平安。
tool2d
2024-03-11 18:04:40 +08:00
@seanwhy "那么用 emsctipten 编译出来,是否就意味着无需验证,也能运行于浏览器?"

验证很简单,写个单元测试跑一下就行了。

把对 wasm 的内心期望减半,再减半,就比较符合浏览器里运行的真实情况。
kaiserzhang123
2024-03-11 18:11:38 +08:00
内存 4GB 的原因是因为编译到 wasm32 位的操作,最大就支持 4gb 内存,想要突破就只能使用 wasm64 位
kaiserzhang123
2024-03-11 18:13:52 +08:00
@nieyujiang 编译到 wasm64 位就没有 4gb 内存的限制
icyalala
2024-03-11 18:31:24 +08:00
@seanwhy https://00f.net/2023/01/04/webassembly-benchmark-2023/ 这有个通用计算的测试接近你的资料,平均下降到 43%,但是这是最快的 wasm 实现的结果。实际浏览器可能会再慢一些。

https://ffmpegwasm.netlify.app/docs/performance/ 这有个 Chrome+ffmpeg.wasm 的性能测试,平均下降到 8%,差了一个量级。
guanzhangzhang
2024-03-11 18:34:37 +08:00
大佬,xorg-x11-server 和 openresty 有静态编译姿势吗
Jirajine
2024-03-11 18:35:30 +08:00
就算能跑,你觉得 serve 一个 100m 的 wasm 文件给浏览器合适吗?

能编译到 wasm 的代码,可以认为就是可以运行的。但代码可以运行,不代表代码链接/调用的 API 也被支持。所以代码可以重用,其他都得重写。
br_wang
2024-03-11 19:03:42 +08:00
提到 wasm ,我也有个问题:一个使用了 wasm 的网页,如果被 iframe 嵌入到另一个网页,还能正常访问到 wasm 文件并顺利运行么?
rabbbit
2024-03-11 19:17:07 +08:00
churchill
2024-03-11 19:19:37 +08:00
emscripten 文档上大量篇幅是讲 porting 和 optimizing webgl, 可见坑不少,祝楼主好运
可能不是很恰当的例子,有些图形库说是支持 emscripten 编译,可是桌面上是调的 opengl4.6 ,用 emscripten 编译就使用 emscripten 自带的 gl 头文件了,如果你的 shader 不是针对 es 300 写的运行起来就挂了
rabbbit
2024-03-11 19:20:57 +08:00
image72
2024-03-11 19:40:59 +08:00
我觉得你想把这些搬到浏览器运行之前,可以先考虑发几个版本的 electron 编译版试试水,能移植的移植,能改写的改写,再考虑浏览器。electron 也是完整浏览器,也能支持内置 wasm 以及原生
从底层原生一步跨到纯浏览器 wasm, 步子太大,容易扯到蛋
opengg
2024-03-11 22:22:25 +08:00
成功的项目基本没有全程 wasm 的,线上大多数都是 web 界面加部分重逻辑重计算部分走 wasm 调用。
当然也有类似的尝试,但我还没见过 full wasm 的商业产品。
sunzhuo
2024-03-11 23:00:02 +08:00
@br_wang 没问题
sunzhuo
2024-03-11 23:01:52 +08:00
我建议用 threejs 重现桌面版的 api ,然后再考虑 wasm 移植一些 c 功能。
mahaoqu
2024-03-12 00:01:35 +08:00
@gam2046 改单线程不用 Webworker 遇到计算密集型不会卡死 UI 么
mahaoqu
2024-03-12 00:07:56 +08:00
如果你引用的所有库都能直接源码级跨 Win/Linux 两个系统,那大概率直接用 emscripten 编译到 WebAssembly 是能用的。比如去年谷歌那边就说 SQLite 用浏览器的 OPFS 后端跑通了,但这样的库还是太少。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1022609

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX