2017-02-24 16 views
13

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ì?

+0

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

+0

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. –

+0

@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

Trả lời

0

Trả lời bản thân.
Vì nó hiện đang đứng, không có cách nào để cho phép mã C/C++ được soạn thảo để truy cập bộ đệm bộ đệm được cấp phát JS.

Điều đó đang được nói, bộ đệm được cấp phát qua Module._malloc() có thể được chuyển "bằng con trỏ" khi sử dụng API C.

Việc gắn kết sẽ thêm bản sao bổ sung vào các loại C++.

Để biết thêm thông tin, hãy xem this luồng trên danh sách gửi thư emscripten.

+0

Tôi bị cám dỗ khi nghĩ rằng điều này có thể thực hiện được bằng API hệ thống tệp. –

+0

Tôi không quen với nó. Ý anh là gì? Cũng lưu ý rằng mọi thứ có thể đã thay đổi kể từ khi được hỏi và viết, đặc biệt là việc xuất bản WASM. –

+0

Tôi biết bạn có thể tải một tập tin blob trong một WorkerFS, nhưng dường như không có hỗ trợ cho một ArrayBuffer tùy ý (trong File System API). Truy cập chúng như các tập tin âm thanh khả thi và có lẽ nên được thêm vào. –

Các vấn đề liên quan