Веб-работник с веб-сборкой в ​​качестве основных обратных вызовов l oop и javascript - PullRequest
0 голосов
/ 27 февраля 2020

Я портирую приложение, которое генерирует графические кадры для отображения. Подумайте что-нибудь в русле игры жизни. Основной 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 вызываю веб-сборку, что, как я понимаю, также заблокирует получение новых сообщений. Не будет простоя, пока веб-сборка не заработает.

1 Ответ

0 голосов
/ 27 февраля 2020

Основная проблема заключается в том, что ваш код моделирования выполняет и выводит кадры гораздо быстрее, чем браузер может их отобразить (а также экран вашего компьютера). Перемещение кода симуляции не является решением этой проблемы.

Вам необходимо переосмыслить способ выполнения симуляции. Вы должны обновить свой код так, чтобы он экспортировал функцию 'tick', которая при выполнении генерирует следующий кадр в вашей имитации.

Браузер предоставляет API requestAnimationFrame , который вызывается перед каждым перекрашивать. Это позволяет синхронизироваться с дисплеем. Вы можете использовать это, чтобы выполнить вашу функцию 'галочки' и отобразить вывод на экран.

...