Two.js — библиотека для работы с 2D-графикой на веб-странице, которая использует Canvas, SVG и WebGL как рендереры. Эффективная работа с визуальными объектами напрямую зависит от управления перерисовками, так как каждая перерисовка требует вычислений и обращения к графическому контексту, что влияет на производительность, особенно при анимации большого числа объектов.
upd ate() и render()В Two.js существует явное разделение логики изменения сцены и рендеринга:
upd ate() используется для изменения состояния
объектов (позиция, масштаб, цвет, трансформации).render() отвечает за непосредственную отрисовку
текущего состояния на экране.Перерисовки следует минимизировать за счет накопления всех изменений
и вызова render() один раз за кадр:
two.update();
two.render();
Повторные вызовы render() без необходимости создают
лишнюю нагрузку. Для анимации рекомендуется использовать встроенный
метод two.bind('update', ...) или two.play() с
заранее подготовленными анимациями.
Two.js поддерживает иерархию объектов с помощью Group.
Все элементы внутри группы можно изменять и рендерить как единое целое.
Это уменьшает количество перерисовок отдельных объектов:
let group = two.makeGroup(circle, rectangle, polygon);
group.translation.se t(100, 50);
two.update();
При перемещении группы обновляется только контейнер, а дочерние элементы рендерятся вместе, без отдельного обращения к каждому.
flagReset() и flagSet()Каждый объект Two.js содержит флаги изменений:
needsUpdate — объект изменился, требует
перерисовки.needsLocalUpdate — локальные свойства трансформации
изменились.После внесения изменений в объект желательно использовать метод
flagReset() для сброса флагов, чтобы избежать ненужных
повторных обновлений:
circle.fill = '#ff0000';
circle.flagReset();
two.update();
Two.js работает на основе цикла анимации, используя
requestAnimationFrame. Минимизировать перерисовки при
анимации можно путем:
Two.Shape и Two.Path вместо
создания новых объектов каждый кадр.Пример оптимизированной анимации:
two.bind('upd ate', function(frameCount) {
circle.rotation += 0.01; // изменяем только угол
}).play();
Для сложных форм и путей, которые не изменяются каждый кадр, рекомендуется использовать статические объекты и кэширование их геометрии. Это снижает нагрузку на рендерер и уменьшает количество внутренних вычислений.
let staticPath = two.makePolygon(0, 0, 50, 6);
staticPath.noStroke().fill = '#333';
staticPath.flagReset(); // больше не требует перерисовки
Каждое изменение свойства объекта (цвет, прозрачность, позиция)
помечает объект как dirty. Избыточные изменения увеличивают
число перерисовок. Поэтому:
translation.se t(x, y) вместо прямой
установки translation.x и translation.y по
отдельности.// Плохо
circle.translation.x = 100;
circle.translation.y = 50;
// Хорошо
circle.translation.se t(100, 50);
update(), render() и
флаги flagReset() для контроля перерисовок.bind('update', ...) и изменять минимальный набор
свойств.Эти методы позволяют Two.js работать плавно даже с большим числом объектов, минимизируя нагрузку на графический контекст и повышая производительность интерактивной 2D-графики.