标签: webassembly

生锈,WebAssembly和传递参数以增加总内存

我有一个生锈的项目,我正在编写webasm每http://asquera.de/blog/2017-04-10/the-path-to-rust-on-the-web/

项目编译.当我在Chrome Canary中运行它时,内存不足并给我一个非常有用的错误消息:

abort("Cannot enlarge memory arrays. Either (1) compile with  -s 
TOTAL_MEMORY=X  with X higher than the current value 16777216, (2) compile 
with  -s ALLOW_MEMORY_GROWTH=1  which allows increasing the size at runtime, 
...
Run Code Online (Sandbox Code Playgroud)

问题是,它不清楚如何将这些标志传递给rustc /构建工具链.

既未设置EMMAKEN_CFLAGS,也未设置以下工作:

cargo  rustc -v --target=wasm32-unknown-emscripten --release -- -Clink-args="-s TOTAL_MEMORY=33554432" 
Run Code Online (Sandbox Code Playgroud)

rust asm.js webassembly

7
推荐指数
1
解决办法
521
查看次数

如何在Web Worker中使用WebAssembly(wasm)代码?

目前,Web Worker被实例化:

let worker = new Worker('worker.js');
Run Code Online (Sandbox Code Playgroud)

然后浏览器提取worker.js并开始响应消息.

我想使用WebAssembly实现我的worker的功能.理想情况下,我想做这样的事情:

let worker = new Worker('worker.wasm');
Run Code Online (Sandbox Code Playgroud)

但我很确定这是不可能的.最明显的替代方法是worker.js获取worker.wasm并编译并运行它.但这意味着我们获取一个脚本(worker.js),其唯一的工作是获取并运行另一个脚本(worker.wasm).这对我来说很难受.所以我的问题是:在Web Worker中使用WebAssembly是否有更简洁的方法,这不会引入额外的提取步骤?

javascript web-worker webassembly

7
推荐指数
1
解决办法
3480
查看次数

如何使用Create-React-App的节点服务器定义MIME类型?

我试图解决这个问题WebAssembly注:"注意:要使用运行instantiateStreamingcompileStreaming,你需要你的Web服务器来服务.wasm文件与application/wasmMIME类型https的箱子,可以用来为从本地主机文件,包括应用程序/ WASM. MIME类型开箱即用."

实际上,我在JS控制台中遇到MIME错误.谷歌搜索显示没有办法配置它.Mozilla建议在depAsated WebAssembly.instantiate上实例化.如果使用stdweb或bindgen,后者对我也不起作用:它需要第二个参数,我不知道如何提供.

node.js webassembly create-react-app

7
推荐指数
1
解决办法
650
查看次数

使用 WebAssembly 在 Canvas 上绘制一系列图像是否更快?

我想问使用 WebAssembly/WASM 将一系列图像绘制到画布中是否更快、更节省内存?

我之所以这么问,是因为我已经测试过在主 UI 和网络工作人员中绘制一系列图像(动画)。对于少数画布(1-5 个画布),性能是可以忍受的,但是对于更多画布(如 20-25),场景会有点不同,渲染变得慢动作。

这是主 UI 中的代码:

const videoDecoder = new Worker("videoDecoder.js");
const canvas = document.querySelector("#canvas");
const offscreen = canvas.transferControlToOffscreen();
videoDecoder.postMessage({ action: 'init', canvas: offscreen }, [offscreen] );
Run Code Online (Sandbox Code Playgroud)

这是我的网络工作者:

onmessage = async function (e) {
    const blob = e.data;
    blob.arrayBuffer().then(arrayBuffer => {
        const uint8Array = new Uint8Array(arrayBuffer);
        for(;;;) {
           const offsetIdx = ...;
           const endIdx = ...;
           const jpegArray = uint8Array.slice(offsetIdx, endIdx);
           const blob = new Blob([jpegArray], {type: "image/jpeg"});
           drawImage(blob);
        }
    } …
Run Code Online (Sandbox Code Playgroud)

html javascript html5-canvas emscripten webassembly

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

如何从 web-sys 访问 HTMLDocument?

使用web-sys crate,我想HTMLDocument.

我想做这样的事情。确实这行不通。

let window = web_sys::window().unwrap();
let document = window.document().unwrap();
let cookie = document.cookie().unwrap();
//no method named `cookie` found for type `web_sys::features::gen_Document::Document` in the current scope
Run Code Online (Sandbox Code Playgroud)

我需要访问HTMLDocument结构而不是Document结构。

Cargo.toml 已启用功能。

~snip~
[dependencies.web-sys]
version = "0.3.4"
features = [
  "WebSocket",
  'Window',
  'Document',
  'HtmlDocument',
]
Run Code Online (Sandbox Code Playgroud)

根据API,它应该可以在以下位置访问Window,例如Document.

它似乎不适用于以下内容:

let html_document = window.html_document().unwrap();
Run Code Online (Sandbox Code Playgroud)

文档来看,HTMLDocument应该扩展Document

我知道 Rust 中没有继承,但我无法将其转换Document为这样:

let html_document = web_sys::HtmlDocument::from(document); …
Run Code Online (Sandbox Code Playgroud)

rust webassembly

7
推荐指数
1
解决办法
2371
查看次数

Web Assembly 和 Rust:cargo build 与 wasm-pack

构建 wasm 使用的一些示例cargo build(如《WebAssembly 编程》一书中的示例)

cargo build --release --target=wasm32-unknown-unknown
Run Code Online (Sandbox Code Playgroud)

还有其他人使用,

wasm-pack build --target web ....
Run Code Online (Sandbox Code Playgroud)

这两种构建项目的方法有什么不同?

rust rust-cargo webassembly wasm-pack

7
推荐指数
1
解决办法
2216
查看次数

如何更新 Blazor Web 程序集中的 NavMenu

我需要在网络程序集中动态更新我的侧面导航栏。

你能建议我该怎么做吗?

@page "/ChildPage"

    @code{
        public List<string> menus = new List<string>();
        NavMenu n = new NavMenu();
        protected override async Task OnInitializedAsync()
        {
            menus.Add("Content 1");
            menus.Add("Content 2");

            await Task.Run(() => n.MenuItems = menus);
        }
    }
Run Code Online (Sandbox Code Playgroud)

在 Navmenu 剃须刀中做了如下一些操作。

<div class="@NavMenuCssClass" @onclick="ToggleNavMenu">
    <ul class="nav flex-column">
        @if (MenuItems != null)
        {
            @foreach (var menu in MenuItems)
            {
                <li class="nav-item px-3">
                    <NavLink class="nav-link" href="Page1">
                        <span class="oi oi-plus" aria-hidden="true"></span> @menu
                    </NavLink>
                </li>
            }
        }

    </ul>
</div>



@code {
    private bool collapseNavMenu = true;

    private string …
Run Code Online (Sandbox Code Playgroud)

c# webassembly blazor

7
推荐指数
1
解决办法
4910
查看次数

为什么 Rust WASM 指针和 JS 指针的值不同?

假设我在 Rust 代码中有以下定义:

#[wasm_bindgen]
pub struct RustType {
    foo: usize
}

#[wasm_bindgen]
impl RustType {
    #[wasm_bindgen(constructor)]
    pub fn new() -> Self {
        Self { foo: 100 }
    }
}

#[wasm_bindgen]
pub fn print_addr(obj: &RustType) {
    console_log!("rust addr = {}", obj as *const _ as u32);
}
Run Code Online (Sandbox Code Playgroud)

JS 代码创建一个实例RustType并将其传递给print_addr函数:

var obj = new RustType();
print_addr(obj);
Run Code Online (Sandbox Code Playgroud)

修改生成的print_addr函数后index_bg.js如下:

export function print_addr(obj) {
    _assertClass(obj, RustType);
    console.log("js addr = ", obj.ptr); // <== added this line
    if …
Run Code Online (Sandbox Code Playgroud)

javascript rust webassembly wasm-bindgen

7
推荐指数
1
解决办法
963
查看次数

如何在 emscripten 中将多个 wasm 文件链接在一起?(不只是C)

我正在尝试使用 emscripten 将 .c 文件和 .wat 文件链接在一起,以便我可以从 c 调用本机 WebAssembly 函数。我尝试了几种方法,但似乎都不起作用。例如,如果我尝试这样的事情:

wat文件.wat

(module
  (func $addwat (param $p1 i32) (param $p2 i32) (result i32)
    local.get $p1     
    local.get $p2 
    i32.add 
  )
  (export "addwat" (func $addwat))
)
Run Code Online (Sandbox Code Playgroud)

c文件

#include <emscripten.h>

int addwat( int a, int b );
int add2( int a, int b )
{
    return a+b;
}
int add2cwat( int a, int b )
{
    return addwat( a, b );
}
Run Code Online (Sandbox Code Playgroud)
wat2wasm -r watfile.wat
emcc -o cfile.wasm cfile.c watfile.wasm -s EXPORTED_FUNCTIONS='["_add2","_add2cwat"]' -s …
Run Code Online (Sandbox Code Playgroud)

javascript c emscripten webassembly

7
推荐指数
0
解决办法
1122
查看次数

如何使用 wasm-bindgen 和 --target no-modules 导入 JavaScript 函数?

我正在尝试弄清楚如何使用 Rust 和 wasm-bindgen 调用 JavaScript 函数。由于缺乏浏览器支持,我无法将 wasm-bindgen 与 ES6 模块与 Web Worker 一起使用。

据我所知,声明存在一个 JavaScript 函数供我在 Rust 端调用是很简单的

#[wasm_bindgen]
extern {
    fn logProgress(percent: f64);
}
Run Code Online (Sandbox Code Playgroud)

但是我不知道在哪里定义 JavaScript 实现。如果我尝试从 JavaScript 调用 Rust 函数来调用 undefined,logProgress那么我会收到运行时错误:Error: logProgress is not defined

我可以从 wasm-bindgen 文档中看到,如果我将 wasm-bindgen 与 ES6 模块一起使用,那么我可以将 rust 代码更改为

#[wasm_bindgen(module = "/progress.js")]
extern {
    fn logProgress(percent: f64);
}
Run Code Online (Sandbox Code Playgroud)

并在中声明 JavaScript 函数progress.js

export function logProgress(percent) {
    console.log(percent)
    // actual implementation would not just log
}
Run Code Online (Sandbox Code Playgroud)

由于我是通过全局导入 Rust …

javascript rust webassembly wasm-bindgen

7
推荐指数
1
解决办法
1696
查看次数