【问题标题】:Can JavaScript execute functions on a running WebAssembly instance?JavaScript 可以在正在运行的 WebAssembly 实例上执行函数吗?
【发布时间】:2019-11-11 22:11:07
【问题描述】:

我是一名刚入门的 WebAssembly 新手,但我有一个问题似乎无法找到合理的答案。我对如何设计这个软件有一个想法,但我不知道我是否问错了 WebAssembly。

外部 JavaScript 调用会中断 WebAssembly 吗?假设我正在为一些可视化运行一个游戏循环,并且我想要一个绑定到 JavaScript 的 HTML 按钮来更改当前正在执行的 WebAssembly 上下文中的一些值。那可能吗?在每帧之间更新值并仅使用 WebAssembly 进行每帧渲染会更理想吗?

问题是,我真的很喜欢 WebAssembly 在 C++ 等其他语言中的可定位性,因为我永远无法真正接触到 JavaScript 或 Typescript,而且我还希望构建一个性能更高的游戏类型应用程序。然而,由于我本来打算把它做成一个网页游戏,所以我想看看我是否可以将 HTML + CSS 用于我的 UI 元素,而不是将 UI 复制到 WebAssembly 中,本质上把它变成一个糟糕的罐装 Java 小程序。

【问题讨论】:

    标签: javascript html webassembly


    【解决方案1】:

    是和不是。简短的回答是浏览器不能中断长时间运行的 WebAssembly 代码。

    但是,如果您有任何类型的长时间运行的代码,浏览器也不能中断长时间运行的 JS 代码或传递任何事件。 WebAssembly 和 JS 在同一个执行堆栈上执行,在 Web 模型中,您需要以合理的间隔返回事件循环。这里推荐的方法(对于 JS 和 WebAssembly 代码)是打破你的游戏循环并让它在回调中一次运行一帧。

    (有一些方法可以解决这个问题,例如使用 worker 运行长时间运行的代码或编译器技巧,例如 binaryen 的 asynchify 来分解长时间运行的代码)。

    【讨论】:

    • 很高兴知道。冻结浏览器不是我考虑过的。 JavaScript 模型天生就是同步的,这对我来说似乎很奇怪。我认为我真正的答案是找到实际上是线程化的 Web Worker,虽然它们仍然依赖于事件循环,但我可以将我的 WebAssembly 执行与我的 UI 元素分开,并允许它们彼此完全异步(包括传输帧回到画布)。
    • @gajbooks 当然,如果您的 wasm 在工作人员中运行,它不会导致任何冻结,但它仍然遵循工作人员事件循环 afaik。没有办法中断脚本(当然终止除外),您可以尝试的最好的方法是轮询一些共享内存。此外,您可能想在exceptions propsal 上厕所。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-07
    • 2012-05-18
    • 1970-01-01
    • 2011-11-27
    • 2019-06-05
    相关资源
    最近更新 更多