Пул объектов — это паттерн проектирования, позволяющий переиспользовать заранее созданные объекты вместо постоянного их создания и уничтожения. В контексте частиц это критически важно, так как генерация большого количества спрайтов в реальном времени без оптимизации может привести к падению производительности и росту нагрузки на сборщик мусора.
Основная идея пула объектов заключается в поддержании заранее созданного набора объектов (например, спрайтов частиц) в «спящем» состоянии и повторном использовании их при необходимости.
Для работы с пулом объектов чаще всего используется массив или очередь, в которой хранятся все доступные для повторного использования элементы.
class ParticlePool {
constructor(texture, poolSize = 100) {
this.texture = texture;
this.pool = [];
for (let i = 0; i < poolSize; i++) {
const particle = new PIXI.Sprite(this.texture);
particle.visible = false;
this.pool.push(particle);
}
}
acquire() {
for (const particle of this.pool) {
if (!particle.visible) {
particle.visible = true;
return particle;
}
}
// Если все объекты заняты, можно расширять пул динамически
const particle = new PIXI.Sprite(this.texture);
particle.visible = true;
this.pool.push(particle);
return particle;
}
release(particle) {
particle.visible = false;
particle.position.set(0, 0);
particle.alpha = 1;
particle.scale.set(1);
// можно сбросить дополнительные свойства, если они изменяются
}
}
Ключевые моменты:
visible = false позволяет временно убрать объект с
рендеринга без его удаления.acquire() возвращает готовый к использованию объект из
пула.release() сбрасывает объект в исходное состояние и
возвращает в пул.Типичная система частиц создаёт новые объекты при каждом обновлении, что влечёт за собой постоянное создание и удаление спрайтов. С пулом объектов процесс оптимизируется:
const app = new PIXI.Application({ width: 800, height: 600 });
document.body.appendChild(app.view);
const texture = PIXI.Texture.from('particle.png');
const particlePool = new ParticlePool(texture, 200);
const activeParticles = [];
app.ticker.add(() => {
// Обновление активных частиц
for (let i = activeParticles.length - 1; i >= 0; i--) {
const particle = activeParticles[i];
particle.position.x += particle.vx;
particle.position.y += particle.vy;
particle.alpha -= 0.02;
if (particle.alpha <= 0) {
particlePool.release(particle);
activeParticles.splice(i, 1);
}
}
// Создание новых частиц
for (let i = 0; i < 5; i++) {
const particle = particlePool.acquire();
particle.position.set(Math.random() * app.screen.width, Math.random() * app.screen.height);
particle.vx = (Math.random() - 0.5) * 5;
particle.vy = (Math.random() - 0.5) * 5;
particle.alpha = 1;
app.stage.addChild(particle);
activeParticles.push(particle);
}
});
Особенности:
activeParticles хранятся только используемые в данный
момент частицы.pool.acquire() предотвращает постоянное
создание новых объектов и уменьшает нагрузку на сборщик мусора.release()
рекомендуется очищать все изменяемые свойства (позицию, альфа, масштаб,
поворот), чтобы объект возвращался в «чистое» состояние.visible или alpha
эффективнее.Container для групп
частиц, чтобы быстрее управлять их отображением и
скрытием.Паттерн пула объектов является основой для эффективных систем частиц в PixiJS, позволяя создавать динамичные и насыщенные визуальные эффекты без ущерба для производительности.