标签: webassembly

WebAssembly 数据部分中的任意字节

我在 WebAssembly 中看到的数据部分的每个示例都使用字符串,即

(data (i32.const 16) "Hello World")
Run Code Online (Sandbox Code Playgroud)

如何将这些部分与二进制数据一起使用?我怎样才能做相当于...的事情

(data (i32.const 16) 0x00 0x01 0x02 0x03)
Run Code Online (Sandbox Code Playgroud)

我必须使用吗i32.store

webassembly

2
推荐指数
1
解决办法
1408
查看次数

Rust - 将事件侦听器添加到 WebAssembly 游戏中

我正在尝试在网络程序集中创建一个游戏。我选择用 Rust 来准备它并使用 Cargo-Web 进行编译。我设法获得了一个有效的游戏循环,但由于 Rust 借用机制,我在添加 MouseDownEvent 侦听器时遇到了问题。我非常喜欢编写“安全”代码(不使用“不安全”关键字)

此时,游戏只需将红色框从 (0,0) 移动到 (700,500),速度取决于距离。我希望下一步使用用户单击更新目的地。

这是游戏的简化且有效的代码。

静态/index.html

<!DOCTYPE html>
<html lang="en">

<head>
    <title>The Game!</title>
</head>

<body>
    <canvas id="canvas" width="600" height="600">
    <script src="game.js"></script>
</body>

</html>
Run Code Online (Sandbox Code Playgroud)

src/main.rs

mod game;

use game::Game;

use stdweb::console;
use stdweb::traits::*;
use stdweb::unstable::TryInto;
use stdweb::web::document;
use stdweb::web::CanvasRenderingContext2d;
use stdweb::web::html_element::CanvasElement;

use stdweb::web::event::MouseDownEvent;

