Я портирую приложение, которое генерирует графические кадры для отображения. Подумайте что-нибудь в русле игры жизни. Основной l oop глубоко вложен, и я компилирую C -программу в веб-сборку. В C -программе я делаю обратные вызовы к javascript с использованием EM_ASM следующим образом:
EM_ASM({
SysDrawMap($0, $1, $2);
}, (int)Used.MapWidth, (int)Used.MapHeight, imagedata);
Это работает. Я получаю кадр и могу сделать это. Проблема в том, что это блокирует основной поток, поэтому я никогда не вижу результат, и браузер блокируется до завершения симуляции.
Итак, я переместил код веб-работнику и заставил его загрузить C -программу и опубликовать изображения в главном потоке, используя систему очередей postMessage. На главной ветке я получил изображения и обновил холст. Этот вид работал. Проблема в том, что рабочий создавал кадры слишком быстро и заполнял очередь изображениями (огромное потребление памяти), и основной поток зашел в тупик, пытаясь получить изображения.
Так что я должен каким-то образом ограничить производящую сторону, но не в способ, который вызывает слишком большое замедление. Я думаю о буфере очереди 5-10 кадров, но как я могу это сделать, не переписывая основные l oop (s)?
В работнике, когда он отправляет изображения в очередь, он не может получать сообщения, так как управление возвращается непосредственно к C -программе, и пока он работает, работник все равно не будет получать сообщения.
Я даже не могу сделать кнопку паузы, так как веб-сборка работает на полной скорости без какого-либо знания о сообщениях в очереди. И, похоже, нет способа проверить количество сообщений в очереди и с обеих сторон.
Боюсь, мое единственное решение - переписать C -программу глубоко вложенных циклов, чтобы я мог вызвать от javascript до веб-сборки и генерируется 1 кадр. Но решит ли это это? У меня будет бесконечный вызов, пока я oop вызываю веб-сборку, что, как я понимаю, также заблокирует получение новых сообщений. Не будет простоя, пока веб-сборка не заработает.