2017-02-24 78 views
13

我有一個非常大的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(),但這似乎並沒有工作。
我錯過了什麼?

+0

不是'var ptr = Module._malloc(bytes);新的Uint8Array(Module.HEAPU8.buffer,ptr,字節);'好,而不是'新的Uint8Array(字節)'在JS? – zakki

+0

是的。如果緩衝區是通過'Module._malloc()'分配的,並直接傳遞給希望有一個'char * ptr'的asm.js函數,它不會產生副本(正如我在emscripten論壇上向我解釋的那樣)。稍後將發佈完整答案。 –

+0

@zakki從網絡讀取數據或寫入HTML5畫布時,不能使用預先分配的緩衝區;該緩衝區由瀏覽器分配。 emscripten似乎沒有辦法直接訪問本地JS對象,甚至在'EM_ASM'塊中,這真的很奇怪。 – HRJ

回答

0

回答我自己。
就目前而言,沒有辦法允許emscriptened C/C++代碼訪問JS分配的內存緩衝區。

也就是說,使用C API時,通過Module._malloc()分配的緩衝區可以「通過指針」傳遞

Embinding將向C++類型添加額外的複製。

欲瞭解更多信息,請參閱this emscripten郵件列表上的線程。

+0

我想這應該是可能的使用文件系統API。 –

+0

我不熟悉它。你什麼意思?另外請注意,自問題出現以來,事情可能發生了變化,特別是WASM的發佈。 –

+0

我知道你可以在一個WorkerFS中加載一個文件blob,但似乎沒有支持任意ArrayBuffer(在File System API中)。作爲文件訪問它們聽起來是可行的,也許應該添加。 –