Option
HeimHeim Skill Sonstiges pixijs-application

pixijs-application

pixijs/pixijs pixijs/pixijs

Verwenden Sie diese Fertigkeit beim Erstellen und Konfigurieren einer PixiJS v8-Anwendung. Behandelt die neuen Optionen für `Application()` und `async app.init()` (width, height, background, antialias, resolution, autoDensity, preference, resizeTo, autoStart, sharedTicker, canvas, useBackBuffer, powerPreference, eventFeatures, accessibilityOptions, gcActive, bezierSmoothness, webgl/webgpu/canvasOptions – Renderer-spezifische Überschreibungen), Zugriff auf app.stage/renderer/canvas/screen/domContainerRoot, ResizePlugin, TickerPlugin, CullerPlugin (cullable, cullArea), Erstellung benutzerdefinierter ApplicationPlugins über ExtensionType.Application, Start-/Stopp-Lebenszyklus sowie app.destroy() mit releaseGlobalResources. Auslöser für: Application, app.init, app.stage, app.renderer, app.canvas, app.screen, app.domContainerRoot, ApplicationOptions, ApplicationPlugin, ExtensionType.Application, resizeTo, preference, autoStart, sharedTicker, useBackBuffer, powerPreference, skipExtensionImports, preferWebGLVersion, preserveDrawingBuffer, cullable, CullerPlugin, app.start, app.stop, app.destroy, rele

...Alle erweitern
50
Zeit aktualisiert 4. August 2026

Die Anwendung ist die Komfort-Hülle, die einen Renderer, einen Root-Stage-Container, eine Leinwand sowie die Ticker- und Resize-Plugins enthält. In Version 8 nimmt der Konstruktor keine Argumente entgegen; die gesamte Konfiguration wird an den asynchronen Aufruf von app.init() übergeben, der den Renderer über autoDetectRenderer instanziiert.

Schnellstart

import { Application } from "pixi.js";const app = new Application();await app.init({
  resizeTo: window,
  background: "#1099bb",
 antialias: true,
  preference: "webgl",
  autoDensity: true,
  resolution: window.devicePixelRatio,
});document.body.appendChild(app.canvas);

Verwandte Themen: pixijs-core-concepts (Renderer, Render-Pipeline), pixijs-ticker (Details zur Render-Schleife), pixijs-scene-container (Arbeiten mit app.stage), pixijs-environments (Setups außerhalb des Browsers).

Kernmuster

Lebenszyklus: construct, init, render, destroy

import { Application } from "pixi.js";const app = new Application();await app.init({ width: 800, height: 600 });
document.body.appendChild(app.canvas);// ... Szene ausführen, der Ticker löst app.render() automatisch aus ...app.destroy(
  { removeView: true, releaseGlobalResources: true },
  { children: true, texture: true, textureSource: true },
);
  • new Application() weist die Instanz zu, erstellt jedoch nichts. Hier übergebene Optionen werden ignoriert und es wird eine V8-Veraltungswarnung ausgegeben.
  • app.init(options) ist asynchron. Es erstellt den Renderer, bindet Plugins ein und muss abgeschlossen sein, bevor Sie app.canvas, app.renderer oder app.screen verwenden können.
  • Das TickerPlugin ruft app.render() in jedem Frame auf, sobald init abgeschlossen ist (es sei denn, autoStart: false).
  • app.destroy(rendererDestroyOptions, stageDestroyOptions) – das erste Argument wird an ` renderer.destroy()` weitergeleitet. Übergeben Sie `true` oder `{ removeView: true }`, um die Canvas-Instanz aus dem DOM zu entfernen. Fügen Sie „releaseGlobalResources: true“ hinzu, um globale Pools (Batches, Textur-Caches) beim Abbau und erneuten Erstellen einer App im selben Tab zu leeren; das Weglassen dieser Option ist die häufigste Ursache für Flackern und veraltete Texturen nach einer Neuinitialisierung (siehe pixijs-performance).

