为了便于讨论,假设浏览器允许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 / 。
我正在阅读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) 我正在使用emscripten生成一些Javascript,我试图弄清楚如何获得返回类型数组的函数.我试图返回的数组是静态长度,但我有点困惑如何在JS域中处理基于指针的返回类型.
这种包装器是做事的方式: 如何从javascript访问Emscripten类型的数组?
非常感谢.
我有一个用python编写的简单函数,我想将其移植到javascript.
我已经将python 2.7编译成.so库,所以这不是问题.
我遇到的问题是,在用cython编译我的程序后,函数名称变得全乱,这意味着我不知道如何在运行emcc时保留这些函数.
有没有人有任何使用emscripten编译python程序到js的经验?
任何信息,将不胜感激.
注意:我想保留python的确切功能,我不想要将python程序转换为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代码交互?
谢谢,呃
我试图通过直接在pixelData缓冲区上绘制像素来更新javascript画布.基本上我会在每次mousemove/touchmove事件后更新imageData缓冲区上的所有像素,并尝试获得最佳性能.
背景:我正在开发一个基于emscripten的应用程序,其中画布上的绘图是由"本机"代码逐个像素完全绘制的.我在这个问题中给出的例子是一个更简单的例子,我在那里复制了我的问题.
我目前遇到了两个性能问题:
在桌面Mac上,我获得了稳定的性能:使用firefox的55 fps和使用chrome的45 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) emscripten是否完全支持C++ 11标准库?
具体来说 - 如果我使用任何与并发相关的结构会发生什么,例如std :: async,std :: lock_guard等.
谢谢
我正在尝试使用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:宽度或高度超出范围
这是有道理的,因为图像的分辨率是如此疯狂。
我对WebAssembly很感兴趣,但令人沮丧的是,即使是用C++编码并使用Emscripten编译的"Hello World"示例,也会在浏览器中生成总计396KB的内容.是什么赋予了?如何才能提高尺寸效率呢?
我正在开发一个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)
谢谢,西里尔
emscripten ×10
javascript ×4
webassembly ×4
c++ ×3
canvas ×2
python ×2
asm.js ×1
c++11 ×1
cython ×1
html5 ×1
interpreter ×1
ios ×1
llvm ×1
rust ×1
sdl-image ×1