Передача данных с помощью Emscripten Worker API без копирования

Есть ли способ заставить Emscripten передавать, а не копировать данные между веб-работниками и основным потоком пользовательского интерфейса?

Emscripten имеет API, который управляет связью между веб-работниками, который, я считаю, просто использует postMessage / onmessage механизм под капотом. Глядя в исходный код для Emscripten Worker API, кажется, что он не использует transferList вариант, когда он вызывает postMessage и поэтому данные копируются.

На самом деле, я думаю, что его копируют как минимум дважды: сначала браузером между потоками, а затем Emscripten, чтобы получить его в управляемом Emscripten пространстве кучи. И если вы хотите, чтобы данные продолжали существовать на принимающей стороне после обратного вызова, их необходимо будет скопировать в третий раз, поскольку в соответствии с документами данные, передаваемые в обратный вызов, гарантированно будут существовать только во время обратного вызова.

Повторяю мой вопрос сверху: есть ли способ получить Emscripten, чтобы избежать всего этого копирования путем передачи, а не копирования данных между веб-работниками и основным потоком пользовательского интерфейса?

1 ответ

Это возможно, если вы используете SharedArrayBuffer. Недавно ребята из Emscripten добавили экспериментальную поддержку pthread в Emscripten, которые используют эту функцию. Однако в настоящее время только Firefox поддерживает SharedArrayBuffers в ночное время, так что пока это не получило широкого распространения.

Другие вопросы по тегам