Как добиться наилучшей производительности при анимации SVG (падение кадров в секунду при наведении курсора мыши)

#javascript #performance #animation #svg #transform

#javascript #Производительность #Анимация #svg #преобразование

Вопрос:

я создал свои кадры анимации, используя SVG и функцию transform inside requestAnimationFrame() :

 moveSVG: () => {
            if (Melo.onAir) {
                const N = 4 * 60 / Melo.tempo;
                const beatLen = 1 / 16 * N;
                const c16 = 16 * Melo.measures;
                let diff = Melo.nextBeat   (Melo.audioContext.currentTime - Melo.nextWhen) / beatLen;
                while (diff < 0) {
                    diff = diff   c16;
                }
                if (diff > Melo.songLength - 1) {
                    diff = Melo.songLength - 1
                }
                const tapSize = Melo.tapSize
                const y = diff * tapSize;
                Melo.yPos = y;
                const yVal = `translate(0 ${-y - tapSize})`;
                Melo.linesGroup.setAttribute("transform", yVal);
                const telorans = tapSize;
                class animated {
                    constructor(element, beat) {
                        this.element = element
                        this.mover();
                        this.remover(beat);
                    }
                    mover() {
                        this.element.forEach(elem => {
                            this.ele = elem.ele;
                            this.len = elem.len;
                            this.beg = elem.beg - tapSize;
                            this.end = elem.end;
                            this.note = elem.pitch;
                            let newPos = (y - this.end)   this.len   tapSize;
                            if (newPos > this.len) newPos = this.len;
                            if (newPos > -tapSize amp;amp; newPos < tapSize) {
                                this.score(newPos);
                            }
                            this.animation(newPos)
                        })
                    }
                    animation(newPos) {
                        const eleG = this.ele.children.group;
                        eleG.children[1].style.fill = 'red';
                        eleG.setAttribute('style', `transform: translateY(${newPos}px)`);
                    }
                    remover(beat) {
                        if (y > this.element[0].end || !Melo.onAir) {
                            Melo.anime = Melo.anime.filter(item => item !== beat);
                        }
                    }
                }
                Melo.anime.forEach(beat => {
                    let notes = Melo.noteProg[beat];
                    if (notes) {
                        new animated(notes, beat)
                    }
                });
            }
            requestAnimationFrame(Melo.moveSVG)
    }
  

все отлично работает со скоростью ~ 60 кадров в секунду до наведения курсора мыши на элементы SVG!

я сделал gif, чтобы показать это :

Падение кадров в секунду при наведении курсора мыши
введите описание изображения здесь

затем я провел еще один тест без анимации и с учетом загрузки моего процессора :

Загрузка процессора при наведении курсора мыши
введите описание изображения здесь

и у меня нет никакого события мыши на моих элементах svg!

я думаю, что это нормально для браузера проверять события! idk, но что я могу сделать для достижения наилучшей производительности без снижения кадров в секунду в моих анимациях, это способ удалить все из элементов svg? чтобы получить лучшую производительность?

или я должен использовать другой способ сделать это?

РЕДАКТИРОВАТЬ: я провел свой тест на Windows 10 и Google Chrome 84, мне нужен лучший способ для работы во всех операционных системах и браузерах!

Комментарии:

1. Наилучшая производительность в каком браузере, в какой операционной системе, в какой версии этих двух? Это не простой вопрос, потому что здесь слишком много переменных. Хотя вы, вероятно, сочтете использование CSS / SMIL более производительным, чем javascript.

2. в каждом браузере и каждой операционной системе.

3. Хорошо, установите их все и протестируйте их все.

4. Как я могу использовать CSS / SMIL на JavaScript, потому что мне нужно перемещать элементы при событии нажатия клавиши.

5. Смотрите строку 5 в w3.org/Graphics/SVG/Test/20110816/harness/htmlObjectApproved / … если это не подходит, то вам нужно будет использовать javascript для нажатия клавиш, но вы все равно можете запускать анимацию SMIL / CSS с помощью javascript.