Pixijs Performance
netaart/cohub
A skill your agent uses when profiling or optimizing a PixiJS v8 app for FPS, draw calls, or GPU memory.
A skill your agent uses when profiling or optimizing a PixiJS v8 app for FPS, draw calls, or GPU memory.
$ npx skills add pixijs/pixijs-skills --skill pixijs-performance -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install pixijs/pixijs-skills pixijs-performance --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/pixijs/pixijs-skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/pixijs-performance .claude/skills/pixijs-performance && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "pixijs-performance" agent skill from https://github.com/pixijs/pixijs-skills/tree/main/skills/pixijs-performance into .claude/skills/pixijs-performance/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "pixijs-performance", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/pixijs/pixijs-skills/tree/main/skills/pixijs-performanceType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add pixijs/pixijs-skills --skill pixijs-performance -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install pixijs/pixijs-skills pixijs-performance --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/pixijs/pixijs-skills.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/pixijs-performance .agents/skills/pixijs-performance && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "pixijs-performance" agent skill from https://github.com/pixijs/pixijs-skills/tree/main/skills/pixijs-performance into .agents/skills/pixijs-performance/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "pixijs-performance", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add pixijs/pixijs-skills --skill pixijs-performance -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install pixijs/pixijs-skills pixijs-performance --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/pixijs/pixijs-skills.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/pixijs-performance .cursor/skills/pixijs-performance && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "pixijs-performance" agent skill from https://github.com/pixijs/pixijs-skills/tree/main/skills/pixijs-performance into .cursor/skills/pixijs-performance/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "pixijs-performance", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/pixijs/pixijs-skills.git --path skills/pixijs-performance--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add pixijs/pixijs-skills --skill pixijs-performance -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install pixijs/pixijs-skills pixijs-performance --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/pixijs/pixijs-skills.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/pixijs-performance .gemini/skills/pixijs-performance && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "pixijs-performance" agent skill from https://github.com/pixijs/pixijs-skills/tree/main/skills/pixijs-performance into .gemini/skills/pixijs-performance/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "pixijs-performance", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install pixijs/pixijs-skills pixijs-performanceInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add pixijs/pixijs-skills --skill pixijs-performance -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/pixijs/pixijs-skills.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/pixijs-performance .github/skills/pixijs-performance && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "pixijs-performance" agent skill from https://github.com/pixijs/pixijs-skills/tree/main/skills/pixijs-performance into .github/skills/pixijs-performance/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "pixijs-performance", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add pixijs/pixijs-skills --skill pixijs-performance -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install pixijs/pixijs-skills pixijs-performance --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/pixijs/pixijs-skills.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/pixijs-performance .opencode/skills/pixijs-performance && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "pixijs-performance" agent skill from https://github.com/pixijs/pixijs-skills/tree/main/skills/pixijs-performance into .opencode/skills/pixijs-performance/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "pixijs-performance", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
pixijs-performanceA skill your agent uses when profiling or optimizing a PixiJS v8 app for FPS, draw calls, or GPU memory.
Pixijs Performance is an agent skill from pixijs/pixijs-skills. Use this skill when profiling or optimizing a PixiJS v8 app for FPS, draw calls, or GPU memory. Covers destroy patterns (cacheAsTexture(false), releaseGlobalResources), GCSystem and TextureGCSystem, PrepareSystem, object pooling, batching rules, BitmapText for dynamic text, culling (Culler, CullerPlugin, cullable, cullArea), resolution/antialias tradeoffs, low-level wins (transient MSAA render textures, render bundles, partial buffer updates). Triggers on: FPS, jank, draw calls, batching, object pool, GCSystem…
Its SKILL.md is about 4.6k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Development, covering Performance optimization and Mobile performance. The repository describes itself as: Official AI skills for PixiJS. These skills teach AI coding agents how to correctly use PixiJS. The licence is MIT.
Read from SKILL.md and the folder at commit 83760c6. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
No scripts in the folder and no shell commands in SKILL.md (its code samples are typescript).
From the folder's file list and the shell code blocks in SKILL.md.
Links to these hosts (documentation or services it may open):
pixijs.downloadFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Pixijs Performance loads about 4.6k tokens when it runs. Until then it costs about 179 tokens; SKILL.md has 1,344 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from pixijs/pixijs-skills at commit 83760c6, republished under its MIT licence (© pixijs). 1,344 words, ~4,598 tokens.
.claude/skills/pixijs-performance/SKILL.md (or your agent's skills folder).Profile before optimizing. PixiJS handles a lot of content well out of the box; browser DevTools Performance + GPU profiling should be your first move. Once you've found the bottleneck, apply the targeted pattern below (destroy, pool, batch, cache, or cull).
container.cacheAsTexture(true);
container.updateCacheTexture();
container.cacheAsTexture(false);
container.destroy({ children: true });
import { CullerPlugin, extensions } from "pixi.js";
extensions.add(CullerPlugin);
offscreenContainer.cullable = true;
offscreenContainer.cullArea = new Rectangle(0, 0, 256, 256);
// Tune GC via init options (ms). The `textureGC.*` properties are
// deprecated since 8.15.0 — use these on the Application init instead.
await app.init({ gcMaxUnusedTime: 60_000, gcFrequency: 30_000 });Related skills: pixijs-scene-container (destroy options), pixijs-scene-core-concepts (render groups, layers, culling), pixijs-scene-text (BitmapText for dynamic content), pixijs-assets (atlasing), pixijs-custom-rendering (custom batchers).
import { Sprite, Assets } from "pixi.js";
const texture = await Assets.load("character.png");
const sprite = new Sprite(texture);
// Destroy sprite only (preserve texture for reuse)
sprite.destroy();
// Destroy sprite AND its texture
sprite.destroy({ children: true, texture: true, textureSource: true });When done with a loaded asset entirely:
Assets.unload("character.png");This removes it from the cache and unloads the GPU resource.
Objects you build for custom rendering clean up the same way: call geometry.destroy() and renderTarget.destroy() on the ones you create. Destroying a container also destroys the batchers cached for its render group.
import { Application } from "pixi.js";
// Correct destroy that cleans global pools
app.destroy({ releaseGlobalResources: true });
const newApp = new Application();
await newApp.init({ width: 800, height: 600 });Without releaseGlobalResources: true, pooled objects (batches, textures) from the old app leak into the new one, causing flickering and corruption.
PixiJS auto-collects unused textures and GPU resources (including WebGPU bind groups) via GCSystem. Defaults: checks every 30 seconds, removes resources idle for 60 seconds. These are time-based (milliseconds).
import { Application } from "pixi.js";
const app = new Application();
await app.init({
gcActive: true,
gcMaxUnusedTime: 120000, // idle time before cleanup in ms (default: 60000)
gcFrequency: 60000, // check interval in ms (default: 30000)
});For manual control:
texture.source.unload(); // immediate GPU memory releaseUpload textures and graphics to GPU before rendering to avoid first-frame hitches:
import "pixi.js/prepare";
import { Application, Assets } from "pixi.js";
const app = new Application();
await app.init();
// Don't render until assets are uploaded
app.stop();
const texture = await Assets.load("large-scene.png");
// Upload to GPU ahead of time
await app.renderer.prepare.upload(app.stage);
// Now rendering won't hitch on first frame
app.start();prepare.upload() accepts a Container (uploads all textures, text, and graphics in the subtree) or individual resources.
cacheAsTexture() renders a container's subtree to a single texture, reducing draw calls for complex static content. Internally it creates a render group and caches the result.
When to use:
Tradeoffs:
updateCacheTexture() after modifying childrenimport type { WebGLRenderer, WebGPURenderer } from "pixi.js";
// Available after renderer/app init on both backends
const maxTextureSize = renderer.name === "webgpu"
? (renderer as WebGPURenderer).gpu.device.limits.maxTextureDimension2D
: (renderer as WebGLRenderer).gl.getParameter(WebGL2RenderingContext.MAX_TEXTURE_SIZE);import { Container, Sprite } from "pixi.js";
const panel = new Container();
// ... add many static children ...
panel.cacheAsTexture(true);
// With options
panel.cacheAsTexture({ resolution: 2, antialias: true });
// Refresh after changes
panel.updateCacheTexture();
// MUST disable before destroying (see Common Mistakes below)
panel.cacheAsTexture(false);
panel.destroy();Avoid: toggling on/off repeatedly (constant re-caching negates benefits), caching sparse containers (negligible gain), caching containers larger than 4096x4096.
Reuse objects by changing their properties instead of destroy/recreate:
import { Sprite, Container, Texture } from "pixi.js";
class BulletPool {
private _pool: Sprite[] = [];
private _container: Container;
constructor(container: Container) {
this._container = container;
}
public get(texture: Texture): Sprite {
let bullet = this._pool.pop();
if (!bullet) {
bullet = new Sprite(texture);
this._container.addChild(bullet);
}
bullet.texture = texture;
bullet.position.set(0, 0);
bullet.rotation = 0;
bullet.scale.set(1);
bullet.alpha = 1;
bullet.tint = 0xffffff;
bullet.blendMode = "normal";
bullet.visible = true;
return bullet;
}
public release(bullet: Sprite): void {
bullet.visible = false;
this._pool.push(bullet);
}
}Destroying and recreating is significantly more expensive than toggling visible and updating properties. GPU resources stay allocated; only scene graph visibility changes.
PixiJS batches similar consecutive objects into single draw calls. Batch breaks occur on:
Optimize draw order:
import { Sprite, Graphics, Container } from "pixi.js";
// 4 draw calls: type alternates
const bad = new Container();
bad.addChild(new Sprite(t1));
bad.addChild(new Graphics().rect(0, 0, 10, 10).fill(0xff0000));
bad.addChild(new Sprite(t2));
bad.addChild(new Graphics().rect(0, 0, 10, 10).fill(0x00ff00));
// 2 draw calls: types grouped
const good = new Container();
good.addChild(new Sprite(t1));
good.addChild(new Sprite(t2));
good.addChild(new Graphics().rect(0, 0, 10, 10).fill(0xff0000));
good.addChild(new Graphics().rect(0, 0, 10, 10).fill(0x00ff00));Same principle applies to blend modes: screen/normal/screen/normal = 4 draws; screen/screen/normal/normal = 2 draws.
import { Assets, Sprite } from "pixi.js";
// Load a spritesheet (single texture atlas)
const sheet = await Assets.load("game-atlas.json");
// All frames share one GPU texture; enables batching
const hero = new Sprite(sheet.textures["hero.png"]);
const enemy = new Sprite(sheet.textures["enemy.png"]);
const coin = new Sprite(sheet.textures["coin.png"]);Individual textures each require their own GPU upload and break batches when the texture limit is exceeded. Spritesheets consolidate many frames into one atlas texture.
Use @0.5x filename suffix on half-resolution sheets so PixiJS auto-scales them.
Text and HTMLText re-render to a canvas and re-upload to the GPU on every change. Never update them per frame unconditionally:
import { BitmapText, Text } from "pixi.js";
// Wrong: re-renders canvas + GPU upload every frame
app.ticker.add(() => {
scoreText.text = `Score: ${score}`;
});
// Correct: use BitmapText for frequently changing content
const scoreText = new BitmapText({
text: "Score: 0",
style: { fontFamily: "Arial", fontSize: 24, fill: 0xffffff },
});
app.ticker.add(() => {
scoreText.text = `Score: ${score}`;
});BitmapText renders from a pre-generated glyph atlas. Updates only reposition quads; no canvas re-render or GPU upload. Use it for scores, timers, counters, and anything that changes frequently.
If you must use canvas Text, guard updates so they only happen when the value changes:
app.ticker.add(() => {
const next = `Score: ${score}`;
if (scoreText.text !== next) {
scoreText.text = next;
}
});Text resolution matches the renderer resolution by default. Lower it independently via text.resolution = 1 to reduce GPU memory on high-DPI displays.
Graphics objects are fastest when their shape doesn't change (transforms, alpha, and tint are fine). Small Graphics (under ~100 points) are batched like Sprites. Complex Graphics with hundreds of shapes are slow; convert them to textures instead:
import { Graphics, Sprite } from "pixi.js";
const complex = new Graphics();
// ... draw complex shape ...
// Render once to texture, use as Sprite
const texture = app.renderer.generateTexture(complex);
const sprite = new Sprite(texture);PixiJS skips rendering objects outside the visible area when cullable is set. Disabled by default because it trades CPU cost (bounds checking) for GPU savings. Culling only runs when the CullerPlugin is registered:
import { extensions, CullerPlugin, Culler, Rectangle } from "pixi.js";
extensions.add(CullerPlugin); // before Application.init
// Enable on objects that may be off-screen
sprite.cullable = true;
// Optional: a pre-computed cull rectangle avoids per-frame bounds calculation.
// Without cullArea, the Culler uses the object's global bounds instead.
sprite.cullArea = new Rectangle(0, 0, 800, 600);
// Skip culling an entire subtree (static UI, always visible)
uiRoot.cullableChildren = false;
// Or cull manually without the plugin:
Culler.shared.cull(app.stage, app.renderer.screen);cullableChildren on a container stops the culler from recursing into its descendants; a large win for static UI panels with many children. Culler.shared.cull(container, rect) runs the same logic manually for custom render pipelines. Use culling when you're GPU-bound; avoid it when CPU-bound, since the per-object bounds check adds overhead.
import { Application } from "pixi.js";
const app = new Application();
// Mobile-friendly: lower resolution, no antialias
await app.init({
resolution: 1,
antialias: false,
backgroundAlpha: 1, // opaque background is faster
});resolution: 2 quadruples the pixel count. On mobile, this can halve frame rate. Profile to find the right balance.
import { RenderTexture } from "pixi.js";
// single-pass antialiased render texture: also discard its MSAA depth/stencil at end of pass
const rt = RenderTexture.create({ width: 1024, height: 1024, antialias: true, transient: true });
// upload only the changed byte range of a large buffer (also works on WebGL)
buffer.update(changedBytes, offsetBytes);
// upload only a texel range of a data texture (end is exclusive)
bufferImageSource.update(100, 116);On a tile-based WebGPU GPU (renderer.device.extensions.tileBased: every phone GPU and Apple silicon) the multisample colour buffer of every antialiased target is already discarded instead of written back, and a pass that reopens the target restores it from the resolved image; the buffer may not be allocated at all when renderer.device.extensions.transientAttachment is true. transient: true additionally discards the multisample depth/stencil buffer, and the colour buffer on other GPUs. Only use it on textures rendered in a single pass and never re-entered with clear: false or wrapped by a filter or mask. For static custom draw sequences on WebGPU, record a render bundle once and replay it each frame; see the pixijs-custom-rendering skill.
function staggerDestroy(textures: Texture[], perFrame: number = 5): void {
let index = 0;
const ticker = app.ticker;
const destroy = () => {
const end = Math.min(index + perFrame, textures.length);
for (let i = index; i < end; i++) {
textures[i].destroy(true);
}
index = end;
if (index >= textures.length) {
ticker.remove(destroy);
}
};
ticker.add(destroy);
}Destroying many textures in one frame causes a freeze. Spread the cost across frames.
container.filterArea = new Rectangle(x, y, w, h) when you know the bounds. Without it, PixiJS measures bounds every frame.container.filters = null.BlurFilter default) pushes the request past the screen and up to the next power of two. Set repeatEdgePixels: true on full-screen blurs to keep them screen-sized.interactiveChildren = false on containers with no interactive children.hitArea on large containers to skip recursive child hit testing.Remove from scene before destroying:
parent.removeChild(sprite);
sprite.destroy();Destroying while the render pipeline still holds a reference causes null-pointer crashes. If destruction must happen mid-frame, defer it:
app.ticker.addOnce(() => {
parent.removeChild(sprite);
sprite.destroy();
});Wrong:
app.destroy();
const newApp = new Application();Correct:
app.destroy({ releaseGlobalResources: true });
const newApp = new Application();Without this flag, stale pooled batches and textures from the old app persist in global pools and get reused by the new app, causing flickering and visual corruption.
sprite / graphic / sprite / graphic = 4 draw calls.
sprite / sprite / graphic / graphic = 2 draw calls.
Group same object types together in the child order to minimize batch breaks. Same applies to blend mode ordering.
Destroy/recreate is expensive: it deallocates GPU resources, triggers garbage collection, and requires fresh GPU uploads. Reuse objects by updating texture, position, visible, and other properties. Use an object pool pattern for frequently spawned/despawned entities.
Each separate texture consumes its own GPU memory slot and breaks batching when the per-batch texture limit is reached. Spritesheets consolidate textures into atlases. Also avoid textures exceeding 4096px on either axis, as they fail on some mobile GPUs.
Each update re-renders the full string to a canvas and uploads to the GPU. At 60fps this creates massive overhead. Use BitmapText for dynamic content (scores, timers, counters). If canvas Text is required, only update when the value actually changes. Source: src/docs/concepts/performance-tips.md
Hundreds of complex Graphics objects are slow to render. Small Graphics (under ~100 points) batch efficiently like Sprites, but complex ones do not. Render complex static shapes to a texture with renderer.generateTexture() and display as a Sprite. Source: src/docs/concepts/performance-tips.md
Destroying dozens of textures in a single frame causes a visible freeze. Spread destruction across multiple frames (e.g., 5 per frame via a ticker callback). Source: src/docs/concepts/garbage-collection.md
Without renderer.prepare.upload(), textures upload to the GPU on first render, causing frame hitches. For loading screens or scene transitions, upload before displaying. Requires import 'pixi.js/prepare' (not included even in the default bundle; always import it explicitly). Source: src/prepare/PrepareSystem.ts
resolution: 2 quadruples the pixel count. antialias: true adds GPU cost. Both degrade performance on mobile devices. Always profile on target hardware before enabling. Source: performance-tips.md
© pixijs, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in skills/pixijs-performance of pixijs/pixijs-skills.
Open the folder on GitHubat commit 83760c6
Pixijs Performance next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Pixijs Performance this skillpixijs/pixijs-skills | 348 | — | ~4.6k | Automated safety check: Pass | MIT | |
| Pixijs Performancenetaart/cohub | 571 | — | ~4k | Automated safety check: Pass | MIT | |
| PerformanceSidiora-Labs/centra-llm-agents | 116 | — | ~778 | Automated safety check: Pass | Custom licence | |
| Android Profilerarindamxd/camerax-android | 132 | 2 repos | ~493 | Automated safety check: Pass | Apache-2.0 | |
| Advpl Debuggingthalysjuvenal/advpl-specialist | 186 | — | ~487 | Automated safety check: Pass | MIT | |
| Kernel Debugging Advancedmohitmishra786/low-level-dev-skills | 253 | — | ~855 | Automated safety check: Pass | MIT |
netaart/cohub
A skill your agent uses when profiling or optimizing a PixiJS v8 app for FPS, draw calls, or GPU memory.
Sidiora-Labs/centra-llm-agents
Performance optimization guidelines for React/React Native applications.
arindamxd/camerax-android
Manages Android performance profiling and debugging. An agent skill from arindamxd/camerax-android.
thalysjuvenal/advpl-specialist
A skill your agent uses when the user asks to debug, diagnose, or fix an ADVPL/TLPP error on TOTVS Protheus -- compilation errors (syntax, missing includes, undeclared variables), runtime failures…
mohitmishra786/low-level-dev-skills
Advanced kernel debugging skill for ftrace, trace-cmd, perf, kprobes, kgdb, and crash analysis.
bbplayer-app/BBPlayer
Optimizes a React Native app by profiling first to find real bottlenecks, then sweeping for mechanical issues.
pixijs/pixijs-skills
A skill your agent uses when creating and configuring a PixiJS v8 Application.
pixijs/pixijs-skills
A skill your agent uses when understanding how PixiJS v8 renders frames: the systems-and-pipes renderer, the render loop, and how the library adapts to different environments.
pixijs/pixijs-skills
A skill your agent uses when scaffolding a new PixiJS v8 project with the create-pixi CLI or adding PixiJS to an existing project.
Categories
A skill your agent uses when profiling or optimizing a PixiJS v8 app for FPS, draw calls, or GPU memory. Pixijs Performance is an agent skill from pixijs/pixijs-skills. Use this skill when profiling or optimizing a PixiJS v8 app for FPS, draw calls, or GPU memory.
Pixijs Performance fits situations like: optimizing a PixiJS v8 app for FPS; destroy patterns; webGPU performance; repeatEdgePixels.
Run `npx skills add pixijs/pixijs-skills --skill pixijs-performance -a claude-code`. Or copy the skill folder (skills/pixijs-performance in pixijs/pixijs-skills) into .claude/skills/pixijs-performance in your project. Claude Code loads it when a task matches its description.
Run `npx skills add pixijs/pixijs-skills --skill pixijs-performance -a codex`. Or copy the skill folder (skills/pixijs-performance in pixijs/pixijs-skills) into .agents/skills/pixijs-performance in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add pixijs/pixijs-skills --skill pixijs-performance -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/pixijs-performance, .gemini/skills/pixijs-performance, .github/skills/pixijs-performance and .opencode/skills/pixijs-performance in your project.
SKILL.md names no scripts, command-line tools or credentials: Pixijs Performance is instructions for the agent only.
SKILL.md names 1 domain. As links in the text: pixijs.download. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Pixijs Performance is published under the MIT licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 4.6k tokens (SKILL.md is roughly 18k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Pixijs Performance: Pixijs Performance (netaart/cohub, 571 stars), Performance (Sidiora-Labs/centra-llm-agents, 116 stars), Android Profiler (arindamxd/camerax-android, 132 stars) and Advpl Debugging (thalysjuvenal/advpl-specialist, 186 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
pixijs (a GitHub organization) maintains it in pixijs/pixijs-skills, which has 348 GitHub stars. The repository holds 4 skills in this directory. The repository was last updated on October 1, 2026.
Source: pixijs/pixijs-skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.