Wichtige Initialisierungsoptionen

await app.init({
  width: 800,
  height: 600,
  background: 0x1099bb,
  backgroundAlpha: 1,  antialias: true,
  resolution: window.devicePixelRatio,
 autoDensity: true,  preference: "webgpu",  autoStart: true,
  sharedTicker: false,  resizeTo: window,  canvas: document.querySelector("#game-canvas") as HTMLCanvasElement,
});

Für jede Option – Ansicht/Canvas, Hintergrund, Renderer-Einstellung (einschließlich der Array-Form), Ticker, Größenanpassung, Cullers, Ereignisse, Barrierefreiheit, WebGL-/WebGPU-Kontext-Flags, Grafik-Bezier-Glättung, GC und Renderer-spezifische Überschreibungen (webgl / webgpu / canvasOptions) – siehe references/application-options.md.

Anwendungseigenschaften

app.stage; // Stammcontainer; füge hier alle Anzeigeobjekte hinzu
app.renderer; // die WebGL/WebGPU/Canvas-Renderer-Instanz
app.canvas; // das HTMLCanvasElement (selbst in das DOM einfügen)
app.screen; // Rechteck,  das  den sichtbaren Bereich in CSS-Pixeln beschreibt
app.domContainerRoot; // HTMLDivElement, das DOMContainer-Overlays enthält

app.stage ist ein einfacher Container. Details zum Szenengraphen (Transformationen, addChild, destroy) findest du unter pixijs-scene-container. Informationen zu Operationen auf Renderer-Ebene (extract, generateTexture, benutzerdefinierte Systeme) finden Sie unter pixijs-core-concepts und pixijs-custom-rendering. app.domContainerRoot ist der

, den der Renderer zum Hosten von DOMContainer -Overlays verwendet; füge ihn neben app.canvas ein, wenn du DOM-Elemente benötigst, die an Szenenknoten angeheftet sind (siehe pixijs-scene-dom-container).

ResizePlugin

Setzen Sie `resizeTo` bei der Initialisierung (oder weisen Sie `app.resizeTo` später neu zu), damit das Plugin auf das `resize` -Ereignis reagiert und `renderer.resize()` mit der Client-Größe des Zielelements aufruft. Kombinieren Sie dies mit `autoDensity: true` und `resolution: window.devicePixelRatio ` für eine Ausgabe mit hoher DPI.

await app.init({ resizeTo: window });app.resizeTo = document.querySelector("#game-container") as HTMLElement;app.resize(); // Sofortige Größenanpassung an die aktuelle Größe des Zielelements
app.queueResize(); // Die Größenanpassung auf den nächsten Animationsframe verschieben
app.cancelResize(); // Eine anstehende „queueResize“-Anforderung abbrechen

Das Plugin passt die Größe des Canvas kontinuierlich an das Ziel an. app.screen sowie app.canvas.width/height werden entsprechend aktualisiert; lesen Sie diese Werte nach der Größenanpassung aus, um die Benutzeroberfläche zu positionieren.

  • app.resize() – sofortige, synchrone Größenanpassung.
  • app.queueResize() – bündelt schnelle Aufrufe, indem die Anpassung auf den nächsten Frame verschoben wird; wird intern vom ` window.resize `-Listener verwendet, um redundante Arbeit zu vermeiden.
  • app.cancelResize() – bricht eine in der Warteschlange stehende Größenänderung ab. Rufen Sie diese Funktion auf, bevor Sie Ihren eigenen Layout-Code abbauen, der ` queueResize` ausgelöst hat.

Grundlagen zum Ticker

Das TickerPlugin erstellt `app.ticker ` und registriert `app.render()` dort mit der Priorität `UPDATE_PRIORITY.LOW`. Steuern Sie die Schleife mit `app.start()`/`app.stop() ` und fügen Sie Callbacks mit `app.ticker.add ` / `app.ticker.addOnce` hinzu:

