#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.