那么如何通过例如Google的V8引擎检查它是否像普通的Javascript一样执行,或者使用程序集以近原生性能执行?
(OpenGL / Emscripten 新手)
对于我正在构建的股票交易客户端应用程序,需要 40 多个打开的图表。其中大约 50% 处于某种“自由绘制”状态,这意味着它们显示烛台以及其他线条/箭头/图像等。
在过去几个月尝试了很多选择之后,这就是结果。
我引导单个 WebAssembly 应用程序实例,并在其上调用函数以让 C++ 创建带有 OpenGL 的图表,该图表映射到 WebGL(2)。一切正常。
我选择 (WebAssembly + OpenGL) -> Emscripten 的原因是因为有很多数字运算,而且 C++ 也很适合这项工作:)
问题是 WebGL 在 Chrome(59) 中的上下文限制约为 10。因此,拥有 40-100 个 WebGL 上下文(图表)并不是一个聪明的主意,而且我的胆量告诉我,拥有如此多的上下文几乎总是作为静态图像输出是对 OpenGL 资源的浪费,除非您滚动图表等。
有没有人有将单个 OpenGL 上下文渲染到随机画布元素(或任何其他元素,并不重要)的良好经验?
我的想法如下:
我似乎没有任何其他方式可以不创建许多 OpenGL 上下文。
问题是:这样做的性能如何,并且基本上将 OpenGL 缓冲区复制到 Javascript 等?它离轨道很远吗?
谢谢 …
我正在尝试一个简单的例子,用JavaScript调用编译为.wasm的C函数.
这是counter.c文件:
#include <emscripten.h>
int counter = 100;
EMSCRIPTEN_KEEPALIVE
int count() {
counter += 1;
return counter;
}
Run Code Online (Sandbox Code Playgroud)
我用它编译了它emcc counter.c -s WASM=1 -o counter.js.
我的main.jsJavaScript文件:
Module['onRuntimeInitialized'] = onRuntimeInitialized;
const count = Module.cwrap('count ', 'number');
function onRuntimeInitialized() {
console.log(count());
}
Run Code Online (Sandbox Code Playgroud)
我的index.html文件只加载正文中的两个.js文件,没有别的:
<script type="text/javascript" src="counter.js"></script>
<script type="text/javascript" src="main.js"></script>
Run Code Online (Sandbox Code Playgroud)
它工作正常/打印101到控制台,但当我将counter.c文件移动到一个wasm子目录,用emscripten重新编译并更新script标签src="wasm/counter.js",counter.js脚本尝试counter.wasm从根目录而不是wasm子目录加载,我得到错误:
counter.js:190 failed to asynchronously prepare wasm: failed to load …
将 OpenSSL 链接到 webassembly
在问这个问题之前,我只想说我做了一些功课。这个问题与这里已经提出的问题非常相似,即 如何将 OpenSSL 与 emscripten 链接?
在我找到了一个非常好的详细手册后,如何将 OpenSSL 编译为 webassemly 在这里 https://www.ip6.li/node/129
我能够成功运行所有步骤,即
1)首先进入下载最新emscripten的目录,设置一些路径变量:
~/emscripten/emsdk$ source ./emsdk_env.sh
Run Code Online (Sandbox Code Playgroud)
2)然后执行上面手册中的脚本
./mk-openssl-webassemby.sh:
Run Code Online (Sandbox Code Playgroud)
基本上,它全部编译没有任何错误,但有一个特定的警告。编译后,我可以 cd 到 crypto/sha 目录,看到文件被编译为所谓的中间表示:
/openssl/openssl-1.1.0h/openssl/crypto/sha$ file sha256.o
sha256.o: LLVM IR bitcode
Run Code Online (Sandbox Code Playgroud)
在阅读其他在线资源时,我希望该文件具有 .bc 扩展名,但似乎 .o 也是正确的。不确定。
我在编译过程中看到以下警告:
make[2]: Entering directory '/openssl/openssl-1.1.0h/openssl'
( :; LIBDEPS="${LIBDEPS:--L. -lssl -L. -lcrypto -lsocket -lnsl }"; LDCMD="${LDCMD:-emcc}"; LDFLAGS="${LDFLAGS:--DNDEBUG -DOPENSSL_NO_DYNAMIC_ENGINE -DOPENSSL_API_COMPAT=0x10100000L -DOPENSSLDIR="\"/tmp\"" -DENGINESDIR="\"/usr/local/lib/engines-1.1\"" -g -Wall }"; LIBPATH=`for x in $LIBDEPS; do echo $x; done | sed -e 's/^ *-L//;t' -e d | uniq`; …Run Code Online (Sandbox Code Playgroud) 我正在尝试将使用 emscripten 生成的模块导入为 es6 模块。我正在尝试使用emscripten doc 中的基本示例。
这是我用来从 C 模块生成 js 模块的命令:
emcc example.cpp -o example.js -s EXPORTED_FUNCTIONS="['_int_sqrt']" -s EXTRA_EXPORTED_RUNTIME_METHODS="['ccall', 'cwrap']" -s EXPORT_ES6=1 -s MODULARIZE=1
C 模块:
#include <math.h>
extern "C" {
int int_sqrt(int x) {
return sqrt(x);
}
}
Run Code Online (Sandbox Code Playgroud)
然后导入生成的js模块:
<!DOCTYPE html>
<html lang="en" dir="ltr">
<head>
<meta charset="utf-8">
<title>Wasm example</title>
</head>
<body>
<script type="module">
import Module from './example.js'
int_sqrt = Module.cwrap('int_sqrt', 'number', ['number']);
console.log(int_sqrt(64));
</script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
这是失败的,因为 cwrap 在 Module 对象上不可用:
Uncaught TypeError: Module.cwrap is not …
我想使用由前一个 Module 实例创建的 WebAssembly.Memory 对象实例化一个 WebAssembly 模块(所有这些都使用 emscripten 的胶水代码),这可行吗?
我最近遇到了Pyodide项目。
我已经使用Pyodide构建了一个小样,但是尽管我花了很多时间来查看源代码,但是对我来说,如何重定向printpython的输出(除了修改CPython源代码之外)还不是很明显(而且)。,如何将输出从matplotlib.pyplot重定向到浏览器。
从源代码来看,FigureCanvasWasm确实有一个show()带有适当后端的方法可以绘制到浏览器画布上-但是,我不清楚如何实例化此类并调用它的show()方法,或者是否还有另一种更明显的重定向方式画到画布上。
因此,我的问题是:
print()消息这是我的测试页:
<!doctype html>
<meta charset="utf-8">
<html lang="en">
<html>
<head>
<title>Demo</title>
<script src="../../pyodide/build/pyodide.js"></script>
</head>
<body>
</body>
<script type="text/javascript">
languagePluginLoader.then(() => {
pyodide.loadPackage(['matplotlib']).then(() => {
pyodide.runPython(`
import matplotlib.pyplot as plt
plt.plot([1, 2, 3, 4])
plt.ylabel('some numbers')
#fig = plt.gcf()
#fig.savefig(imgdata, format='png')
print('Done from python!')`
);
//var image = pyodide.pyimport('imgdata');
//console.log(image);
});});
</script>
<html>
Run Code Online (Sandbox Code Playgroud) 我正在阅读有关 WebAssembly 的文章,我很好奇如何将 Vulkan 或 OpenGL 等图形编程移植到画布元素。文档很长,我想我最终会解决这个问题,但我很好奇,并没有在现场找到答案。
到目前为止,我知道它可以将函数导出到 JS,而 JS 会像往常一样做操作 DOM 的肮脏工作。
我可以直接编写 WebGL,但这不是我的观点。我见过移植到 WebAssembly 的游戏,我想知道它是如何工作的。如果 WebAssembly 无法直接访问 DOM,它如何呈现任何内容?通常,图形应用程序使用外部窗口管理器(如GLFW或SDL)来创建窗口上下文来绘制您的内容。
如果我确实使用这样的库编译了一个程序,并期望一个带有一些 Window 对象的环境启动,如果 DOM 中没有这样的概念,这些指令将如何映射到画布?我需要以某种方式调整我的 C++ 程序吗?
使用 CMake 和 emscripten 构建 C++/web-assembly 项目时,install目标命令仅安装.js文件而不安装.wasm文件。
install(TARGETS MyTarget RUNTIME DESTINATION ${CMAKE_BINARY_DIR}/dist)
Run Code Online (Sandbox Code Playgroud)
这将仅安装 JS 文件。我尝试为LIBRARY, RESOURCE, ARCHIVE...添加规则,但从未复制 Wasm。我在官方文档中找不到任何内容。
我知道使用install(FILES ...命令强制复制 wasm很容易解决,但是有没有办法让标准安装对这两个文件都有效?他们都需要作为目标......
emscripten ×10
webassembly ×7
javascript ×5
asm.js ×2
c ×1
c++ ×1
cmake ×1
es6-modules ×1
firefox ×1
matplotlib ×1
opengl ×1
openssl ×1
pyodide ×1
python ×1
sdl ×1