pixijs/pixijs-skillsMIT1 file

Pixijs Scene Particle Container

Use this skill when rendering thousands of lightweight sprites in PixiJS v8. Covers ParticleContainer with Particle instances, addParticle/removeParticle, particleChildren array, dynamicProperties (vertex, position, rotation, uvs, color), boundsArea, roundPixels, update, inherited alpha/tint/blendMode from ancestors. Triggers on: ParticleContainer, Particle, IParticle, addParticle, particleChildren, dynamicProperties, boundsArea, particle effects, particle alpha, particle tint, fade particles, constructor options, ParticleContainerOptions, ParticleOptions.

Specification
Skill ID
pixijs/pixijs-skills/pixijs-scene-particle-container
Publisher
pixijs
Repository
pixijs-skills
Installs
0
Files
1
License
MIT
Synced
Sep 23, 2026
How to use it

Open any RiverX project, open the Skills panel in the chat, and search for this identifier. The files are fetched from the source repository at install time.

pixijs/pixijs-skills/pixijs-scene-particle-containerInstalls these files
  • SKILL.md

What this skill tells the agent

ParticleContainer is a specialized container for rendering hundreds to tens of thousands of lightweight sprites in a single draw call. Use it for particle effects, bullet patterns, or any case where you need a large number of similar-looking objects with minimal per-object overhead. Particles share a single base texture and have a restricted transform set; they are not full Container children.

Assumes familiarity with pixijs-scene-core-concepts. ParticleContainer is a special leaf in a different sense: it contains Particle instances in its own particleChildren array and rejects normal PixiJS children. Use addParticle, not addChild, and wrap the whole ParticleContainer in a Container if you need to group it with other scene objects.

The Particle API is new in v8 but is stable for production use.

Quick Start

const texture = await Assets.load("particle.png");

const container = new ParticleContainer({
  texture,
  boundsArea: new Rectangle(0, 0, app.screen.width, app.screen.height),
  dynamicProperties: {
    position: true,
    rotation: false,
    color: false,
  },
});

for (let i = 0; i < 10000; i++) {
  container.addParticle(
    new Particle({
      texture,
      x: Math.random() * app.screen.width,
      y: Math.random() * app.screen.height,
    }),
  );
}

app.stage.addChild(container);

Related skills: pixijs-scene-core-concepts (scene graph basics), pixijs-scene-sprite (when you need full features per object), pixijs-assets (shared textures, atlases), pixijs-performance (batching, texture optimization), pixijs-scene-container (wrap with other display objects).

Constructor options

ParticleContainerOptions

All Container options (position, scale, tint, label, filters, zIndex, etc.) are also valid here — see skills/pixijs-scene-core-concepts/references/constructor-options.md. Note that children is omitted: use particles instead.

OptionTypeDefaultDescription
textureTexturenullShared base texture for all particles. If omitted, the container falls back to the texture of the first particle added; every particle must share the same base texture source.
particlesT[][]Initial array of Particle (or IParticle) instances. Equivalent to calling addParticle for each, but skips per-call view updates.
dynamicPropertiesParticleProperties{ vertex: false, position: true, rotation: false, uvs: false, color: false }Flags for which particle attributes re-upload to the GPU every frame. Only position is dynamic by default; mark what you animate, leave the rest static for speed.
roundPixelsbooleanfalseRounds particle positions to the nearest pixel. Produces crisper rendering for pixel-art styles at the cost of smooth sub-pixel motion.
shaderShaderdefault particle shaderReplaces the default particle shader. The custom shader must declare aPosition, aUV, aColor, plus any dynamic-only attributes enabled via dynamicProperties.

boundsArea is inherited from Container but is effectively required on ParticleContainer: the container returns empty bounds (0, 0, 0, 0) by default for performance, so without boundsArea it is culled as invisible when culling is active and containsPoint always misses.

ParticleOptions

Particle is a lightweight struct, not a Container subclass — none of the ContainerOptions fields apply. The full option list:

OptionTypeDefaultDescription
textureTexture—Required. Texture used to render this particle. All particles in the same ParticleContainer must share the same base texture source.
xnumber0X position in the container's local space.
ynumber0Y position in the container's local space.
scaleXnumber1Horizontal scale factor.
scaleYnumber1Vertical scale factor.
anchorXnumber0Horizontal anchor in 0–1 range; 0 is left, 0.5 is center, 1 is right.
anchorYnumber0Vertical anchor in 0–1 range; 0 is top, 0.5 is center, 1 is bottom.
rotationnumber0Rotation in radians.
tintColorSource0xffffffTint color as hex number or CSS color string. Combined with alpha into the internal color field.
alphanumber1Transparency (0–1). Values outside the range are clamped. Combined with tint into the internal color field.

The constructor also accepts a bare Texture as its sole argument (new Particle(texture)), which is shorthand for new Particle({ texture }) using the defaults above.

Particle.defaultOptions is a static object you can reassign to change defaults globally; see the "Particle creation" section below.

Core Patterns

Particle creation

const particle = new Particle({
  texture,
  x: 100,
  y: 200,
  scaleX: 0.5,
  scaleY: 0.5,
  anchorX: 0.5,
  anchorY: 0.5,
  rotation: Math.PI / 4,
  tint: 0xff0000,
  alpha: 0.8,
});

container.addParticle(particle);

Particle is a lightweight struct with flat numeric fields: x, y, scaleX, scaleY, anchorX, anchorY, rotation, color, texture. It also exposes tint (hex/CSS color) and alpha (0-1) as setters that combine into the internal color field. No transform hierarchy, no events, no filters.

You can pass a Texture directly as the sole argument: new Particle(texture).

Override Particle.defaultOptions to change defaults globally:

Particle.defaultOptions = {
  ...Particle.defaultOptions,
  anchorX: 0.5,
  anchorY: 0.5,
};

Pre-populating with the particles option

const particles = Array.from(
  { length: 10000 },
  () =>
    new Particle({
      texture,

More from pixijs

Use this skill in a project

Open any RiverX project, search the Skills panel for pixijs/pixijs-skills/pixijs-scene-particle-container, and install it in one click.

Use this skill