Tôi có một ArrayBuffer rất lớn (hoặc TypedArray) trong JavaScript mà tôi muốn chuyển đến một hàm được viết bằng emscriptened. Tôi muốn chuyển các byte thô mà không cần phải sao chép.Chuyển JS ArrayBuffer hoặc TypedArray tới Emscripten w/o Sao chép
Nếu C của tôi/C++ chức năng phải mất một std::string
như trong:
void processBuffer(std::string const& buffer)
tôi có thể nhận được dữ liệu, nhưng IIUC, chuyển đổi sang std::string
sẽ phải chịu một bản sao của bộ đệm.
Có cách nào để chuyển bộ đệm thô mà không có bản sao không?
Quyền truy cập của tôi hoàn toàn chỉ đọc.
tôi đã cố gắng:
void processBuffer(const char* str, size_t size);
với thiết allow_raw_pointers()
trong EMSCRIPTEN_BINDINGS
, nhưng điều này dường như không làm việc.
Tôi đang thiếu gì?
Không phải là 'var ptr = Module._malloc (byte); Uint8Array mới (Module.HEAPU8.buffer, ptr, bytes); 'tốt, thay vì' new Uint8Array (bytes) 'trong JS? – zakki
Có. Nếu bộ đệm được cấp phát thông qua 'Module._malloc()' và được chuyển trực tiếp tới hàm asm.js, mong đợi một 'char * ptr' nó sẽ không phải là bản sao (như đã giải thích cho tôi về diễn đàn emscripten). Sẽ đăng câu trả lời đầy đủ sau. –
@zakki Khi đọc dữ liệu từ mạng hoặc ghi vào canvas HTML5, bạn không thể sử dụng bộ đệm được phân bổ trước; bộ đệm được trình duyệt phân bổ. Thật kỳ lạ khi emscripten dường như không có cách nào để truy cập trực tiếp vào các đối tượng JS gốc, ngay cả trong các khối 'EM_ASM'. – HRJ