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