标签: emscripten

如何检查Firefox是否使用asm.js代码?

那么如何通过例如Google的V8引擎检查它是否像普通的Javascript一样执行,或者使用程序集以近原生性能执行?

javascript c++ firefox emscripten asm.js

6
推荐指数
1
解决办法
1209
查看次数

WebAssembly 和 OpenGL - 单一上下文,多输出(到画布)

(OpenGL / Emscripten 新手)

对于我正在构建的股票交易客户端应用程序,需要 40 多个打开的图表。其中大约 50% 处于某种“自由绘制”状态,这意味着它们显示烛台以及其他线条/箭头/图像等。

在过去几个月尝试了很多选择之后,这就是结果。

  • HighCharts:简单但缓慢;
  • CanvasJS:更快但还不够快
  • WebAssembly + OpenGL:快了很多,但工作量很大(仍然值得)

我引导单个 WebAssembly 应用程序实例,并在其上调用函数以让 C++ 创建带有 OpenGL 的图表,该图表映射到 WebGL(2)。一切正常。

我选择 (WebAssembly + OpenGL) -> Emscripten 的原因是因为有很多数字运算,而且 C++ 也很适合这项工作:)

问题是 WebGL 在 Chrome(59) 中的上下文限制约为 10。因此,拥有 40-100 个 WebGL 上下文(图表)并不是一个聪明的主意,而且我的胆量告诉我,拥有如此多的上下文几乎总是作为静态图像输出是对 OpenGL 资源的浪费,除非您滚动图表等。

有没有人有将单个 OpenGL 上下文渲染到随机画布元素(或任何其他元素,并不重要)的良好经验?

我的想法如下:

  1. 在另一个线程中使用屏幕外画布启动 c++ OpenGL, https://github.com/OleksandrChekhovskyi/emscripten-offscreen-canvas-test/blob/master/main.c#L35
  2. Javascript 告诉 C++ 渲染图形
  3. 通过共享 Uint8Array 与 JS 共享/渲染 OpenGL 后台缓冲区... SharedArrayBuffers 在 JS 工作线程中由 C++ 填充,主(渲染)线程仅读取/转换将图像写入画布/html 元素。

我似乎没有任何其他方式可以不创建许多 OpenGL 上下文。

问题是:这样做的性能如何,并且基本上将 OpenGL 缓冲区复制到 Javascript 等?它离轨道很远吗?

谢谢 …

javascript opengl emscripten asm.js webassembly

6
推荐指数
1
解决办法
3227
查看次数

如何加载存储在子目录中的.wasm文件?

我正在尝试一个简单的例子,用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 …

javascript emscripten webassembly

6
推荐指数
2
解决办法
1756
查看次数

将 OpenSSL 与 webassembly 链接

将 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)

openssl emscripten webassembly

6
推荐指数
1
解决办法
3436
查看次数

如何使用 es6 导入加载 emscripten 生成的模块?

我正在尝试将使用 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 …

javascript emscripten webassembly es6-modules

6
推荐指数
1
解决办法
3815
查看次数

如何使用emscripten将文件从C保存到浏览器存储

我用来在浏览器中运行我的游戏游戏引擎运行 lua,从我的游戏中,我使用普通的 fopen/write/fclose 保存文件。引擎C/C++代码通过emscripten编译成JS。让这些文件写入最终存储在本地存储中或浏览器缓存位置中的其他一些的好方法是什么?我在网上搜索并查看了文档,但信息非常稀少,我没有找到任何关于它应该如何工作的明确答案。

游戏引擎的先前贡献者在 emscripten 构建中添加了一个 js 库,该库将覆盖fclose以回调到 javascript。但是这个 fclose 覆盖似乎不再被调用,它根本不包含在最终的 .js 文件中。

emscripten

6
推荐指数
1
解决办法
3201
查看次数

在模块实例之间共享 WebAssembly.Memory

我想使用由前一个 Module 实例创建的 WebAssembly.Memory 对象实例化一个 WebAssembly 模块(所有这些都使用 emscripten 的胶水代码),这可行吗?

emscripten webassembly

6
推荐指数
1
解决办法
827
查看次数

如何在浏览器中重定向/渲染Pyodide输出?

我最近遇到了Pyodide项目

我已经使用Pyodide构建了一个小样,但是尽管我花了很多时间来查看源代码,但是对我来说,如何重定向printpython的输出(除了修改CPython源代码之外)还不是很明显(而且)。,如何将输出从matplotlib.pyplot重定向到浏览器。

从源代码来看,FigureCanvasWasm确实有一个show()带有适当后端的方法可以绘制到浏览器画布上-但是,我不清楚如何实例化此类并调用它的show()方法,或者是否还有另一种更明显的重定向方式画到画布上。

因此,我的问题是:

  1. 我如何重定向print()消息
  2. 如何强制pyodide在浏览器中绘制matplotlib图形?

这是我的测试页:

<!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)

python matplotlib emscripten webassembly pyodide

6
推荐指数
3
解决办法
206
查看次数

WebAssembly 应用程序如何将其原生 Window / OpenGL / Vulkan 调用映射到 DOM 中的画布元素?

我正在阅读有关 WebAssembly 的文章,我很好奇如何将 Vulkan 或 OpenGL 等图形编程移植到画布元素。文档很长,我想我最终会解决这个问题,但我很好奇,并没有在现场找到答案。

到目前为止,我知道它可以将函数导出到 JS,而 JS 会像往常一样做操作 DOM 的肮脏工作。

我可以直接编写 WebGL,但这不是我的观点。我见过移植到 WebAssembly 的游戏,我想知道它是如何工作的。如果 WebAssembly 无法直接访问 DOM,它如何呈现任何内容?通常,图形应用程序使用外部窗口管理器(如GLFWSDL)来创建窗口上下文来绘制您的内容。

如果我确实使用这样的库编译了一个程序,并期望一个带有一些 Window 对象的环境启动,如果 DOM 中没有这样的概念,这些指令将如何映射到画布?我需要以某种方式调整我的 C++ 程序吗?

javascript c sdl emscripten webassembly

6
推荐指数
1
解决办法
4687
查看次数

如何使用 emscripten 的 CMake 目标安装 .js 和 .wasm 文件?

使用 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很容易解决,但是有没有办法让标准安装对这两个文件都有效?他们都需要作为目标......

cmake emscripten

6
推荐指数
1
解决办法
82
查看次数