fn main()
{
    let canvas: CanvasElement = document()
        .query_selector("#canvas")
        .unwrap()
        .unwrap()
        .try_into()
        .unwrap();

    canvas.set_width(800u32);
    canvas.set_height(600u32);


    let context = canvas.get_context().unwrap();

    let game: Game = Game::new();

    // canvas.add_event_listener(|event: MouseDownEvent|
    // { …
Run Code Online (Sandbox Code Playgroud)

events game-loop rust webassembly

2
推荐指数
1
解决办法
3620
查看次数

在 Wasm 发生恐慌后,如何触发 Rust Mutex 的释放,以便将来的调用正常?

我在使用 Rust 和 WebAssembly 进行开发时遇到了僵局。

由于使用了一些全局访问的变量,我选择了lazy_static一个Mutex(使用thread_local回调会导致嵌套问题)。我已经声明 JavaScript 通过#[wasm_bindgen]. 他们读取和写入lazy_static变量。

其中一个函数发生恐慌后,互斥锁将无法释放,从而导致其他函数在需要使用相同互斥量时发生恐慌。

我知道恐慌问题是意外的并且需要修复,但是这些功能彼此相对独立。虽然变量的读写lazy_static有交叉,但某个bug不一定会影响其他部分。

如何在 Wasm 发生恐慌后触发释放Mutex以允许其他调用正常?对于此类问题有没有更好的做法呢?

锈:

use std::sync::Mutex;
use std::sync::PoisonError;
use wasm_bindgen::prelude::*;

pub struct CurrentStatus {
    pub index: i32,
}

impl CurrentStatus {
    fn new() -> Self {
        CurrentStatus { index: 1 }
    }
    fn get_index(&mut self) -> i32 {
        self.index += 1;
        self.index.clone()
    }

    fn add_index(&mut self) {
        self.index += 2;
    }
}

lazy_static! {
    pub static ref …
Run Code Online (Sandbox Code Playgroud)

rust webassembly

2
推荐指数
1
解决办法
1717
查看次数

有没有办法在浏览器中本地运行 C 程序?

是的,有一个重复的问题,但是是5年前问的,很久没有更新了。

2020年,随着WebAssembly的发展,有没有办法在浏览器本地编译运行一个简单的C程序?

有一个叫WasmFiddle的平台,可以在浏览器中将C编译成wasm,但是缺少标准库的支持,比如stdio.h。我认为我们可以在 js 中实现标准库,也许可以将其导出到 wasm?但这需要大量的工作。

我最初的目标是构建一个基于 Web 的 IDE,供学生学习 C 编程,而无需花费大量成本在服务器上进行远程运行。因此,只需要像 stdio.h、math.h、string.h 这样的库。

更新:似乎是 libc 到 wasm 的一个很好的实现。

不需要高性能,因此基于 wasm 的解决方案和在 JS 中实现的运行 c 的 VM 都是很好的解决方案。

javascript c web webassembly

2
推荐指数
1
解决办法
859
查看次数

LinkError: WebAssembly.instantiate(): Import #1 module="go" function="runtime.resetMemoryDataView" 错误:函数导入需要一个可调用的

在构建 Web 程序集应用程序时,我遇到了一个神秘错误的问题:

LinkError: WebAssembly.instantiate(): Import #1 module="go" function="runtime.resetMemoryDataView" 错误:函数导入需要一个可调用的

它是用这个命令编译的:

GOOS=js GOARCH=wasm go build -o main.wasm main.go server.go

这是 index.html 的正文,里面什么都没有

<body class="is-preload">
    <script src="wasm_exec.js"></script>
    <script>
    wasm_filename = "main.wasm";    
    function message(s){
        document.getElementById("message").textContent = s;
    }

    function load_wasm(){
        if (!WebAssembly.instantiateStreaming) { // polyfill
            WebAssembly.instantiateStreaming = async (resp, importObject) => {
                const source = await (await resp).arrayBuffer();
                return await WebAssembly.instantiate(source, importObject);
            };
        }

        const go = new Go();

        WebAssembly.instantiateStreaming(fetch(wasm_filename), go.importObject)
        .then(results => { go.run(results.instance); })
        .catch((err) => {
            message("Error Loading WebAssembly …
Run Code Online (Sandbox Code Playgroud)

go webassembly

2
推荐指数
1
解决办法
1224
查看次数

如何在 Blazor WebAssembly 应用程序启动时初始化变量?

在 UWP 中,我会在启动时以编程方式初始化显示变量,以便初始显示是我想要的,例如,基于一年中的某一天的值。我无法破解在其他工作的 Blazor WebAssembly 应用程序中复制此内容的位置。我目前设置了默认值并要求用户单击一个按钮,该按钮会计算并更新为我想要显示的值,然后继续。

我本以为有一个标准的、简单的方法可以做到这一点,但考虑到 Blazor 片段是如何动态构建的以便呈现为网页,也许不是?谢谢!

initialization startup webassembly blazor

2
推荐指数
1
解决办法
9524
查看次数

C++ 类中的成功回调 Emscripten FETCH API

我正在使用 WebAssembly 并尝试从 C++ 发出 HTTPS 请求。我看过Emscripten FETCH API的解决方案并尝试使用它。

为了测试它,我创建了一个Test类,在其中发送如下请求:

void Test::sendRequest() {
    emscripten_fetch_attr_t attr;
    emscripten_fetch_attr_init(&attr);
    strcpy(attr.requestMethod, "GET");
    attr.attributes = EMSCRIPTEN_FETCH_LOAD_TO_MEMORY;
    attr.onsuccess = &Test::onSuccess;
    attr.onerror = &Test::onError;
    emscripten_fetch(&attr, "http://127.0.0.1:5000/");
}
Run Code Online (Sandbox Code Playgroud)

我的 onSuccess 回调如下所示:

void Test::onSuccess(struct emscripten_fetch_t *fetch) {
    printf("Finished downloading %llu bytes from URL %s.\n", fetch->numBytes, fetch->url);
    setText(QString::fromUtf8(fetch->data));
    emscripten_fetch_close(fetch); // Free data associated with the fetch.
}
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试编译时出现错误:

error: assigning to 'void (*)(struct emscripten_fetch_t *)' from incompatible type 'void
  (Test::*)(struct emscripten_fetch_t *)'
attr.onsuccess = &Test::onSuccess;
                 ^~~~~~~~~~~~~~~~ …
Run Code Online (Sandbox Code Playgroud)

c++ emscripten webassembly fetch-api

2
推荐指数
1
解决办法
1506
查看次数

如何从 Blazor WebAssembly 中的目录读取文件

我目前正在开发 .NET Standard 2.1 Blazor WebAssembly 应用程序。我尝试从 wwwroot 目录读取文件路径

Blazor WebAssembly 应用程序不是 Asp.NET Core 托管的。

在此输入图像描述

我尝试从我的Main方法中读取所有以 .js 结尾的文件路径Program.cs,如下所示:

var filePaths = ReadWwwRootJSFilePaths();
private static string[] ReadWwwRootJSFilePaths()
        {
            Console.WriteLine("CurrentDirectory: " + Directory.GetCurrentDirectory());
            var dir = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "js");
            Console.WriteLine("dir: " + dir);
            var files = Directory.GetFiles(dir);
            foreach (string file in files)
            {
                Console.WriteLine("file: " + file);
            }
            return files;
        }
Run Code Online (Sandbox Code Playgroud)

当我运行此命令时,我只在浏览器中收到一条错误消息:System.IO.DirectoryNotFoundException

在此输入图像描述

你知道如何解决这个问题吗?您知道如何从wwwrootBlazor WASm(非 ASP.NET Core 托管)应用程序中的目录读取文件路径吗?

也许我还不太了解 Blazor WebAssembly(不是 ASP.NET Core 托管)的概念。实际上可以使用 …

c# file webassembly asp.net-core blazor

2
推荐指数
1
解决办法
2万
查看次数

chrono 杀死了我的 Rust WebAssembly 函数

程序员对 Rust 非常满意,所以我想尝试一下。我有一个 Hello World WebAssembly,我尝试添加一些代码来显示时间。

以下行似乎终止了该函数,但它什么都不返回(无文本,无错误)

让 dt = Utc::now();

如果我注释掉该行,该函数会像以前一样运行并返回一个字符串

这是否发生在其他人身上?程序员如此喜欢的语言会以如此令人讨厌的方式行事,这对我来说似乎很奇怪。

我的 rs 文件顶部有以下 2 行:extern crate chrono; 使用 chrono::{Duration, Utc};

我在 toml 文件 chrono = "0.4" 的依赖项中有以下内容

rust c++-chrono webassembly

2
推荐指数
1
解决办法
310
查看次数

Emscripten 和 Clang 在 WebAssembly 编译方面有什么区别

我知道 clang(通过使用 target=wasm32)和 emscripten 都可以将 C 代码编译成 webassembly,但它们有什么不同?

看起来他们都使用 LLVM 作为后端。其实,我什至不太明白 llvm 和 clang 之间的关系......

我已经阅读了一段时间的 WebAssembly,但我对它缺乏低级理解。非常感谢您的参与!!

llvm clang emscripten webassembly wasi

2
推荐指数
1
解决办法
500
查看次数