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.
- Skill ID
- pixijs/pixijs-skills/pixijs-scene-particle-container
- Publisher
- pixijs
- Repository
- pixijs-skills
- Installs
- 0
- Files
- 1
- License
- MIT
- Synced
- Sep 23, 2026
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.
| Option | Type | Default | Description |
|---|---|---|---|
texture | Texture | null | Shared 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. |
particles | T[] | [] | Initial array of Particle (or IParticle) instances. Equivalent to calling addParticle for each, but skips per-call view updates. |
dynamicProperties | ParticleProperties | { 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. |
roundPixels | boolean | false | Rounds particle positions to the nearest pixel. Produces crisper rendering for pixel-art styles at the cost of smooth sub-pixel motion. |
shader | Shader | default particle shader | Replaces 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:
| Option | Type | Default | Description |
|---|---|---|---|
texture | Texture | — | Required. Texture used to render this particle. All particles in the same ParticleContainer must share the same base texture source. |
x | number | 0 | X position in the container's local space. |
y | number | 0 | Y position in the container's local space. |
scaleX | number | 1 | Horizontal scale factor. |
scaleY | number | 1 | Vertical scale factor. |
anchorX | number | 0 | Horizontal anchor in 0–1 range; 0 is left, 0.5 is center, 1 is right. |
anchorY | number | 0 | Vertical anchor in 0–1 range; 0 is top, 0.5 is center, 1 is bottom. |
rotation | number | 0 | Rotation in radians. |
tint | ColorSource | 0xffffff | Tint color as hex number or CSS color string. Combined with alpha into the internal color field. |
alpha | number | 1 | Transparency (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.
