- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个 Emscripten C++ Web Worker,哪种设计可以更有效地将大数据传输到 JavaScript 程序?
因为网络 worker 做 clone()
和序列化,通过web worker消息系统中转,这里有一些开销。还需要一些代码将 C++ 端的结果数据从 HEAP32 转换为 JavaScript 数组 ( C -> JS
)。
高效是指哪种设计更快,即哪种设计触发更少 new
和 gc()
(构造和销毁 JS 对象)。我的 Web Worker 使用一个用 C++ 编写的核心函数,它返回大数组(两个数组 float[V][3]
和 int[N][3]
,N=V=10000。它将用于更新 ThreeJS 几何图形,并将调用数十个在网页上长时间运行数千次。除了速度慢之外,这还可能导致浏览器变慢、卡住或崩溃。
C++ -> JS -> message(serialise) -> JS
.设计:(C++)JS <-WW-> JS
. 文件:core_mc_algorithm.cpp、worker.js、main.js。-s BUILD_AS_WORKER=1
编译的 C++ Web Worker ,在接收数据的主端写一些其他的C++代码,并在主端将结果从HEAP转换为JS:(由Emscripten处理的WebWorker data traser):优点:传输效率高,但是需要两次转换。 风险:在C++端,需要多次从 vector 复制到数组等。数据交换: C++ -> message(serialise) -> C++ -> JS
, 设计: (C++) <-WW-> C++(JS)
. 文件:worker.cpp、main.cpp、main.js。C++ -> message(serialise) -> JS
, 设计: (C++) <-WW-> JS
. 文件:worker.cpp, main.js .我在 C++ 中有这段代码,我想将它作为 Web Worker 运行:
void produce_object (
REAL* verts_output, int number_of_vertices,
int* faces_output, int number_of_triangles ) {
// Run Marching cubes, which produces a vector<int> and a vector<float>.
// fills in the arrays verts_output[] with coordinates (size: 3*number_of_vertices),
// fill in faces_output[] with triangle vertex indices (size: 3*number_of_triangles ), using some numerical code which includes the Marching Cubes algorithm.
}
我需要以下 JavaScript 回调函数才能使用正确的参数进行调用。它在 HTML 文件中定义:
function update_mesh_geometry_callback (verts, faces) {
/* verts and faces are of type Float32Array and Int32Array of size (3*N) and (3*V). In this function they are used to create the following object, which is added to the scene.*/
var geo = new THREE.Geometry(verts, faces); // a subclass
scene.add(new THREE.Mesh(gro, mat, etc));
}
典型大小至少:number_of_vertices == 90000 = N,number_of_triangles == 8000 = V。
最佳答案
我相信您是在寻找可转让 Assets 。 Worker 在 postMessage
方法中有一个额外的参数: https://developer.mozilla.org/en-US/docs/Web/API/Worker/postMessage
Transferables 仅适用于 ArrayBuffer
,它们还会从消息传递线程中取消设置缓冲区,您必须牢记这一点,但对于您的情况而言,这似乎是一个完美的选择,因为它将避免完全复制。
这是您的 worker 中的玩具代码示例
var vertices = new Float32Array(100000);
var faceIndices = new Uint32Array(50000);
postMessage({vertices: vertices, faceIndices: faceIndices}, [vertices.buffer, faceIndices.buffer]);
您可以在此处阅读有关可转让 Assets 的更多信息: Using transferable objects from a Web Worker
关于javascript - 使用 Emscripten C++ Web Worker 高效传输大型数组 : which JavaScript design is better?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37867511/
我需要将什么添加到我的 CMakeLists.txt 文件中,以便下面的示例来自 here还能建吗? 我可以毫无问题地生成 WASM,但不知道要在我的 CMakeLists.txt 中添加什么以停止出
我很好奇 emscripten 是否可以在没有 libc 的情况下构建二进制文件。 如果我有 simple.c: int add1(int x) { return x + 1; } 而且我不想
我已经研究了一段时间,我似乎无法找到如何实现这一点。 有一个非常明确的标题 emscripten_get_canvas_size,它没有做我期望它做的事情。实际的 Emscripten Canvas
Emscripten 教程很好地解释了如何与 C 函数交互:https://github.com/kripken/emscripten/wiki/Interacting-with-code 但是你如何
我对 WebAssembly 非常感兴趣,但我感到沮丧的是,即使是用 C++ 编码并使用 Emscripten 编译的“Hello World”示例,也会在浏览器中加载总共 396KB。是什么赋予了?
game engine我用来运行我的 game在浏览器中运行 lua 并在我的游戏中使用正常的 fopen/write/fclose 保存文件。引擎C/C++代码通过emscripten编译为JS。让
当使用不带任何参数的 emscripten 编译 C++ 时,除了 webgl Canvas 之外,它还会生成一个带有控制台和 emscripten Logo 的 html 文件。 是否可以禁用 Lo
我在 emscripten 中有一个 hello world 代码。如果可能的话,我想用 visual studio code 调试它并设置断点和调试更容易。我尝试这样做,但我无法在断点处停止。我使用
我正在阅读这里的 emscripten 教程 - https://github.com/kripken/emscripten/wiki/Tutorial 到目前为止,我已经下载了源代码并安装了依赖项并
是否可以使用 Emscripten 优化构建/编译 Opus/libopus?我不确定这是否是 Emscripten 和 WebAssembly 的一般当前限制,或者是否存在确保解码器在 WebAss
在 Emscripten wiki ( Interacting with code ) 中,只有两种类型被列为要传递给 ccall 的可能返回类型。或 cwrap (“数字”和“字符串”)。如何包装/
如何使用 emcmake cmake 并传递 emscripten 命令行选项? C++/CMake 的新手,但在谷歌上找不到任何有用的东西。所以也许这个问题只是愚蠢的,在那种情况下我道歉。 我可以使
我是 opencv.js 的新手。我在构建 opencv.js 时遇到了一些问题我正在使用 Windows 10。我按照以下步骤设置 opencv.js https://docs.opencv.org
我无法在另一个 JavaScript 文件中调用 C 函数,它给出了错误“在运行时初始化之前调用”please refer to this link 我按照给定链接中的描述在 emscripten 中
我正在尝试使用 Emscripten 构建一个使用 ffmpeg 库到 WebAssembly 的小项目。在此之前,我通过将一些简单的程序从 C 转换为 Wasm 来进行尝试,它运行良好,但那时我没有
我正在尝试将线程与 Emscripten 一起使用,但我不明白它是如何工作的。我已经阅读了一些关于网络 worker 的文字,但我不确定是否理解。 当我查看“tests”文件夹时,I can see
我正在运行一个使用 emscripten 编译为 wasm 的 C 工具。该工具适用于非常大的文件。在 CLI 上正常运行此工具时,操作通常会流式传输结果并在返回足够的数据后提前终止程序。例如,您可能
Mono 有一个 LLVM编译器。无论如何可以将它与 Emscripten 一起使用吗? (将 C# 代码编译为 JavaScript)? 最佳答案 目前没有现成的方法可以做到这一点。这也许是可能的,
我通过以下步骤安装了 Emscripten: 1.) Download the emsdk-portable version for Linux/MacOSX http://kripken.githu
我是 Emscripten/javascript 的新手,如果我的情况已经得到解决,我提前道歉。我在 ionic3 中有一个应用程序,我想读取 c 中有 3 个位置的数组,这个位置有其他数组,在结构上
我是一名优秀的程序员,十分优秀!