В PixiJS объект Graphics используется
для отрисовки примитивной геометрии: линий, фигур, кривых и текста.
Однако постоянное создание новых объектов для каждой фигуры в больших
сценах ведёт к значительным потерям производительности.
Повторное использование графических ресурсов позволяет
оптимизировать отрисовку и снизить нагрузку на GPU.
Graphics создаётся через конструктор:
const graphics = new PIXI.Graphics();
Для рисования используются методы вроде:
graphics.beginFill(color, alpha) — начинает заливку
цветом;graphics.lineStyle(width, color, alpha) — устанавливает
параметры линии;graphics.drawRect(x, y, width, height) — рисует
прямоугольник;graphics.drawCircle(x, y, radius) — рисует
окружность;graphics.endFill() — завершает заливку.Каждое изменение свойств Graphics перезаписывает
внутренний буфер, что при множественных объектах вызывает лишние
вычисления.
Для повторного использования геометрии рекомендуется очищать и перерисовывать один объект, вместо создания новых:
graphics.clear();
graphics.beginFill(0xff0000);
graphics.drawCircle(100, 100, 50);
graphics.endFill();
Метод clear() удаляет предыдущие пути, сохраняя сам
объект и его привязку к сцене. Это важно для динамических сцен, где
фигуры меняются каждый кадр.
Для сложной геометрии, которая не меняется, эффективнее создать текстуру один раз и использовать её многократно:
const graphics = new PIXI.Graphics();
graphics.beginFill(0x00ff00);
graphics.drawRect(0, 0, 200, 100);
graphics.endFill();
const texture = app.renderer.generateTexture(graphics);
const sprite = new PIXI.Sprite(texture);
sprite.position.set(300, 200);
app.stage.addChild(sprite);
Преимущества кэширования:
texture для множества
объектов.Для анимации часто применяют один Graphics объект с
динамической геометрией. Пример: движение круга по траектории:
const circle = new PIXI.Graphics();
circle.beginFill(0x0000ff);
circle.drawCircle(0, 0, 50);
circle.endFill();
circle.x = 100;
circle.y = 100;
app.stage.addChild(circle);
app.ticker.add((delta) => {
circle.x += 2 * delta;
circle.y += 1 * delta;
});
Если необходимо изменять форму, лучше использовать
clear() и перерисовывать фигуру на том же объекте, чем
создавать новый Graphics.
При множественных объектах одного типа стоит объединять их через контейнеры и рендерить как один блок. Контейнеры в PixiJS позволяют оптимизировать отрисовку за счёт batching:
const container = new PIXI.Container();
for (let i = 0; i < 50; i++) {
const g = new PIXI.Graphics();
g.beginFill(0xffff00);
g.drawRect(0, 0, 20, 20);
g.endFill();
g.x = i * 25;
container.addChild(g);
}
app.stage.addChild(container);
Можно объединить графику в один Graphics, если геометрия
однотипная, используя массив координат и циклы.
Graphics для динамических фигур.clear() вместо удаления и
создания новых объектов.clear() — сбрасывает текущее содержимое
Graphics;beginFill(color, alpha) / endFill() —
управляют заливкой;lineStyle(width, color, alpha) — задаёт линии для всех
последующих фигур;generateTexture(renderer, scaleMode, resolution) —
превращает графику в текстуру для повторного использования;cacheAsBitmap = true — позволяет рендерить статичную
графику как текстуру внутри рендерера без явного создания
Texture.cacheAsBitmap: для
объектов, которые не изменяются каждый кадр, превращая их в “живую
текстуру” без дополнительных затрат GPU.Эти методы позволяют достигать высокой производительности даже при сложной графике, сохраняя гибкость и контролируемость сцены.