我有一个 C++ 函数,它曾经被调用消耗来自 stdin 的输入。使用 emscripten 将此函数导出到 javascript 会导致调用 window.prompt。
与浏览器提示交互确实是一项乏味的任务。首先,您一次只能粘贴一行。其次,指示 EOF 的唯一方法是按“取消”。最后但并非最不重要的唯一方法(在我的函数的情况下)使其停止通过 window.prompt 要求用户输入是通过选中防止弹出更多提示的复选框。
对我来说,最好的输入方法是阅读一些 blob。我知道我可以破解 library.js 但我看到了一些问题:
最好的解决方案是某种回调,但我希望看到更有经验的用户的提示。
我目前正在使用emscripten编译支持在C中编写文件解析库.它从用户读取二进制文件并解析它的文件路径.
我知道emscripten不支持直接加载文件,而是使用虚拟文件系统.有没有办法将给定路径的文件加载到虚拟文件系统中,以便emscripten编译的C lib可以读取它?我正在寻找NodeJS和浏览器的解决方案.
鉴于最简单的swift文件:
println("lol")
Run Code Online (Sandbox Code Playgroud)
在命令行上运行它xcrun swift -i lol.swift或者编译成可执行文件xcrun swift lol.swift -o lol是很简单的,但是如何为emscripten进行简单的概念验证呢?
我之前没有使用过emscripten,但是在http://kripken.github.io/emscripten-site/docs/getting_started/Tutorial.html上使用C++获得了一个hello world示例,并且想要编译我的Swift代码.
我试过了
xcrun swift lol.swift -emit-bc -o lol.bc
emcc lol.bc
Run Code Online (Sandbox Code Playgroud)
但是得到
Value: %1 = call { i8*, i64, i64 } @_TFSS37_convertFromBuiltinUTF16StringLiteralfMSSFTBp17numberOfCodeUnitsBw_SS(i8* bitcast ([4 x i16]* @0 to i8*), i64 3)
LLVM ERROR: Unrecognized struct value
Traceback (most recent call last):
File "/Users/glen/Downloads/emsdk_portable/emscripten/1.16.0/emcc", line 1540, in <module>
shared.Building.llvm_opt(final, link_opts)
File "/Users/glen/Downloads/emsdk_portable/emscripten/1.16.0/tools/shared.py", line 1267, in llvm_opt
assert os.path.exists(target), 'Failed to run llvm optimizations: ' + …Run Code Online (Sandbox Code Playgroud) 我正在移植现有的C程序,以使用Emscripten作为在线游戏.
问题是Emscripten希望程序围绕一个被调用60次的单个函数进行组织.这对于主游戏循环是可以的,除了有很多地方代码显示一组选项然后等待按键来选择选项.这表示为使用getch()等待按键的调用层次结构中的深层函数.我发现很难看到如何将其纳入运行然后完成的函数所需的Emscripten样式.
当代码调用一个调用了函数的函数时,它调用了一个函数,有一种简单的方法可以保存调用堆栈的整个状态,以便以后可以返回到同一个地方吗?
我目前使用的方法是设置一个全局状态变量来指示我当前的位置,并将堆栈中所有看起来很重要的内容写入静态变量.然后我从所有功能返回.要重新输入,我使用全局变量来决定调用哪个函数以及从保存的数据重新加载哪些变量.但是,这涉及编写大量额外代码,并且非常容易出错.
我想知道如何使用线程进行游戏逻辑并只是从GUI线程发送消息,但是Emscripten中的当前线程API似乎要求我尝试将所有游戏数据复制到一条消息中,这样就会感觉更多的工作为了一点利益.
Emscripten支持setjmp/longjmp,但据我所知,这只能完成一半的工作.我想我可以使用longjmp简单地从一个深层函数返回到上层,但我不知道我可以用它来以后再回到原来的位置.
关于如何做到这一点的任何更好的想法?
我使用相同的C++代码渲染相同的场景,一次使用Windows上的原生OpenGL,一次使用Emscripten到WebGL.场景中的所有内容看起来完全相同,除非我使用alpha!= 1.0渲染内容.区别如下:

