Делаю симуляцию, где нужно каждый кадр совершать расчет
(в идеале 60 FPS, ну или хотя бы 30 FPS)
Решил потыкать воркеры, т.к. давно хотел, и спустя внушительный рефакторинг, перенеся весь алгоритм в воркер, я получил 0.5 FPS при изначальных 60 FPS в основном потоке, весело))
Детали:
- Запросы к воркеру предельно минимизированы
- Изучал профайлер, так что точно уверен, что тот же самый код в воркере выполняется значительно медленнее
- Единственный постоянный запрос - это ответ в main-thread, однако передается там только ArrayBuffer способом Transferable
Предположение: Возможно, я не правильно использую воркер, конкретно, он имеет в своем скоупе состояние, которое и обновляется независимо, и его результат уже посылается в
main-thread:
import WorkerLiquid from './liquid';
const liquid = new WorkerLiquid(self); // Собственно, состояние
self.onmessage = function (event) {
const [methodid, args] = event.data;
liquid.methodsList[methodid](...args);
};
Вопросы:
- Неужели воркер в своей сути - это не полноценная среда JS, но в другом потоке? (Видимо, я перепутал в нодовскими кластерами)
- Какие есть нюансы в работе воркера?
- Если воркер дожен быть только простой функцией, то допустимо ли создавать набор из пр. 5-20 воркеров?
УПД: Проверил соотношение перфоманса мейн треда к воркеру, профайлер говорит, что "время таска" (т.е. одного кадра) в мейне - 6мс, в воркере 120мс, что за магия такая))
УПД №2: А так же воркер дает еще и лютые деффекты в вычислениях