标签: emscripten

使用 WebAssembly 在浏览器中查询大型数据集

为了便于讨论,假设浏览器允许WebAssembly 应用程序使用4GB 内存。忽略压缩和其他数据存储考虑因素,如果用户有一个 3GB 的本地 csv 文件,我们可以使用 WebAssembly(当然也可以是 JavaScript)完全在内存中查询该数据。例如,如果用户的数据具有以下格式:

ID 国家 数量
1 我们 12
2 国标 11
3 7

然后,在几行代码中,我们可以执行一个基本算法来过滤ID=2,即 的 SQL 等效项SELECT * FROM table WHERE id=2

现在,我的问题是,是否有可能在任何浏览器中(并且可能使用实验标志和/或选择某些用户首选项),以便可以对不适合内存的文件进行查询,即使正确压缩也是如此。例如,在这篇博文中,加载并查询了约 500GB 的文件。我知道500GB的数据并没有完全加载到内存中,并且可能存在面向列的数据结构,因此只需要读取某些列,但无论哪种方式,操作系统都可以访问文件系统,因此文件比可以使用可用内存。

是否可以在 WebAssembly 浏览器应用程序中以任何方式执行此操作?如果是这样,如何完成的概要是什么?我知道这个问题可能需要一些研究,因此当它可以获得赏金时,我可以为其添加 500 点赏金以鼓励回答。(请注意,使用的底层语言是 C++-compiled-to-wasm,但我认为这对于这个问题来说并不重要。)

我想一种可能性可能是这样的:https://rreverser.com/web assembly- shell-with-a-real-filesystem-access-in-a-browser / 。

c++ google-chrome rust emscripten webassembly

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

使用emscripten生成python.cc.js

我正在阅读emscripten的教程 - https://github.com/kripken/emscripten/wiki/Tutorial以及在本地计算机上查看源代码中的一些演示项目.

到目前为止,我已经下载了源代码并正确设置了我的.emscripten设置文件.

我正在寻找一个参考来找出:为了创建/输出"python.cc.js"和"python.html",需要什么系列的emcc命令?感谢之前尝试过emscripten的开发人员的任何提示.

这是我的.emscripten文件:

EMSCRIPTEN_ROOT = os.path.expanduser('~/Dev/emscripten') # this helps projects using emscripten find it

# LLVM_ROOT = os.path.expanduser('~/Dev/llvm-3.0/cbuild/bin')
LLVM_ROOT = os.path.expanduser('/opt/local/bin')

# See below for notes on which JS engine(s) you need
NODE_JS = 'node'
SPIDERMONKEY_ENGINE = [os.path.expanduser('~/Dev/mozilla-central/js/src/js'), '-m', '-n']
V8_ENGINE = os.path.expanduser('~/Dev/v8/d8')

CLOSURE_COMPILER = os.path.expanduser('~/work/closure-compiler/compiler.jar') # optional (needed for the benchmarks)

TEMP_DIR = '/tmp'


########################################################################################################


# Pick the JS engine to use for running the compiler. This engine must exist, or
# nothing can be …
Run Code Online (Sandbox Code Playgroud)

javascript python interpreter llvm emscripten

3
推荐指数
1
解决办法
2912
查看次数

试图让asm.js返回一个类型化的数组

我正在使用emscripten生成一些Javascript,我试图弄清楚如何获得返回类型数组的函数.我试图返回的数组是静态长度,但我有点困惑如何在JS域中处理基于指针的返回类型.

这种包装器是做事的方式: 如何从javascript访问Emscripten类型的数组?

非常感谢.

emscripten asm.js

3
推荐指数
1
解决办法
2036
查看次数

如何将用python编写的函数编译成JavaScript(emscripten)?

我有一个用python编写的简单函数,我想将其移植到javascript.

我已经将python 2.7编译成.so库,所以这不是问题.

我遇到的问题是,在用cython编译我的程序后,函数名称变得全乱,这意味着我不知道如何在运行emcc时保留这些函数.

有没有人有任何使用emscripten编译python程序到js的经验?

任何信息,将不胜感激.

注意:我想保留python的确切功能,我不想要将python程序转换为javascript的东西.

javascript python cython emscripten

3
推荐指数
1
解决办法
896
查看次数

使用emscripten embind在c ++中调用javascript函数

这个问题分为两部分.我想要做的是将我的大部分程序逻辑放在c ++类中,并在js中使用一些与视图相关的函数(比如DOM操作和样式).我使用emscripten嵌入类,它工作正常但我不知道如何交互使用hte js代码(他们的教程资源非常有限.)

