2017-02-24 45 views
13

emscriptened 함수에 전달하려는 JavaScript에 매우 큰 ArrayBuffer (또는 TypedArray)가 있습니다. 사본을 발생시키지 않고 원시 바이트를 전달하고 싶습니다.JS ArrayBuffer 또는 TypedArray를 Emscripten에 복사없이 복사

내 C는/C++ 기능이 std::string에서 같이 걸리는 경우 : 내가 데이터를 얻을 수 있습니다

void processBuffer(std::string const& buffer) 

하지만 IIUC을 std::string로의 전환이 버퍼의 사본을 부과됩니다.

복사하지 않고 원시 버퍼를 전달하는 방법이 있습니까?
내 접근은 읽기 전용입니다. EMSCRIPTEN_BINDINGSallow_raw_pointers() 설정과

void processBuffer(const char* str, size_t size); 

을,하지만이 작동하지 않습니다

나는 시도했다.
내가 무엇이 누락 되었습니까?

+0

아니야'var ptr = Module._malloc (bytes); 새로운 Uint8Array (Module.HEAPU8.buffer, ptr, bytes);'JS의 새로운 Uint8Array (bytes) 대신 좋은가? – zakki

+0

예. 버퍼가'Module._malloc()'을 통해 할당되고'char * ptr'을 기대하는 asm.js 함수에 직접 넘겨지면 복사본이 생기지 않습니다 (emscripten 포럼에서 친절하게 설명했습니다). 나중에 전체 답변을 게시합니다. –

+0

@zakki 네트워크에서 데이터를 읽거나 HTML5 캔버스에 쓰는 경우 미리 할당 된 버퍼를 사용할 수 없습니다. 버퍼는 브라우저에 의해 할당됩니다. emscripten이 'EM_ASM' 블록 내에서도 원시 JS 객체에 직접 액세스 할 수있는 방법이없는 것 같아서 정말 이상합니다. – HRJ

답변

0

답장을 보내십시오.
현재 emscriptened C/C++ 코드가 JS 할당 메모리 버퍼에 액세스하는 것을 허용 할 방법이 없습니다.

즉, Module._malloc() 을 통해 할당 된 버퍼는 C API를 사용할 때이 "포인터로"전달 될 수 있습니다.

Embinding은 C++ 유형에 추가 복사를 추가합니다.

자세한 내용은 emscripten 메일 링리스트의 this 스레드를 참조하십시오.

+0

파일 시스템 API를 사용하여 이것이 가능해야한다고 생각하고 싶습니다. –

+0

나는 그것에 익숙하지 않다. 무슨 소리 야? 또한 WASM이 발행되고 쓰여진 이후로 상황이 변경되었을 수도 있습니다. –

+0

WorkerFS에서 파일 blob을로드 할 수 있지만 파일 시스템 API에서 임의의 ArrayBuffer에 대한 지원이없는 것 같습니다. 파일로 액세스하는 것이 실현 가능하며 아마도 추가되어야합니다. –