我有一個非常大的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