Illorian
@Illorian
Front-end разработчик

Как отрисовка area в Canvas используя Web Workers?

У меня есть компонент, который отрисовывает график используя canvas. Из-за большого количества графиков хотелось бы попробовать вынести все расчёты в Web Worker. Насколько я знаю, из другого потока нельзя управлять DOM, но я находил примеры, как это можно сделать с img через drawImage. Может кто-то имеет опыта подобного рода?

Код прост:
private draw() {
        if (!this._data.length || !this.canvas) {
            return;
        }
        let maxX   = this.getMaxX(),
            minX   = this.getMinX(),
            maxY   = this.getMaxY(),
            width  = this.canvas.width,
            height = this.canvas.height,
            ctx    = this.canvas.getContext("2d"),
            ratioY = height / maxY;
        ctx.save();
        ctx.setTransform(1, 0, 0, 1, 0, 0);
        ctx.clearRect(0, 0, width, height);
        ctx.restore();
        ctx.beginPath();
        ctx.fillStyle   = this.colorMap.get(this.status);
        ctx.strokeStyle = this.colorMap.get(this.status);
        ctx.moveTo(width * ((maxX - +this._data[0].time) / (maxX - minX)), height);
        for (let i = 0; i < this._data.length; i++) {
            let d = this._data[i];
            let x = width * ((maxX - +d.time) / (maxX - minX));
            let y = height - (d.value * ratioY);
            ctx.lineTo(x, y);
        }
        ctx.lineTo(width * ((maxX - +this._data[this._data.length - 1].time) / (maxX - minX)), height);
        ctx.lineTo(width * ((maxX - +this._data[0].time) / (maxX - minX)), height);
        ctx.fill();
        ctx.closePath();
        ctx.stroke();
    }
  • Вопрос задан
  • 354 просмотра
Решения вопроса 1
Я бы сначала поработал бы над расчетами, а потом пытался фиксить все "волшебной палочкой" WebWorkers

Я думаю, что тут надо убрать из отрисовки все расчеты, например цикл lineTo можно расчитать отдельно и сделать из этого path2D и отрисовывать уже его https://developer.mozilla.org/en-US/docs/Web/API/P...

После этого сразу уйдет трансформация, как ненужная, тем более save() - restore() довольно дорогая операция, если хочется быстродействия

Ну и еще не лишним было бы внимательно подумать, что объединяет графики и не делать трижды то, что можно посчитать один раз
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@GreatRash
requestAnimationFrame - это тоже воркер :) Да и зачем вам, DOM если у вас канвас?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
22 нояб. 2024, в 00:55
500 руб./за проект
21 нояб. 2024, в 23:30
300000 руб./за проект
21 нояб. 2024, в 22:21
3000 руб./в час