我正在web assembly.org上运行该教程,现在我想hello.wasm从我自己的页面运行该教程。我正在按照教程的说明使用Emscripten编译代码。
按照我正在做的这些说明进行操作:index.html
const instantiate = (bytes, imports = {}) =>
WebAssembly.compile(bytes).then(m =>
new WebAssembly.Instance(m, imports)
)
fetch('hello.wasm')
.then(response => response.arrayBuffer())
.then(bytes => instantiate(bytes, {}))
Run Code Online (Sandbox Code Playgroud)
但我收到这个错误:
所以我尝试使用MDN 文档WebAssembly.instantiate()中的以下代码:
const instantiate = (bytes, imports = {}) =>
WebAssembly.compile(bytes).then(m =>
WebAssembly.instantiate(m, imports)
)
Run Code Online (Sandbox Code Playgroud)
我得到了一个不同的:
知道如何修复它吗?
当我调用 WebAssembly 模块实例的导出函数时,Javascript 和 WebAssembly 如何交互?
instance = WebAssembly.instantiate(bytes)
result = instance.exports.myFunction()
Run Code Online (Sandbox Code Playgroud)
如果 .wasm 实例进入无限循环会发生什么?控制权最终会被转移回调用它的 JavaScript 函数吗?
<input type="file">具体来说, Go中如何连接这个函数呢?我知道有“syscall/js”包,但我没有找到任何文件读取的示例。
func parseCSVFile(filePath string) []LabelWithFeatures {
fileContent, _ := ioutil.ReadFile(filePath)
lines := bytes.Split(fileContent, newline)
numRows := len(lines)
labelsWithFeatures := make([]LabelWithFeatures, numRows-2)
for i, line := range lines {
// skip headers
if i == 0 || i == numRows-1 {
continue
}
labelsWithFeatures[i-1] = NewLabelWithFeatures(bytes.Split(line, comma))
}
return labelsWithFeatures
}
Run Code Online (Sandbox Code Playgroud) 几年没有使用 Emscripten 后,我最近发现它现在支持将多线程 C++ 代码编译为 WebAssembly。我已经编写了简单的合并排序代码,可以对 1000 万个浮点进行排序(本机代码可以轻松地对更多浮点进行排序,但浏览器似乎将您限制为 1GB 内存):
https://github.com/bsergeev/MtMergeSort
令人惊讶的是,虽然这段代码编译为 WebAssembly 并在 Chrome 中运行,但由于使用了多个线程,浏览器中的排序速度变得越来越慢(而单线程性能,正如预期的那样,是本机性能的 1.5...2 倍:本机代码1.80 秒,WebAssembly 3.1...3.3 秒,JavaScript 4.69 秒):
多线程性能下降是否是由于浏览器限制 WebWorkers 造成的?那么 WebAssembly 中的多线程有什么意义呢?
我有 fin 的 C# 代码。计算,我想在浏览器中运行它。我研究了 Blazor,但我能找到的所有示例都集中在 ASP.NET 上,而我想下载 .dll 或 .wasm 文件并从我现有的 Web 应用程序(用 Typescript 编写)执行它。我正在寻找这样的例子。
由于 Microsoft 表示 Blazor WebAssembly 是 .Net Core 3.1 的预览版(请参阅该页面),这是否意味着 Blazor Web Assembly 中的 Mono 被 .Net Core 3.1 取代?
我正在寻找一个 API,它可以让我一次读取通过(或允许从浏览器访问用户文件的任何其他方法)块提供的文件。我正在读取大文件,所以我不想将整个文件加载到内存中。
我的用例是,我正在使用用 emcc 编译的 ffmpeg 库,但我不想用它来处理多媒体文件。我可以实现自己的 AVIOContext,但要做到这一点,我需要相当于 C 函数 fread 和 fseek。
我正在查看具有 WORKERFS 文件系统类型的 FS API,但我不清楚是否可以使用 DOM 中的文件对象从工作线程挂载它。
我是 Rust 和 WebAssembly 的初学者。我试图找到一种方法来canvas考虑性能的元素。
为了canvas利用 Rust 和 WebAssembly,我通常会找到一些示例,其中他们将使用浏览器的CanvasRenderingContext2D界面并在其上绘制将从 WASM 接收的数据
const canvasContext = canvasElement.getContext("2d");
const canvasImageData = canvasContext.createImageData(width, height);
const imageDataArray = getWasmImageDataArray()
canvasImageData.data.set(imageDataArray);
canvasContext.clearRect(0, 0, width, height);
canvasContext.putImageData(canvasImageData, 0, 0);
Run Code Online (Sandbox Code Playgroud)
来源:https : //wasmbyexample.dev/examples/reading-and-writing-graphics/reading-and-writing-graphics.rust.en-us.html
有一些变体,他们将canvasAPI绑定到 Rust 并在 Rust / WebAssembly 中执行操作,但尽管如此,他们总是使用CanvasRenderingContext2DAPI 在画布上绘制。
这当然意味着 Rust / WebAssembly 会通过浏览器的canvasAPI往返到画布显示缓冲区,这意味着性能下降。
我想知道是否还有另一种方法:是否可以将画布显示的像素的缓冲区直接绑定到 Rust 并直接操作该缓冲区以更改画布显示的内容?有点像这样(伪代码)
Rust 伪代码:
// Makes whole canvas black
drawOnCanvasDisplayBuffer(displayBuffer) {
for(i = 0; i < displayBuffer.width; i++) …Run Code Online (Sandbox Code Playgroud) Program.MainBlazor WASM 应用程序中的方法具有string[] args参数。ASP.NET Core 主机站点是否可以将参数传递给这些?在构建应用程序之前,我需要能够从服务器读取值。
我尝试了 Blazor Webassembly。我在 Visual Studio 中创建了一个新的 Blazor Webassembly 项目。这为我们提供了一个基本的示例项目,其中包含可以通过单击增加的计数器,获取一些数据的页面,......
当我在最新版本的 Firefox 中运行它时,它运行良好。
但后来我想:当我在不支持 Webassembly 的旧版 Firefox 中运行它时会发生什么?例如 2017 年的 Firefox 50。
它只是显示了这一点。它不加载。没有其他事情发生:
查看 WebConsole 我发现了这个:
因此,Blazor Webassembly 应用程序知道它无法在该浏览器中运行,但不会告诉访问者。我们是否有一种简单的方法可以告诉用户问题是什么(也许指定一个替代的 HTML 文件)而不是撒谎说某些东西是“正在加载...”?
webassembly ×10
blazor ×4
javascript ×3
emscripten ×2
browser ×1
c# ×1
c++ ×1
canvas ×1
dll ×1
file-io ×1
go ×1
rust ×1