app.ticker.add((ticker) => {
  sprite.rotation += 0,01 * ticker.deltaTime;
});app.ticker.addOnce(() => {
 console.log("wird einmal im nächsten Frame ausgeführt und entfernt sich dann selbst");
});app.stop(); // die Render-Schleife anhalten (z. B. wenn die Registerkarte ausgeblendet ist)
app.start(); // fortsetzen

Der Callback erhält die Ticker-Instanz; lies ticker.deltaTime für einen von der Bildrate unabhängigen Multiplikator (~1,0 bei 60 fps), ticker.deltaMS für tatsächliche Millisekunden oder ticker.FPS für die aktuelle Bildrate. Siehe pixijs-ticker für Prioritäten, FPS-Begrenzung, onRender, gemeinsame vs. private Ticker und die Änderung der V8-Callback-Signatur.

Manuelle Render-Schleife

await app.init({ autoStart: false, width: 800, height: 600 });
document.body.appendChild(app.canvas);function frame() {
  updateScene();
  app.render();
 requestAnimationFrame(frame);
}
frame();

„autoStart: false“ verhindert, dass das TickerPlugin den Ticker automatisch startet. Rufen Sie app.render() selbst auf (oder app.renderer.render({ container: app.stage }) für denselben Effekt). Wenn Sie dennoch möchten, dass registrierte Ticker-Callbacks ausgelöst werden, rufen Sie app.ticker.update() innerhalb Ihrer Schleife vor app.render() auf.

CullerPlugin (Opt-in)

Das CullerPlugin überspringt das Rendern von Containern, die außerhalb von `app.renderer.screen` liegen. Es ist standardmäßig nicht registriert; fügen Sie es vor dem Erstellen Ihrer App hinzu:

import {
  Application,
  Container,
  Sprite,
  extensions,
  CullerPlugin,
  Rectangle,
} from "pixi.js";extensions.add(CullerPlugin);const app = new Application();
await app.init({ width: 800, height: 600 });const world = new Container();
world.cullable = true; // Dieser Container wird ausgeblendet, wenn seine Grenzen den Bildschirm verlassen
world.cullableChildren = true; // Standard; setze `false`, um die rekursive Überprüfungder untergeordneten Elemente  zu überspringenconst tile = Sprite.from("tile.png");
tile.cullable = true;
world.addChild(tile);
app.stage.addChild(world);

Container werden nur dann ausgeblendet, wenn `cullable` gesetzt ist. Überschreiben Sie die Standard-Begrenzungsprüfung mit `container.cullArea = new Rectangle(x, y, w, h)`, wenn die Berechnung der Begrenzungen der untergeordneten Elemente zu rechenintensiv ist. Das Plugin umschließt `app.render()`, sodass `Culler.shared.cull(app.stage, app.renderer.screen)` vor jedem Frame ausgeführt wird. Informationen dazu, wann sich das Culling lohnt, finden Sie unter `pixijs-performance`.

Benutzerdefinierte Anwendungs-Plugins

Erweitern Sie `Application`, indem Sie eine Klasse mit `static init`, `static destroy` und `static extension = ExtensionType.Application` registrieren. Beide Methoden werden mit `this` auf die `Application`-Instanz gebunden aufgerufen, sodass `this.renderer ` und `this.stage` verfügbar sind.

import {
  Application,
  ExtensionType,
  extensions,
  type ApplicationOptions,
} from "pixi.js";class FpsOverlay {
 public static extension = ExtensionType.Application;  public static init(this: Application, options: Partial<ApplicationOptions>) {
    // wird innerhalb von `app.init()` ausgeführt, nachdem der Renderer erstellt wurde
   // Props/Methoden an `this` anhängen, um sie in der App verfügbar zu machen
  }  public static destroy(this: Application) {
    // wird innerhalb von app.destroy() ausgeführt – alles, was du angehängt hast, wird entfernt
  }
}extensions.add(FpsOverlay);

