Анимации, построенные на mo.js, могут создавать значительную нагрузку на браузер, особенно при одновременном использовании большого количества объектов, сложных easing-функций и частых перерисовок. Основные симптомы:
Эти признаки указывают на необходимость анализа и оптимизации.
Наиболее точный анализ выполняется через вкладку Performance:
Ключевые метрики:
Позволяет включить:
mo.js использует собственный цикл анимации, основанный на
requestAnimationFrame. Важно понимать:
Пример:
const burst = new mojs.Burst({
count: 100,
radius: { 0: 200 },
duration: 2000
});
burst.play();
Здесь создаётся 100 частиц, каждая из которых обновляется каждый кадр.
Каждый экземпляр (Shape, Burst,
Transit) создаёт нагрузку:
Проблема усиливается при:
mo.js активно работает с DOM/SVG:
Если анимация затрагивает свойства, вызывающие
reflow (например, width,
top), производительность падает.
Пользовательские easing:
easing: 'cubic-bezier(0.23, 1, 0.32, 1)'
или функции:
easing: function (p) {
return Math.sin(p * Math.PI);
}
могут быть вычислительно затратными, особенно при большом числе объектов.
mo.js активно использует SVG:
SVG требует больше ресурсов, чем transform-анимации CSS.
Один из эффективных подходов — отключение частей анимации:
// временно отключаем burst
// burst.play();
shape.play();
Позволяет определить, какой компонент создаёт нагрузку.
console.time('animation');
burst.play();
console.timeEnd('animation');
Даёт базовое представление о времени запуска.
let lastTime = performance.now();
function checkFPS() {
const now = performance.now();
const delta = now - lastTime;
lastTime = now;
console.log(1000 / delta);
requestAnimationFrame(checkFPS);
}
checkFPS();
Позволяет отслеживать реальный FPS.
Вместо:
count: 200
использовать:
count: 50
или комбинировать эффекты.
Предпочтение встроенным easing mo.js:
easing: 'ease.out'
вместо сложных пользовательских функций.
Избегание повторных вычислений:
const radius = 200;
new mojs.Shape({
radius: { 0: radius }
});
Оптимально использовать:
transform: translatescalerotateИзбегать:
top, leftwidth, heightПример:
x: { 0: 100 }
вместо изменения left.
Принудительное использование GPU:
will-change: transform;
или:
style: {
transform: 'translateZ(0)'
}
Позволяет снизить нагрузку на CPU.
shape.stop();
shape.el.remove();
Накопление объектов в DOM приводит к деградации производительности.
Вместо создания новых:
shape.replay();
Группировка через Timeline:
const timeline = new mojs.Timeline();
timeline.add(burst1, burst2, shape);
timeline.play();
Позволяет:
Иногда полезно уменьшить частоту обновлений:
let last = 0;
function loop(time) {
if (time - last > 33) { // ~30 FPS
burst.play();
last = time;
}
requestAnimationFrame(loop);
}
loop();
Остановка анимаций вне области просмотра:
document.addEventListener('visibilitychange', () => {
if (document.hidden) {
timeline.pause();
} else {
timeline.play();
}
});
Вкладка Memory в DevTools позволяет:
Типичная проблема:
mo.js позволяет создавать сложные визуальные эффекты, но:
Грамотный анализ и системный подход позволяют добиться высокой производительности даже в сложных сценариях.