我已经研究了一段时间,我似乎无法找到如何实现这一目标。
有一个非常明确的标题 emscripten_get_canvas_size,它没有做我期望它做的事情。实际的 Emscripten 画布元素已设置为 100% 的宽度和高度,但是如果我通过 emscripten_get_canvas_size 检索宽度和高度,我只会获得画布内显示的 GLFW 窗口的宽度和高度,而不是画布缩放到的实际尺寸。
我想获得浏览器中显示的实际画布大小,以便我可以调用 glfwSetWindowSize 来缩放视口以填充整个浏览器窗口。
即使我将画布设置为 100x100px,emscripten_get_canvas_size 也只会返回我在程序开始时通过 glfwSetWindowSize 设置的 1920x1080。
我可能遗漏了一些明显的东西,但是什么?
我玩 emscripten 是为了好玩,并编译了我的一个旧模拟器程序以在浏览器中运行。
该程序将输出保存为数据文件,由于我没有做任何特别的事情,它应该驻留在 MEMFS(内存文件系统)上。
如何允许用户从 MEMFS 下载生成的文件?我可以触发浏览器的常规保存文件对话框吗?
几年没有使用 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 中的多线程有什么意义呢?
我现在正在学习WebAssembly,发现外部函数(libc 或第三方函数)无法被 Wasm 世界轻松访问(使用 import 是通用解决方案)。
我试图用emcc编译我的源代码到WASM但malloc并free广泛应用于我的源代码。我认为从现实世界中导入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) 我正在寻找一个 API,它可以让我一次读取通过(或允许从浏览器访问用户文件的任何其他方法)块提供的文件。我正在读取大文件,所以我不想将整个文件加载到内存中。
我的用例是,我正在使用用 emcc 编译的 ffmpeg 库,但我不想用它来处理多媒体文件。我可以实现自己的 AVIOContext,但要做到这一点,我需要相当于 C 函数 fread 和 fseek。
我正在查看具有 WORKERFS 文件系统类型的 FS API,但我不清楚是否可以使用 DOM 中的文件对象从工作线程挂载它。
我刚刚完成了从 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)
我没有找到任何例子或建议来实现这个要求。
我有一个像这样的 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)
但是当我尝试读取该文件时收到“没有这样的文件或目录”错误消息。
对我哪里出错有什么建议吗?
我正在编写一个使用用 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) 我正在尝试在 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
我只是尝试在 Windows 上使用 emscripten 将 Rust 示例项目编译为 WebAssembly,但它会导致错误。我该如何修复它?
我做了什么:
>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)
>rustup target add wasm32-unknown-emscripten
Run Code Online (Sandbox Code Playgroud)
>cargo new --bin web_assembly
>cd web_assembly
Run Code Online (Sandbox Code Playgroud)
>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) emscripten ×10
webassembly ×8
javascript ×3
c++ ×2
file-io ×1
rust ×1
rustup ×1
web ×1
windows ×1