标签: emscripten

如何检索 Emscripten 画布的浏览器内大小?

我已经研究了一段时间,我似乎无法找到如何实现这一目标。

有一个非常明确的标题 emscripten_get_canvas_size,它没有做我期望它做的事情。实际的 Emscripten 画布元素已设置为 100% 的宽度和高度,但是如果我通过 emscripten_get_canvas_size 检索宽度和高度,我只会获得画布内显示的 GLFW 窗口的宽度和高度,而不是画布缩放到的实际尺寸。

我想获得浏览器中显示的实际画布大小,以便我可以调用 glfwSetWindowSize 来缩放视口以填充整个浏览器窗口。

即使我将画布设置为 100x100px,emscripten_get_canvas_size 也只会返回我在程序开始时通过 glfwSetWindowSize 设置的 1920x1080。

我可能遗漏了一些明显的东西,但是什么?

emscripten

4
推荐指数
1
解决办法
1050
查看次数

Emscripten:提供下载/保存生成的 MEMFS 文件

我玩 emscripten 是为了好玩,并编译了我的一个旧模拟器程序以在浏览器中运行。

该程序将输出保存为数据文件,由于我没有做任何特别的事情,它应该驻留在 MEMFS(内存文件系统)上。

如何允许用户从 MEMFS 下载生成的文件?我可以触发浏览器的常规保存文件对话框吗?

emscripten

4
推荐指数
1
解决办法
691
查看次数

多线程 WebAssembly 在浏览器中比单线程慢,为什么?

几年没有使用 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 秒):

x64、WebAssembly 和 JavaScript 的比较

多线程性能下降是否是由于浏览器限制 WebWorkers 造成的?那么 WebAssembly 中的多线程有什么意义呢?

c++ multithreading emscripten webassembly

4
推荐指数
1
解决办法
2257
查看次数

如何在 Wasm 中实现“malloc”

我现在正在学习WebAssembly,发现外部函数(libc 或第三方函数)无法被 Wasm 世界轻松访问(使用 import 是通用解决方案)。

我试图用emcc编译我的源代码到WASM但mallocfree广泛应用于我的源代码。我认为从现实世界中导入malloc和导入free是不可行的。

所以,我很好奇如何malloc在 wasm 世界中实现。我已经知道 malloc 是如何工作的glibc:使用 brk() 或 sbrk() 来扩展堆和线性地址的一些内存管理。但在 wasm 世界中,我认为不可能打电话brk()sbrk()获得班轮地址。

malloc像这样使用全局变量来实现是否合理?

u_char mem[10240];


void *wasm_malloc(size_t num)
{
    /*get the free mem idx*/
    return &mem[idx];
}
Run Code Online (Sandbox Code Playgroud)

emscripten webassembly

4
推荐指数
1
解决办法
2317
查看次数

从 emscripten 读取用户提供的大文件,一次读取一大块

我正在寻找一个 API,它可以让我一次读取通过(或允许从浏览器访问用户文件的任何其他方法)块提供的文件。我正在读取大文件,所以我不想将整个文件加载到内存中。

我的用例是,我正在使用用 emcc 编译的 ffmpeg 库,但我不想用它来处理多媒体文件。我可以实现自己的 AVIOContext,但要做到这一点,我需要相当于 C 函数 fread 和 fseek。

我正在查看具有 WORKERFS 文件系统类型的 FS API,但我不清楚是否可以使用 DOM 中的文件对象从工作线程挂载它。

file-io emscripten html5-filesystem webassembly

4
推荐指数
1
解决办法
1624
查看次数

如何使用 EM_JS 从 C++ 调用带参数的 javascript 方法

我刚刚完成了从 C/C++ 调用 JavaScript并按照他们的说明进行操作。我可以从 C++ 调用 Js 方法

C++

#include <iostream>
#include <string>

#include <emscripten.h>
#include <emscripten/bind.h>

EM_JS(void, call_js, (), {
    jsMethod();
});

bool callJsBack()
{
    call_js();
    return true;
}

EMSCRIPTEN_BINDINGS(module)
{
    emscripten::function("callJsBack", &callJsBack);
}
Run Code Online (Sandbox Code Playgroud)

杰斯

<script>
    var Module = {
        onRuntimeInitialized: function() {
            console.log('Module.callJsBack(): ' + Module.callJsBack());
        }
    };

    function jsMethod() {
        alert('I am a js method!');
    }
 </script>
Run Code Online (Sandbox Code Playgroud)

我想让 jsMethod() 参数化(想要在调用 jsMethod() 时从 C++ 传递字符串)。

function jsMethod(msg) {
    alert(msg);
}
Run Code Online (Sandbox Code Playgroud)

我没有找到任何例子或建议来实现这个要求。

c++ emscripten webassembly

4
推荐指数
1
解决办法
3310
查看次数

如何将文件从 HTML 输入加载到 Emscripten 的 MEMFS 文件系统中?

我有一个像这样的 HTML 输入<input type="file" id="myfile" onchange="load_file()">。我想将文件加载到 Emscripten 的 MEMFS 文件系统中。查看Emscripten 文件 API,我一直在尝试使用 FS.mount() 来执行此操作。

但是,文档仅给出了使用 WORKERFS 进行挂载的示例,因此我尝试像这样使用它。

