Передача JS ArrayBuffer или TypedArray в Emscripten без копирования

У меня есть очень большой ArrayBuffer (или TypedArray) в JavaScript, который я хочу передать функции с emscript. Я хотел бы передать необработанные байты без копирования.

Если моя функция C/C++ принимает std::string как в:

void processBuffer(std::string const& buffer)

Я могу получить данные, но IIUC, преобразование в std::string повлечет за собой копию буфера.

Есть ли способ передать необработанный буфер без копии?
Мой доступ строго только для чтения.

Я попытался:

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

с настройкой allow_raw_pointers() в EMSCRIPTEN_BINDINGS, но это, похоже, не работает.
Что мне не хватает?


person Adi Shavit    schedule 24.02.2017    source источник
comment
Разве var ptr = Module._malloc(bytes); new Uint8Array(Module.HEAPU8.buffer, ptr, bytes); не лучше, чем new Uint8Array(bytes) в JS?   -  person zakki    schedule 03.03.2017
comment
Да. Если буфер выделяется через Module._malloc() и передается непосредственно функции asm.js, ожидающей char* ptr, он не будет копироваться (как мне любезно объяснили на форуме emscripten). Полный ответ опубликую позже.   -  person Adi Shavit    schedule 03.03.2017
comment
@zakki При чтении данных из сети или записи на холст HTML5 вы не можете использовать предварительно выделенный буфер; буфер выделяется браузером. Очень странно, что у emscripten, похоже, нет прямого доступа к нативным объектам JS, даже в блоках EM_ASM.   -  person HRJ    schedule 05.04.2017
comment
Вы уже видели stackoverflow.com/questions/17883799/?   -  person j4x    schedule 10.04.2017


Ответы (1)


Отвечаю сам себе.
В настоящее время нет способа разрешить коду emscripten C/C++ доступ к буферам памяти, выделенным JS.

При этом буферы, выделенные через Module._malloc(), могут передаваться указателем при использовании C API.

Встраивание добавит дополнительное копирование в типы C++.

Дополнительную информацию см. в этой ветке списка рассылки emscripten. .

person Adi Shavit    schedule 10.04.2017
comment
Я склонен думать, что это должно быть возможно с помощью API файловой системы. - person Jason Rice; 21.02.2018
comment
Я не знаком с этим. Что ты имеешь в виду? Также обратите внимание, что многое могло измениться с тех пор, как об этом спросили и написали, особенно после публикации WASM. - person Adi Shavit; 21.02.2018
comment
Я знаю, что вы можете загрузить большой двоичный файл файла в WorkerFS, но, похоже, нет поддержки произвольного ArrayBuffer (в API файловой системы). Доступ к ним в виде файлов кажется возможным и, возможно, его следует добавить. - person Jason Rice; 21.02.2018