Plugins werden in der Reihenfolge ihrer Registrierung initialisiert und in umgekehrter Reihenfolge beendet. Um typisierte Optionen für Ihr Plugin hinzuzufügen, erweitern Sie `PixiMixins.ApplicationOptions`:

declare global {
  namespace PixiMixins {
    interface ApplicationOptions {
      fpsOverlay?: { visible?: boolean };
    }
  }
}await app.init({ fpsOverlay: { visible: true } });

Die integrierten Plugins „ResizePlugin“, „TickerPlugin“ und das optional aktivierbare „CullerPlugin“ verwenden alle denselben Vertrag. Wenn Sie `skipExtensionImports: true` setzen, müssen Sie die benötigten integrierten Plugins selbst registrieren (`extensions.add(ResizePlugin, TickerPlugin)`).

Häufige Fehler

[KRITISCH] Übergabe von Optionen an den Konstruktor

Falsch:

const app = new Application({ width: 800, height: 600 });
document.body.appendChild(app.canvas);

Richtig:

const app = new Application();
await app.init({ width: 800, height: 600 });
document.body.appendChild(app.canvas);

In V8 nimmt der Application-Konstruktor keine Argumente entgegen. Dort übergebene Optionen werden ignoriert und lösen eine Verwendungswarnung aus; der Renderer wird erst innerhalb des asynchronen init() -Aufrufs erstellt.

[HIGH] Verwendung von `app.view` anstelle von `app.canvas`

Falsch:

document.body.appendChild(app.view);

Richtig:

document.body.appendChild(app.canvas);

„app.view“ wurde in Version 8 in „app.canvas“ umbenannt. Der alte Getter funktioniert zwar weiterhin, löst jedoch eine Verwendungswarnung aus.

[MEDIUM] Zugriff auf „app.canvas“ oder „app.renderer“ vor der Auflösung von „init“

Falsch:

const app = new Application();
document.body.appendChild(app.canvas);
app.init({ width: 800, height: 600 });

Richtig:

const app = new Application();
await app.init({ width: 800, height: 600 });
document.body.appendChild(app.canvas);

app.renderer, app.canvas und app.screen werden erst belegt, wenn das init() -Promise aufgelöst ist. Ein früherer Zugriff darauf liefert „undefined“ zurück.

API-Referenz

Auf GitHub ansehen

Application is the convenience wrapper that owns a renderer, a root stage Container, a canvas, and the Ticker/Resize plugins. In v8 the constructor takes no arguments; all configuration is passed to the async app.init() call which instantiates the renderer via autoDetectRenderer.

Quick Start

import { Application } from "pixi.js";const app = new Application();await app.init({
  resizeTo: window,
  background: "#1099bb",
  antialias: true,
  preference: "webgl",
  autoDensity: true,
  resolution: window.devicePixelRatio,
});document.body.appendChild(app.canvas);

Related skills: pixijs-core-concepts (renderers, render pipeline), pixijs-ticker (render loop detail), pixijs-scene-container (working with app.stage), pixijs-environments (non-browser setups).

Core Patterns

Lifecycle: construct, init, render, destroy

import { Application } from "pixi.js";const app = new Application();await app.init({ width: 800, height: 600 });
document.body.appendChild(app.canvas);// ... run scene, ticker drives app.render() automatically ...app.destroy(
  { removeView: true, releaseGlobalResources: true },
  { children: true, texture: true, textureSource: true },
);
  • new Application() allocates the instance but creates nothing. Options passed here are ignored with a v8 deprecation warning.
  • app.init(options) is async. It builds the renderer, wires up plugins, and must complete before you can use app.canvas, app.renderer, or app.screen.
  • The TickerPlugin calls app.render() every frame once init resolves (unless autoStart: false).
  • app.destroy(rendererDestroyOptions, stageDestroyOptions) — the first argument forwards to renderer.destroy(). Pass true or { removeView: true } to remove the canvas from the DOM. Add releaseGlobalResources: true to drain global pools (batches, texture caches) when tearing down and re-creating an app in the same tab; omitting it is the usual cause of flickering and stale textures after a re-init (see pixijs-performance).

