В библиотеке Two.js оптимизация работы с графикой напрямую связана с умением эффективно управлять объектами. Переиспользование объектов позволяет значительно снизить нагрузку на память и ускорить рендеринг, особенно при анимации или работе с большим количеством примитивов.
Каждый графический элемент в Two.js создается через методы, такие как
two.makeRectangle(), two.makeCircle(),
two.makePath() и т.д. При этом возвращается объект типа
Two.Shape или его подкласс, который содержит свойства для
позиционирования, размера, цвета, прозрачности и трансформаций.
Пример создания объекта:
const two = new Two({ width: 800, height: 600 }).appendTo(document.body);
const rectangle = two.makeRectangle(0, 0, 100, 50);
rectangle.fill = '#3498db';
rectangle.stroke = '#2980b9';
rectangle.linewidth = 2;
two.update();
Созданный объект можно модифицировать напрямую через свойства, а
также анимировать с помощью встроенной системы
Two.AnimationFrame.
Two.js предоставляет возможность клонирования объектов через метод
clone(). Это полезно, когда требуется создать несколько
похожих элементов без повторного определения всех параметров
вручную.
const rectClone = rectangle.clone();
rectClone.translation.set(150, 0);
two.add(rectClone);
two.update();
Клон наследует все свойства исходного объекта, включая цвет, трансформации и стиль линии, что экономит время при создании сложных сцен с повторяющимися элементами.
Для динамических сцен, где объекты создаются и удаляются часто, использование пула объектов особенно эффективно. Пул позволяет переиспользовать уже созданные объекты вместо их уничтожения и повторного создания, что снижает количество операций сборки мусора.
Пример реализации простого пула для прямоугольников:
class RectanglePool {
constructor(two) {
this.two = two;
this.pool = [];
}
get(x, y, width, height) {
let rect = this.pool.find(r => !r.active);
if (!rect) {
rect = this.two.makeRectangle(x, y, width, height);
rect.active = true;
this.pool.push(rect);
this.two.add(rect);
} else {
rect.translation.set(x, y);
rect.width = width;
rect.height = height;
rect.active = true;
}
rect.visible = true;
return rect;
}
release(rect) {
rect.active = false;
rect.visible = false;
}
}
const pool = new RectanglePool(two);
const r1 = pool.get(100, 100, 50, 50);
const r2 = pool.get(200, 200, 60, 60);
pool.release(r1);
Пул объектов особенно полезен для анимации частиц, игровых элементов или интерактивных интерфейсов, где множество объектов появляются и исчезают за короткое время.
Объекты в Two.js можно объединять в группы с помощью
Two.Group. Группы позволяют применить трансформации и стили
ко множеству объектов одновременно, без изменения каждого элемента. Это
является еще одной формой переиспользования:
const group = two.makeGroup(rectangle, rectClone);
group.translation.set(300, 100);
group.scale = 1.5;
Изменение позиции, масштаба или вращения группы автоматически применяется ко всем включенным объектам, что снижает дублирование кода и упрощает управление сложными сценами.
Two.js поддерживает циклическое обновление объектов через метод
two.bind('update', callback). При переиспользовании
объектов важно не создавать новые экземпляры в каждом кадре, а обновлять
существующие.
two.bind('update', function(frameCount) {
pool.pool.forEach(rect => {
if (rect.active) {
rect.rotation += 0.01;
}
});
}).play();
Использование пулов и переиспользуемых объектов в связке с циклом обновления позволяет поддерживать высокую производительность при сложных анимациях.
clone() для быстрого копирования объектов
с сохранением стиля.Two.Group для массовых трансформаций и
стилей.visible и
active у объектов, чтобы исключить лишние рендеры.Понимание и грамотное применение переиспользования объектов в Two.js обеспечивает стабильность и высокую производительность, особенно при разработке интерактивных визуализаций и анимаций.