Символы (Symbol) в Paper.js — это мощный инструмент для
работы с повторяющимися объектами. Основная идея заключается в том,
чтобы создать один исходный объект и многократно использовать его в
сцене, экономя память и ускоряя рендеринг. При работе с большими сценами
и сложной анимацией символы позволяют минимизировать нагрузку на Canvas
и упрощают управление копиями объектов.
Создание символа осуществляется с помощью метода
new Symbol(item). Здесь item может быть любым
объектом Paper.js: Path, Group,
Raster. После создания символа объект можно использовать
многократно:
var circle = new Path.Circle(new Point(50, 50), 20);
circle.fillColor = 'red';
var circleSymbol = new Symbol(circle);
После этого circleSymbol не виден на холсте, он является
шаблоном для экземпляров.
Создание экземпляров производится методом
place():
var instance1 = circleSymbol.place();
instance1.position = new Point(100, 100);
var instance2 = circleSymbol.place();
instance2.position = new Point(200, 100);
Каждый экземпляр (PlacedSymbol) наследует свойства
символа, но имеет собственное положение, масштаб и поворот. При
необходимости можно изменять отдельные свойства экземпляров без влияния
на исходный символ:
position — координаты на холстеrotation — поворот в градусахscale — масштаб относительно оригиналаИзменение исходного объекта символа автоматически обновляет все его экземпляры. Это упрощает управление сценой, если требуется глобальное изменение визуального элемента:
circle.fillColor = 'blue';
circleSymbol.definition = circle;
После этого все экземпляры символа на холсте станут синими. Такая функциональность крайне полезна при динамическом редизайне интерфейсов или создании прототипов с множественными повторяющимися объектами.
Символ может содержать не только один объект, но и группу объектов. Это позволяет создавать сложные композиции и использовать их многократно:
var rect = new Path.Rectangle(new Point(0, 0), new Size(40, 40));
rect.fillColor = 'green';
var circleInGroup = new Path.Circle(new Point(20, 20), 10);
circleInGroup.fillColor = 'yellow';
var group = new Group([rect, circleInGroup]);
var groupSymbol = new Symbol(group);
var groupInstance = groupSymbol.place();
groupInstance.position = new Point(300, 100);
Каждый экземпляр группы ведет себя как единый объект, но при
необходимости можно модифицировать отдельные элементы группы через
доступ к children.
Использование символов значительно ускоряет анимацию, особенно когда требуется множество одинаковых объектов:
function onFrame(event) {
instance1.rotation += 2;
instance2.position.x += 1;
}
Поскольку все экземпляры ссылаются на один исходный объект, изменения его свойств отражаются мгновенно, а Paper.js оптимизирует рендеринг через внутреннее кеширование.
Основные преимущества символов:
При создании сотен или тысяч объектов использование отдельных
Path или Group без символов приводит к
значительному замедлению. Символы решают эту проблему:
for (var i = 0; i < 500; i++) {
var instance = circleSymbol.place();
instance.position = new Point(Math.random() * view.size.width,
Math.random() * view.size.height);
}
Такой подход минимизирует количество реально отрисовываемых объектов, поскольку Paper.js хранит только ссылки на символы и их трансформации.
Symbol#place() — создает экземпляр символаSymbol#definition — доступ к исходному объекту
символаPlacedSymbol#remove() — удаляет экземпляр с холстаPlacedSymbol#bringToFront() / sendToBack()
— управление порядком отрисовкиЭти методы позволяют гибко управлять сценой, комбинируя символы с обычными объектами.
children
для индивидуального контроля частей композиции.Символы в Paper.js являются ключевым инструментом для эффективной работы с графикой и анимацией, обеспечивая баланс между производительностью и гибкостью.