Key init options

await app.init({
  width: 800,
  height: 600,
  background: 0x1099bb,
  backgroundAlpha: 1,  antialias: true,
  resolution: window.devicePixelRatio,
  autoDensity: true,  preference: "webgpu",  autoStart: true,
  sharedTicker: false,  resizeTo: window,  canvas: document.querySelector("#game-canvas") as HTMLCanvasElement,
});

For every option — view/canvas, background, renderer preference (including the array form), ticker, resize, culler, events, accessibility, WebGL/WebGPU context flags, Graphics bezier smoothness, GC, and per-renderer overrides (webgl / webgpu / canvasOptions) — see references/application-options.md.

Application properties

app.stage; // root Container; add all display objects here
app.renderer; // the WebGL/WebGPU/Canvas renderer instance
app.canvas; // the HTMLCanvasElement (insert it into the DOM yourself)
app.screen; // Rectangle describing the visible area in CSS pixels
app.domContainerRoot; // HTMLDivElement that holds DOMContainer overlays

app.stage is a plain Container. For scene graph detail (transforms, addChild, destroy) see pixijs-scene-container. For renderer-level operations (extract, generateTexture, custom systems) see pixijs-core-concepts and pixijs-custom-rendering. app.domContainerRoot is the <div> that the renderer uses to host DOMContainer overlays; append it next to app.canvas when you need DOM elements pinned to scene nodes (see pixijs-scene-dom-container).

ResizePlugin

Set resizeTo at init (or reassign app.resizeTo later) to have the plugin listen for the resize event and call renderer.resize() with the target element's client size. Combine with autoDensity: true and resolution: window.devicePixelRatio for high-DPI output.

await app.init({ resizeTo: window });app.resizeTo = document.querySelector("#game-container") as HTMLElement;app.resize(); // immediate resize to the target's current size
app.queueResize(); // defer the resize to the next animation frame
app.cancelResize(); // drop a pending queueResize

The plugin keeps the canvas matched to the target. app.screen and app.canvas.width/height update in response; read them after the resize to place UI.

  • app.resize() — immediate synchronous resize.
  • app.queueResize() — coalesces rapid calls by deferring to the next frame; internally used by the window.resize listener to avoid redundant work.
  • app.cancelResize() — cancels a queued resize. Call this before tearing down your own layout code that triggered queueResize.

Ticker basics

The TickerPlugin creates app.ticker and registers app.render() on it at UPDATE_PRIORITY.LOW. Control the loop with app.start()/app.stop() and add callbacks with app.ticker.add / app.ticker.addOnce:

app.ticker.add((ticker) => {
  sprite.rotation += 0.01 * ticker.deltaTime;
});app.ticker.addOnce(() => {
  console.log("runs once on the next frame, then removes itself");
});app.stop(); // pause the render loop (e.g. tab hidden)
app.start(); // resume

The callback receives the Ticker instance; read ticker.deltaTime for a frame-rate-independent multiplier (~1.0 at 60fps), ticker.deltaMS for real milliseconds, or ticker.FPS for the current frame rate. See pixijs-ticker for priorities, FPS capping, onRender, shared vs private tickers, and the v8 callback signature change.

Manual render loop

await app.init({ autoStart: false, width: 800, height: 600 });
document.body.appendChild(app.canvas);function frame() {
  updateScene();
  app.render();
  requestAnimationFrame(frame);
}
frame();

autoStart: false prevents the TickerPlugin from starting the ticker automatically. Call app.render() yourself (or app.renderer.render({ container: app.stage }) for the same effect). If you still want registered ticker callbacks to fire, call app.ticker.update() inside your loop before app.render().

CullerPlugin (opt-in)

The CullerPlugin skips rendering containers that fall outside app.renderer.screen. It isn't registered by default; add it before creating your app:

import {
  Application,
  Container,
  Sprite,
  extensions,
  CullerPlugin,
  Rectangle,
} from "pixi.js";extensions.add(CullerPlugin);const app = new Application();
await app.init({ width: 800, height: 600 });const world = new Container();
world.cullable = true; // this container is culled when its bounds leave the screen
world.cullableChildren = true; // default; set `false` to skip recursing into childrenconst tile = Sprite.from("tile.png");
tile.cullable = true;
world.addChild(tile);
app.stage.addChild(world);

Containers are not culled unless cullable is set. Override the default bounds check with container.cullArea = new Rectangle(x, y, w, h) when child bounds are expensive to compute. The plugin wraps app.render() so Culler.shared.cull(app.stage, app.renderer.screen) runs before every frame. See pixijs-performance for when culling pays off.

Custom Application plugins

Extend Application by registering a class with static init, static destroy, and static extension = ExtensionType.Application. Both methods are called with this bound to the Application instance, so this.renderer and this.stage are available.

import {
  Application,
  ExtensionType,
  extensions,
  type ApplicationOptions,
} from "pixi.js";class FpsOverlay {
  public static extension = ExtensionType.Application;  public static init(this: Application, options: Partial<ApplicationOptions>) {
    // runs inside app.init() after the renderer is created
    // attach props/methods to `this` to expose them on the app
  }  public static destroy(this: Application) {
    // runs inside app.destroy() — tear down anything you attached
  }
}extensions.add(FpsOverlay);

Plugins initialize in registration order and destroy in reverse. To add typed options for your plugin, extend PixiMixins.ApplicationOptions:

declare global {
  namespace PixiMixins {
    interface ApplicationOptions {
      fpsOverlay?: { visible?: boolean };
    }
  }
}await app.init({ fpsOverlay: { visible: true } });

The built-in ResizePlugin, TickerPlugin, and opt-in CullerPlugin all use this same contract. If you set skipExtensionImports: true, register the built-ins you need yourself (extensions.add(ResizePlugin, TickerPlugin)).

Common Mistakes

[CRITICAL] Passing options to the constructor

Wrong:

const app = new Application({ width: 800, height: 600 });
document.body.appendChild(app.canvas);

Correct:

const app = new Application();
await app.init({ width: 800, height: 600 });
document.body.appendChild(app.canvas);

In v8 the Application constructor takes no arguments. Options passed there are ignored and log a deprecation warning; the renderer is only created inside the async init() call.

[HIGH] Using app.view instead of app.canvas

Wrong:

document.body.appendChild(app.view);

Correct:

document.body.appendChild(app.canvas);

app.view was renamed to app.canvas in v8. The old getter still works but emits a deprecation warning.

[MEDIUM] Touching app.canvas or app.renderer before init resolves

Wrong:

const app = new Application();
document.body.appendChild(app.canvas);
app.init({ width: 800, height: 600 });

Correct:

const app = new Application();
await app.init({ width: 800, height: 600 });
document.body.appendChild(app.canvas);

app.renderer, app.canvas, and app.screen are only populated once the init() promise resolves. Accessing them earlier returns undefined.

API Reference

Alle Dateien

0 Dateien

pixijs-application installieren

Laden Sie die Skill-Dateien herunter und entpacken Sie sie in Ihr Verzeichnis „.claude/skills/“.

ZIP herunterladen

Klonen Sie das Repository und kopieren Sie die Skill-Dateien in Ihr Projekt.

git clone https://github.com/pixijs/pixijs/tree/dev/skills/pixijs-application # Copy the skill folder to .claude/skills/ or .codex/skills/

Kopieren Kopieren
Schnelle Einrichtung: Kopiere den Skill-Ordner nach .claude/skills/. Claude erkennt den Skill automatisch und nutzt ihn.
Repository pixijs/pixijs

Ähnliche Skills

multica-creating-agents
Zeit aktualisiert 12. August 2026
tilemaps
Zeit aktualisiert 4. August 2026
v4-new-features
Zeit aktualisiert 4. August 2026
agent-github-pr-manager
Zeit aktualisiert 3. August 2026
OR