我想根据他们的教程将一个val对象传递给c ++类(https://github.com/kripken/emscripten/wiki/Tutorial)传递工作正常,而"调用"函数不起作用.我有一个编译时错误

这是我尝试的示例,他们在他们的教程上

#include <emscripten/val.h>
using namespace emscripten;

int main(){
  val Math = val::global("Math");
  Math.call("abs",-10);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我得到以下错误:错误:没有匹配的成员函数来调用'call'Math.call("abs", - 10); ~~~~ ^ ~~~ emscripten/1.5.6/system/include/emscripten/val.h:247:21:注意:候选模板被忽略:无法推断模板参数'ReturnValue'ReturnValue调用(const char*name ,Args && ... args)const {

基本上它说编译器不知道"调用"函数的返回类型.我做错了什么或有没有更好的方式与js代码交互?

谢谢,呃

javascript c++ emscripten

3
推荐指数
1
解决办法
1946
查看次数

在iOs Safari和chrome上的Javascript画布缓冲/慢性能

我试图通过直接在pixelData缓冲区上绘制像素来更新javascript画布.基本上我会在每次mousemove/touchmove事件后更新imageData缓冲区上的所有像素,并尝试获得最佳性能.

背景:我正在开发一个基于emscripten的应用程序,其中画布上的绘图是由"本机"代码逐个像素完全绘制的.我在这个问题中给出的例子是一个更简单的例子,我在那里复制了我的问题.

我目前遇到了两个性能问题:

  • 在iOS safari上(在iPad上测试):绘图功能以31 fps调用,但是屏幕上的画布渲染是滞后的(在视觉上,我会说它以10fps最大值更新,加上0.5秒的一些间隔,其中它根本没有更新)
  • 在iOS Chrome上:性能很差,因为我获得了2.9 fps

在桌面Mac上,我获得了稳定的性能:使用firefox的55 fps和使用chrome的45 fps

所以,我有两个问题

  • 如何在iOs safari上强制刷新画布(为了获得真正的30 fps渲染,或者可能会低一点)?
  • 您如何优化性能?我错过了可能的优化吗?

请参考下面的代码:它是一个单独的html文件,可以重现我的问题.

我知道我可以使用webworker,但由于我使用的是emscripten,这不是最佳的(每个webworker都以新的内存开始,我需要记录状态).

请参阅此处的代码(它是一个单独的html文件,js是自包含的).请在画布内移动鼠标以查看计算出的fps.

<canvas width=800 height=600 id="canvas"> </canvas>

<script>


//Disable scroll : usefull for tablets where touch events
//will scroll the page
function DisableScroll()
{
  window.addEventListener("touchmove", function(event) {
    if (!event.target.classList.contains('scrollable')) {
      // no more scrolling
      event.preventDefault();
    }
  }, false);
}

window.requestAnimFrame = (function(){
  return  window.requestAnimationFrame       ||
          window.webkitRequestAnimationFrame ||
          window.mozRequestAnimationFrame    ||
          function( callback ){
            window.setTimeout(callback, 1000 / 60);
          };
})();


window.countFPS = (function () …
Run Code Online (Sandbox Code Playgroud)

javascript html5 canvas ios emscripten

3
推荐指数
1
解决办法
5382
查看次数

Emscripten C++ 11标准库支持

emscripten是否完全支持C++ 11标准库?

具体来说 - 如果我使用任何与并发相关的结构会发生什么,例如std :: async,std :: lock_guard等.

谢谢

c++11 emscripten

3
推荐指数
1
解决办法
1234
查看次数

如何使用emscripten将使用SDL的纹理加载到WebAssembly项目中?

我正在尝试使用SDL将纹理加载到我的应用程序中。作为本机应用程序构建时,它可以正常工作。但是,当我使用Emscripten构建它时,无法加载纹理。

纹理图像的宽度为64像素,我可以通过打印出wSDL_Surface实例的成员来进行验证。但是,当我尝试在WebAssembly应用程序中打印相同的成员时,它会产生5076 ...

挤满脚本时,图像是否会以某种方式“破裂”?

这是加载纹理的代码:

SDL_Surface *image = IMG_Load("resources/binaries/crate.jpg");
GLuint textureID;
glGenTextures(1, &textureID);
glBindTexture(GL_TEXTURE_2D, textureID);
std::cout << image->w << std::endl;
glTexImage2D(GL_TEXTURE_2D, 0, 3, 64, 64, 0, GL_RGB, GL_UNSIGNED_BYTE, image->pixels);
Run Code Online (Sandbox Code Playgroud)

这是使用Emscripten构建Web应用程序的命令

emcc --bind -s USE_SDL=2 -s USE_SDL_IMAGE=2 -o webapp.js src/webapp.cpp --preload-file resources
Run Code Online (Sandbox Code Playgroud)

启动Web应用程序时出现浏览器错误消息是

webapp.js:9533 WebGL:INVALID_VALUE:texImage2D:宽度或高度超出范围

这是有道理的,因为图像的分辨率是如此疯狂。

c++ sdl-image emscripten webassembly

3
推荐指数
1
解决办法
1004
查看次数

使用Emscripten编译的WebAssembly可以生成较小的文件大小

我对WebAssembly很感兴趣,但令人沮丧的是,即使是用C++编码并使用Emscripten编译的"Hello World"示例,也会在浏览器中生成总计396KB的内容.是什么赋予了?如何才能提高尺寸效率呢?

emscripten webassembly

3
推荐指数
1
解决办法
594
查看次数

如何在emscripten中使用canvas

我正在开发一个webassembly程序。我可以使用emscripten_set_canvas_size设置画布大小(直到我读到我需要切换到新的API,因为这个API将会被贬值)...

但是我的问题是:如何设置画布上的像素?我的程序为画布生成32位颜色的数组,我需要将这些位从内部存储器传输到画布。我怎样才能做到这一点?

另外,如果我只能获取指向画布数据的内存指针,则可以直接在所述内存中写...

我希望,如果可能的话,无需重新排序至任何其他API(GL,SDL ...),就可以将颜色尽快转移到画布上……仅此而已。

理想情况下,我正在按照以下方式寻找一个简短的示例程序:

#include <...>
  uint32_t screen[320*320];
 static void main_loop()
 {
   memset(screen, 0, 320*320*4); // Clear screen
   for (int x=0; x<320; x++)
     for (int y=0; y<320; y++)
       screen[320*(x|y) + (x&y)]= 0xffffff; // set pixel(x or y, x and y) to white... (will draw a serpinsky triangle)
   Copy_ToCanvas(screen);  // THIS IS THE FUNCTION THAT I AM LOOKING FOR
 }

int main()
{
  emscripten_set_canvas_size(320, 320);
  emscripten_set_main_loop(main_loop, 100, true);
  return 0;
} 
Run Code Online (Sandbox Code Playgroud)

谢谢,西里尔

canvas emscripten webassembly

3
推荐指数
1
解决办法
609
查看次数