Передача данных с помощью Emscripten Worker API без копирования
Есть ли способ заставить Emscripten передавать, а не копировать данные между веб-работниками и основным потоком пользовательского интерфейса?
Emscripten имеет API, который управляет связью между веб-работниками, который, я считаю, просто использует postMessage
/ onmessage
механизм под капотом. Глядя в исходный код для Emscripten Worker API, кажется, что он не использует transferList
вариант, когда он вызывает postMessage
и поэтому данные копируются.
На самом деле, я думаю, что его копируют как минимум дважды: сначала браузером между потоками, а затем Emscripten, чтобы получить его в управляемом Emscripten пространстве кучи. И если вы хотите, чтобы данные продолжали существовать на принимающей стороне после обратного вызова, их необходимо будет скопировать в третий раз, поскольку в соответствии с документами данные, передаваемые в обратный вызов, гарантированно будут существовать только во время обратного вызова.
Повторяю мой вопрос сверху: есть ли способ получить Emscripten, чтобы избежать всего этого копирования путем передачи, а не копирования данных между веб-работниками и основным потоком пользовательского интерфейса?
1 ответ
Это возможно, если вы используете SharedArrayBuffer. Недавно ребята из Emscripten добавили экспериментальную поддержку pthread в Emscripten, которые используют эту функцию. Однако в настоящее время только Firefox поддерживает SharedArrayBuffers в ночное время, так что пока это не получило широкого распространения.