let files = document.getElementById('myfile').files;
let file=files[0];
FS.mount(MEMFS, {files: file },'test');
console.log(FS.readFile('test/' + file.name));
Run Code Online (Sandbox Code Playgroud)

但是当我尝试读取该文件时收到“没有这样的文件或目录”错误消息。

对我哪里出错有什么建议吗?

javascript emscripten webassembly

4
推荐指数
1
解决办法
1918
查看次数

如何将文件/blob 从 JavaScript 传递到 emscripten/WebAssembly (C++)?

我正在编写一个使用用 emscripten 编译的 C++ 代码的 WebExtension。WebExtension 下载我想要在 C++ 代码中处理的文件。我知道文件系统 API,并且我想我阅读了其中的大部分内容,但我无法让它工作 - 使下载的文件可以在 emscripten 中访问。

这是我的 WebExtension 的相关 JavaScript 部分:

// Download a file
let blob = await fetch('https://stackoverflow.com/favicon.ico').then(response => {
  if (!response.ok) {
    return null;
  }     
  return response.blob();
});

// Setup FS API
FS.mkdir('/working');
FS.mount(IDBFS, {}, '/working');
FS.syncfs(true, function(err) {
  if (err) {
    console.error('Error: ' + err);
  }
});

// Store the file "somehow"
let filename = 'favicon.ico';
// ???

// Call WebAssembly/C++ to process the file
Module.processFile(filename); …
Run Code Online (Sandbox Code Playgroud)

javascript emscripten webassembly

4
推荐指数
1
解决办法
3303
查看次数

Chrome 扩展程序拒绝将字符串评估为 JavaScript,因为 emscripten 生成的文件中存在“unsafe-eval”

我正在尝试在 Chrome 插件中加载 wasm 模块。Chrome 抱怨 emscripten 生成的 wasm 模块中存在以下函数。它在以下js上跳闸

Uncaught EvalError: Refused to evaluate a string as JavaScript because 'unsafe-eval' is not an allowed source of script in the following Content Security Policy directive: "script-src 'self' blob: filesystem:".

function createNamedFunction(name, body) {
      name = makeLegalFunctionName(name);
      /*jshint evil:true*/
      return new Function(
          "body",
          "return function " + name + "() {\n" +
          "    \"use strict\";" +
          "    return body.apply(this, arguments);\n" +
          "};\n"
      )(body);
    }
Run Code Online (Sandbox Code Playgroud)

我将脚本加载到文件中background.html,以便它可以充当模块。。

<script type="module" src="../js/background.js"></script>
<script …
Run Code Online (Sandbox Code Playgroud)

javascript google-chrome-extension web emscripten webassembly

4
推荐指数
1
解决办法
1847
查看次数

在 Windows 上使用 emscripten 将 Rust 编译为 WebAssembly 时出错

我只是尝试在 Windows 上使用 emscripten 将 Rust 示例项目编译为 WebAssembly,但它会导致错误。我该如何修复它?

我做了什么:

  1. 安装emscripten
>git clone https://github.com/emscripten-core/emsdk.git
>cd emsdk
>git pull
>emsdk install latest
>emsdk activate latest
>emsdk_env.bat
Run Code Online (Sandbox Code Playgroud)
  1. 安装 rustup 从https://www.rust-lang.org/ja/tools/install下载 rustup-init.exe 并运行它
  2. 通过 rustup 安装 wasm32 目标
>rustup target add wasm32-unknown-emscripten
Run Code Online (Sandbox Code Playgroud)
  1. 创建示例项目
>cargo new --bin web_assembly
>cd web_assembly
Run Code Online (Sandbox Code Playgroud)
  1. 尝试编译,但出现错误
>cargo build --target wasm32-unknown-emscripten
   Compiling web_assembly v0.1.0 (F:\github\rusttest\web_assembly)
error: linking with `emcc.bat` failed: exit code: 1
  |
  = note: "cmd" "/c" "emcc.bat" "-s" "DISABLE_EXCEPTION_CATCHING=0" "-L" "C:\\Users\\Username\\.rustup\\toolchains\\stable-x86_64-pc-windows-msvc\\lib\\rustlib\\wasm32-unknown-emscripten\\lib" "-L" "C:\\Users\\Username\\.rustup\\toolchains\\stable-x86_64-pc-windows-msvc\\lib\\rustlib\\wasm32-unknown-emscripten\\lib\\self-contained" "F:\\github\\rusttest\\web_assembly\\target\\wasm32-unknown-emscripten\\debug\\deps\\web_assembly.web_assembly.egwz9uoo-cgu.0.rcgu.o" "F:\\github\\rusttest\\web_assembly\\target\\wasm32-unknown-emscripten\\debug\\deps\\web_assembly.web_assembly.egwz9uoo-cgu.1.rcgu.o" "F:\\github\\rusttest\\web_assembly\\target\\wasm32-unknown-emscripten\\debug\\deps\\web_assembly.web_assembly.egwz9uoo-cgu.2.rcgu.o" "F:\\github\\rusttest\\web_assembly\\target\\wasm32-unknown-emscripten\\debug\\deps\\web_assembly.web_assembly.egwz9uoo-cgu.3.rcgu.o" …
Run Code Online (Sandbox Code Playgroud)

windows rust emscripten webassembly rustup

4
推荐指数
3
解决办法
3799
查看次数