ParticleContainer в PixiJS представляет собой
специализированный контейнер для работы с большим количеством однотипных
спрайтов, оптимизированный по производительности. Основное назначение
этого класса — рендеринг тысяч и десятков тысяч объектов с минимальными
затратами ресурсов графического процессора. В отличие от обычного
Container, который подходит для разнообразных сцен с
уникальными элементами, ParticleContainer сфокусирован на
массовых визуальных эффектах, таких как частицы огня,
снега, пыли, дождя или эффекты взрывов.
Ключевой принцип оптимизации заключается в том, что все дочерние спрайты отрисовываются одним draw call при условии, что их текстуры и режимы рендеринга совпадают. Это позволяет значительно снизить нагрузку на GPU при анимации тысяч элементов одновременно.
Для создания контейнера используется конструктор:
const particleContainer = new PIXI.ParticleContainer(maxSize, options);
Параметры:
maxSize — максимальное количество спрайтов, которое
контейнер может содержать. Этот параметр используется для
предварительного выделения памяти и оптимизации рендеринга.options — объект с флагами, указывающими, какие
свойства спрайтов будут обновляться. Поддерживаются следующие
ключи:{
scale: true, // разрешает масштабирование спрайтов
position: true, // разрешает изменение позиции
rotation: false, // разрешает вращение
uvs: false, // изменение текстурных координат
alpha: true // изменение прозрачности
}
По умолчанию большинство свойств отключены для экономии ресурсов. Включение каждого свойства увеличивает гибкость, но снижает производительность.
Ограниченные возможности трансформации
rotation) и масштабирование
(scale) работают только при включении соответствующих
флагов при создании контейнера.Поддержка текстур
События и взаимодействие
ParticleContainer не поддерживает интерактивность
дочерних спрайтов на уровне контейнера. Для кликабельных частиц
потребуется отдельный подход с использованием обычных
Sprite внутри стандартного Container.Прозрачность и порядок отрисовки
alpha может быть включено, но изменение
прозрачности большого количества спрайтов может влиять на
производительность.Дочерние элементы добавляются стандартными методами
addChild и removeChild:
particleContainer.addChild(sprite);
particleContainer.removeChild(sprite);
Для массового добавления элементов рекомендуется использовать пакетное добавление перед рендерингом, чтобы избежать лишних операций GPU:
const sprites = [];
for (let i = 0; i < maxParticles; i++) {
const sprite = new PIXI.Sprite(texture);
sprite.position.set(Math.random() * width, Math.random() * height);
sprites.push(sprite);
}
particleContainer.addChild(...sprites);
Для анимации частиц следует заранее активировать необходимые свойства
через options. Например:
const container = new PIXI.ParticleContainer(1000, { position: true, scale: true, alpha: true });
Обновление свойств производится напрямую у спрайтов:
sprite.x += 1;
sprite.y += 0.5;
sprite.alpha -= 0.01;
sprite.scale.set(1.2);
Без включения соответствующего флага эти изменения не отобразятся в рендеринге.
maxSize. Увеличение контейнера в процессе работы снижает
производительность.addChild или
removeChild.Container или комбинировать оба
подхода.ParticleContainer,
работают, но могут снизить оптимизацию draw calls.ParticleContainer с нужными флагами.options.ParticleContainer — это специализированный инструмент
для создания массовых визуальных эффектов с высокой
производительностью, но с ограничениями по гибкости и интерактивности.
Правильное использование флагов и структурирование спрайтов позволяет
рендерить десятки тысяч объектов без значительной нагрузки на GPU.