蓝色立方体颜色是(0.0, 0.0, 1.0, 0.5)
用于渲染立方体的着色器除了绘制颜色之外什么都不做.
右边是OpenGL的外观,是预期的结果,只有蓝色,半透明.左边是Emscripten + WebGL的外观.看起来实际上呈现的颜色(0.5, 0.5, 1.0, 0.5)
我使用的混合功能是标准:
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
Run Code Online (Sandbox Code Playgroud)
WebGL中的alpha存在某种差异吗?什么可能导致这种情况发生?
我正在使用 emscripten 编译一个 C 程序,该程序使用我编写的 JavaScript 库,并将它们与--js-library标志链接在一起。我的 C 代码调用库中的一个函数,其中有一个函数Promise,在回调中我希望它将给定的结果写入一些内存,该内存已从 C 调用者传递到 JS 函数中。这是一个例子(catch为了简洁,我省略了 Promise的错误捕获部分):
库.js
mergeInto(LibraryManager.library, {
compute_js: function(input, out_buf) {
do_promise_computation(
input
).then(function(result){
Module.print("Promise Returned fully");
for (var i = 0; i < 8; i++) {
var num = result[i]
{{{makeSetValue('out_buf+(i*4)', 0, 'num', 'i32')}}}
}
});
}
Run Code Online (Sandbox Code Playgroud)
程序.c
#include <stdio.h>
#include <stdint.h>
#include <emscripten.h>
extern void compute_js(int32_t, int64_t*);
int main() {
int32_t input = 1234;
int64_t out_buf[4];
int64_t* out_ptr = (int64_t*)(&out_buf);
printf("Calling Javascript\n"); …Run Code Online (Sandbox Code Playgroud) Emscripten 文档 ( https://kripken.github.io/emscripten-site/docs/porting/connecting_cpp_and_javascript/Interacting-with-code.html#与代码直接函数调用交互)。
但是按值传递结构呢?如果我有这样的 C 函数:
typedef struct {double a, b, c;} MyStruct;
MyStruct Foo(const MyStruct x, double y);
Run Code Online (Sandbox Code Playgroud)
我将如何调用 Foo 并解码结果?(使用 Module.cwrap 或直接调用 Module._Foo )。我需要访问 Emscripten 堆栈才能做到这一点吗?这是在哪里记录的?
我被困在如何使用 wasm 编译器在 React 代码中加载 C++ 函数。
我的 C++ 由两个文件组成,编译后生成一个 160kb 的 wasm 文件。这是我目前用于编译的命令(在 macOS 上运行)。
em++ ../main.cpp ../stringFormat.cpp -s WASM=1 -s EXPORT_ALL=1 -s MODULARIZE=1 -O3 --closure 1 -o lss.js -std=c++11
Run Code Online (Sandbox Code Playgroud)
然后我将 lss 和 wasm 文件一起复制到我的 React 代码中,在同一个文件夹中。
src
- utils
- wasm
lss.js
lss.wasm
Run Code Online (Sandbox Code Playgroud)
但是,每当我尝试在另一个文件中导入 lss.js 时,我的应用程序都会因一堆未定义的表达式而崩溃。
我的js文件
import * as lss from '../wasm/lss'
Run Code Online (Sandbox Code Playgroud)
./src/utils/wasm/lss.js
Line 10:6: Expected an assignment or function call and instead saw an expression no-unused-expressions
Line 11:69: Expected an assignment or function call and instead …Run Code Online (Sandbox Code Playgroud) 我看过Compiling Python to WebAssembly及其各种答案、各种项目(EmPython、EmCPython、cpython-emscripten、Pyodide 等),但大多数时候,它需要重新编译或使用 Docker 等。
有没有办法在浏览器中使用 Python(使用 WebAssembly),使其工作方式如下:
您只需将foo.js、foo.wasm、index.html或类似的即用型文件放在一个目录中
你main.py在目录下放一个文件, WebAssembly Python解释index.html器会在我们在浏览器中打开时自动启动,直接在浏览器中显示Python stdout
您可以通过简单地添加 .py 文件来导入标准 Python 模块 main.py
例子:
pythoninbrowser.js
pythoninbrowser.wasm
index.html
main.py --> containing "import bs4"
bs4/
__init__.py
...all the rest of the BeautifulSoup module...
Run Code Online (Sandbox Code Playgroud)
另请参阅此问题。
很长一段时间以来一直在用 Go 编程,最近开始研究 WebAssembly。虽然大多数事情都很简单,但在将一些 Go 特定的结构(如通道和 goroutines)转换为 wasm 时有一个问题。在 JS 中使用时,它们的行为是否与在 Go 中使用时的行为方式相同(例如,goroutines 作为异步函数公开给 JS 等)?
emscripten ×10
c ×4
javascript ×4
webassembly ×4
c++ ×2
llvm ×2
node.js ×2
asynchronous ×1
filesystems ×1
go ×1
opengl ×1
promise ×1
python ×1
reactjs ×1
stdin ×1
swift ×1
webgl ×1