pixijs-application
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 erweiternDie 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 Sieapp.canvas,app.rendereroderapp.screenverwenden 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 (siehepixijs-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
Setzen Sie Das Plugin passt die Größe des Canvas kontinuierlich an das Ziel an. Das TickerPlugin erstellt Der Callback erhält die Das CullerPlugin überspringt das Rendern von Containern, die außerhalb von Container werden nur dann ausgeblendet, wenn Erweitern Sie Plugins werden in der Reihenfolge ihrer Registrierung initialisiert und in umgekehrter Reihenfolge beendet. Um typisierte Optionen für Ihr Plugin hinzuzufügen, erweitern Sie Die integrierten Falsch: Richtig: In V8 nimmt der Falsch: Richtig: Falsch: Richtig: Related skills: 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 ( Set The plugin keeps the canvas matched to the target. The TickerPlugin creates The callback receives the The CullerPlugin skips rendering containers that fall outside Containers are not culled unless Extend Plugins initialize in registration order and destroy in reverse. To add typed options for your plugin, extend The built-in Wrong: Correct: In v8 the Wrong: Correct: Wrong: Correct: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 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
`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
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
`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
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)
`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);
`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
`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);
`PixiMixins.ApplicationOptions`:declare global {
namespace PixiMixins {
interface ApplicationOptions {
fpsOverlay?: { visible?: boolean };
}
}
}await app.init({ fpsOverlay: { visible: true } });
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
const app = new Application({ width: 800, height: 600 });
document.body.appendChild(app.canvas);
const app = new Application();
await app.init({ width: 800, height: 600 });
document.body.appendChild(app.canvas);
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`
document.body.appendChild(app.view);
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“
const app = new Application();
document.body.appendChild(app.canvas);
app.init({ width: 800, height: 600 });
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
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);
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.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,
});
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
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
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
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
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)
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);
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
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);
PixiMixins.ApplicationOptions:declare global {
namespace PixiMixins {
interface ApplicationOptions {
fpsOverlay?: { visible?: boolean };
}
}
}await app.init({ fpsOverlay: { visible: true } });
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
const app = new Application({ width: 800, height: 600 });
document.body.appendChild(app.canvas);
const app = new Application();
await app.init({ width: 800, height: 600 });
document.body.appendChild(app.canvas);
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
document.body.appendChild(app.view);
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
const app = new Application();
document.body.appendChild(app.canvas);
app.init({ width: 800, height: 600 });
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 Dateienpixijs-application installieren
Laden Sie die Skill-Dateien herunter und entpacken Sie sie in Ihr Verzeichnis „.claude/skills/“.
ZIP herunterladenKlonen 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
Ähnliche Skills





Heim
