emscriptened 함수에 전달하려는 JavaScript에 매우 큰 ArrayBuffer (또는 TypedArray)가 있습니다. 사본을 발생시키지 않고 원시 바이트를 전달하고 싶습니다.JS ArrayBuffer 또는 TypedArray를 Emscripten에 복사없이 복사
내 C는/C++ 기능이 std::string
에서 같이 걸리는 경우 : 내가 데이터를 얻을 수 있습니다
void processBuffer(std::string const& buffer)
하지만 IIUC을 std::string
로의 전환이 버퍼의 사본을 부과됩니다.
복사하지 않고 원시 버퍼를 전달하는 방법이 있습니까?
내 접근은 읽기 전용입니다. EMSCRIPTEN_BINDINGS
에 allow_raw_pointers()
설정과
void processBuffer(const char* str, size_t size);
을,하지만이 작동하지 않습니다
나는 시도했다.내가 무엇이 누락 되었습니까?
아니야'var ptr = Module._malloc (bytes); 새로운 Uint8Array (Module.HEAPU8.buffer, ptr, bytes);'JS의 새로운 Uint8Array (bytes) 대신 좋은가? – zakki
예. 버퍼가'Module._malloc()'을 통해 할당되고'char * ptr'을 기대하는 asm.js 함수에 직접 넘겨지면 복사본이 생기지 않습니다 (emscripten 포럼에서 친절하게 설명했습니다). 나중에 전체 답변을 게시합니다. –
@zakki 네트워크에서 데이터를 읽거나 HTML5 캔버스에 쓰는 경우 미리 할당 된 버퍼를 사용할 수 없습니다. 버퍼는 브라우저에 의해 할당됩니다. emscripten이 'EM_ASM' 블록 내에서도 원시 JS 객체에 직접 액세스 할 수있는 방법이없는 것 같아서 정말 이상합니다. – HRJ