我有一个非常大的ArrayBuffer(或TypedArray)在JavaScript中,我想传递给emscriptened函数。我想传递原始字节而不会产生副本。传递JS ArrayBuffer或TypedArray到Emscripten W/O复制
如果我的C/C++函数接受一个std::string
为:
void processBuffer(std::string const& buffer)
我能得到的数据,但IIUC,转化为std::string
将招致缓冲区的副本。
有没有办法传递未经复制的原始缓冲区?
我的访问权限是严格只读的。
我想:
void processBuffer(const char* str, size_t size);
与在EMSCRIPTEN_BINDINGS
设置allow_raw_pointers()
,但这似乎并没有工作。
我错过了什么?
不是'var ptr = Module._malloc(bytes);新的Uint8Array(Module.HEAPU8.buffer,ptr,字节);'好,而不是'新的Uint8Array(字节)'在JS? – zakki
是的。如果缓冲区是通过'Module._malloc()'分配的,并直接传递给希望有一个'char * ptr'的asm.js函数,它不会产生副本(正如我在emscripten论坛上向我解释的那样)。稍后将发布完整答案。 –
@zakki从网络读取数据或写入HTML5画布时,不能使用预先分配的缓冲区;该缓冲区由浏览器分配。 emscripten似乎没有办法直接访问本地JS对象,甚至在'EM_ASM'块中,这真的很奇怪。 – HRJ