Fast, lightweight 2D graphics library with WebGL and WebGPU rendering for creating rich, interactive graphics and cross-platform applications
—
Quality
Pending
Does it follow best practices?
Impact
Pending
No eval scenarios have been run
WebGL and WebGPU rendering backends, batching system, geometry management, shaders, and performance optimization utilities. The rendering system provides the foundation for high-performance graphics rendering with multiple backend support.
Core renderer classes supporting different graphics APIs.
/**
* WebGL renderer implementation
*/
class WebGLRenderer extends AbstractRenderer {
constructor(options?: WebGLRendererOptions);
/** WebGL rendering context */
readonly gl: WebGLRenderingContext | WebGL2RenderingContext;
/** WebGL context system */
context: GlContextSystem;
/** Shader system */
shader: GlShaderSystem;
/** Geometry system */
geometry: GlGeometrySystem;
/** Buffer system */
buffer: GlBufferSystem;
/** Texture system */
texture: GlTextureSystem;
/** State system */
state: GlStateSystem;
/**
* Render display object
* @param displayObject - Object to render
* @param options - Render options
*/
render(displayObject: Container, options?: RenderOptions): void;
}
/**
* WebGPU renderer implementation
*/
class WebGPURenderer extends AbstractRenderer {
constructor(options?: WebGPURendererOptions);
/** WebGPU device */
readonly device: GPUDevice;
/** WebGPU adapter */
readonly adapter: GPUAdapter;
/** Pipeline system */
pipeline: PipelineSystem;
/** Bind group system */
bindGroup: BindGroupSystem;
/** GPU buffer system */
buffer: GpuBufferSystem;
/** GPU texture system */
texture: GpuTextureSystem;
/**
* Render display object
* @param displayObject - Object to render
* @param options - Render options
*/
render(displayObject: Container, options?: RenderOptions): void;
}
/**
* Base renderer class
*/
abstract class AbstractRenderer extends EventEmitter {
constructor(options?: RendererOptions);
/** Renderer type */
readonly type: RENDERER_TYPE;
/** Canvas element */
readonly canvas: HTMLCanvasElement;
/** Screen rectangle */
readonly screen: Rectangle;
/** Rendering resolution */
resolution: number;
/** Auto resize flag */
autoDensity: boolean;
/** Background system */
background: BackgroundSystem;
/** View system */
view: ViewSystem;
/** Render target system */
renderTarget: RenderTargetSystem;
/** Global uniform system */
globalUniforms: GlobalUniformSystem;
/**
* Resize renderer
* @param width - New width
* @param height - New height
* @param resolution - New resolution
*/
resize(width: number, height: number, resolution?: number): void;
/**
* Clear renderer
* @param color - Clear color
* @param alpha - Clear alpha
*/
clear(color?: ColorSource, alpha?: number): void;
/**
* Destroy renderer
* @param removeView - Remove canvas from DOM
*/
destroy(removeView?: boolean): void;
}
/**
* Auto-detect best renderer
* @param options - Renderer options
* @returns Promise resolving to renderer
*/
function autoDetectRenderer<T extends AbstractRenderer>(options?: RendererOptions): Promise<T>;
interface RendererOptions {
/** Canvas width */
width?: number;
/** Canvas height */
height?: number;
/** Canvas element */
canvas?: HTMLCanvasElement;
/** Background color */
background?: ColorSource;
/** Background alpha */
backgroundAlpha?: number;
/** Device pixel ratio */
resolution?: number;
/** Auto adjust for device pixel ratio */
autoDensity?: boolean;
/** Antialias */
antialias?: boolean;
/** Premultiplied alpha */
premultipliedAlpha?: boolean;
/** Preserve drawing buffer */
preserveDrawingBuffer?: boolean;
/** Power preference */
powerPreference?: WebGLPowerPreference;
/** WebGL context attributes */
context?: WebGLContextAttributes;
/** Preferred renderer */
preference?: 'webgl' | 'webgpu';
/** Hello message */
hello?: boolean;
}High-performance batching system for efficient rendering.
/**
* Batch rendering system
*/
class Batcher {
constructor();
/** Maximum textures per batch */
maxTextures: number;
/** Current batch size */
size: number;
/** Attribute buffer */
attributeBuffer: ViewableBuffer;
/** Index buffer */
indexBuffer: Uint16Array | Uint32Array;
/**
* Add object to batch
* @param batchableObject - Object to batch
*/
addToBatch(batchableObject: Batchable): void;
/**
* Break current batch
* @param instructionSet - Instruction set
*/
break(instructionSet: InstructionSet): void;
/**
* Finish batch
* @param instructionSet - Instruction set
*/
finish(instructionSet: InstructionSet): void;
/**
* Upload batch data
* @param instructionSet - Instruction set
*/
upload(instructionSet: InstructionSet): void;
/**
* Execute batch
* @param instructionSet - Instruction set
*/
execute(instructionSet: InstructionSet): void;
}
/**
* Batchable object interface
*/
interface Batchable {
/** Batch size */
batchSize: number;
/** Attribute size */
attributeSize: number;
/** Index size */
indexSize: number;
/** Texture */
texture: Texture;
/** Blend mode */
blendMode: BLEND_MODES;
/**
* Pack attributes
* @param float32View - Float32 view
* @param uint32View - Uint32 view
* @param index - Starting index
* @param textureId - Texture ID
*/
packAttributes(float32View: Float32Array, uint32View: Uint32Array, index: number, textureId: number): void;
/**
* Pack indices
* @param indexBuffer - Index buffer
* @param index - Starting index
* @param indicesOffset - Vertex offset
*/
packIndex(indexBuffer: Uint16Array | Uint32Array, index: number, indicesOffset: number): void;
}Vertex data management and geometry utilities.
/**
* Geometry class for vertex data
*/
class Geometry {
constructor(options?: GeometryOptions);
/** Vertex attributes */
attributes: Record<string, Attribute>;
/** Index buffer */
indexBuffer: Buffer;
/** Instance count */
instanceCount: number;
/** Geometry bounds */
bounds: Bounds;
/**
* Add attribute
* @param name - Attribute name
* @param buffer - Attribute buffer
* @param size - Components per vertex
* @param normalized - Normalize values
* @param type - Data type
* @param stride - Byte stride
* @param offset - Byte offset
* @returns This geometry
*/
addAttribute(name: string, buffer: Buffer | number[], size?: number, normalized?: boolean, type?: TYPES, stride?: number, offset?: number): this;
/**
* Add index buffer
* @param buffer - Index buffer
* @returns This geometry
*/
addIndex(buffer: Buffer | number[]): this;
/**
* Get attribute
* @param name - Attribute name
* @returns Attribute data
*/
getAttribute(name: string): Attribute;
/**
* Get bounds
* @param out - Rectangle to store bounds
* @returns Geometry bounds
*/
getBounds(out?: Rectangle): Rectangle;
/**
* Dispose geometry
*/
dispose(): void;
/**
* Clone geometry
* @returns Cloned geometry
*/
clone(): Geometry;
}
/**
* Vertex attribute definition
*/
interface Attribute {
/** Attribute buffer */
buffer: Buffer;
/** Components per vertex */
size: number;
/** Normalize values */
normalized: boolean;
/** Data type */
type: TYPES;
/** Byte stride */
stride: number;
/** Byte offset */
offset: number;
}GPU buffer management for vertex and index data.
/**
* GPU buffer for vertex/index data
*/
class Buffer {
constructor(data?: ArrayBuffer | ArrayBufferView, usage?: BUFFER_USAGE, index?: boolean);
/** Buffer data */
data: ArrayBuffer | ArrayBufferView;
/** Buffer usage pattern */
usage: BUFFER_USAGE;
/** Is index buffer */
index: boolean;
/** Buffer size */
size: number;
/** Update ID */
updateId: number;
/**
* Update buffer data
* @param data - New buffer data
*/
update(data?: ArrayBuffer | ArrayBufferView): void;
/**
* Dispose buffer
*/
dispose(): void;
/**
* Create buffer from array
* @param data - Array data
* @param usage - Buffer usage
* @param index - Is index buffer
* @returns New buffer
*/
static from(data: number[], usage?: BUFFER_USAGE, index?: boolean): Buffer;
}
/**
* Buffer usage patterns
*/
enum BUFFER_USAGE {
STATIC = 0,
DYNAMIC = 1,
STREAM = 2
}Shader compilation and management.
/**
* Shader program
*/
class Shader {
constructor(options?: ShaderOptions);
/** Vertex shader source */
vertex: string;
/** Fragment shader source */
fragment: string;
/** Uniform groups */
groups: Record<string, UniformGroup>;
/** Shader resources */
resources: Record<string, any>;
/**
* Destroy shader
*/
destroy(): void;
/**
* Create shader from sources
* @param vertex - Vertex shader source
* @param fragment - Fragment shader source
* @param name - Shader name
* @returns New shader
*/
static from(vertex: string, fragment: string, name?: string): Shader;
}
/**
* Uniform group for shader uniforms
*/
class UniformGroup {
constructor(uniforms: Record<string, any>, options?: UniformGroupOptions);
/** Uniform values */
uniforms: Record<string, any>;
/** Update ID */
updateId: number;
/** Static flag */
isStatic: boolean;
/**
* Update uniform values
* @param uniforms - New uniform values
*/
update(uniforms?: Record<string, any>): void;
}Render target and framebuffer management.
/**
* Render target for off-screen rendering
*/
class RenderTarget {
constructor(options?: RenderTargetOptions);
/** Color textures */
colorTextures: Texture[];
/** Depth/stencil texture */
depthStencilTexture: Texture;
/** Render target size */
size: { width: number; height: number };
/** Resolution */
resolution: number;
/** Multisample count */
multisample: MSAA_QUALITY;
/**
* Resize render target
* @param width - New width
* @param height - New height
* @param resolution - New resolution
*/
resize(width: number, height: number, resolution?: number): void;
/**
* Destroy render target
*/
destroy(): void;
}
interface RenderTargetOptions {
/** Width */
width?: number;
/** Height */
height?: number;
/** Resolution */
resolution?: number;
/** Color texture count */
colorTextures?: number;
/** Enable depth buffer */
depth?: boolean;
/** Enable stencil buffer */
stencil?: boolean;
/** Multisample quality */
antialias?: MSAA_QUALITY;
}Performance monitoring and optimization utilities.
/**
* Performance monitoring
*/
interface PerformanceData {
/** Frame rate */
fps: number;
/** Frame time in milliseconds */
frameTime: number;
/** Draw calls per frame */
drawCalls: number;
/** Texture binds per frame */
textureBinds: number;
/** Vertices rendered */
vertices: number;
/** Memory usage */
memory: {
/** Texture memory */
textures: number;
/** Buffer memory */
buffers: number;
/** Total GPU memory */
total: number;
};
}
/**
* Get performance statistics
* @param renderer - Renderer instance
* @returns Performance data
*/
function getPerformanceStats(renderer: AbstractRenderer): PerformanceData;
/**
* Optimize renderer for performance
* @param renderer - Renderer instance
* @param options - Optimization options
*/
function optimizeRenderer(renderer: AbstractRenderer, options?: OptimizationOptions): void;
interface OptimizationOptions {
/** Enable batching */
batching?: boolean;
/** Texture garbage collection */
textureGC?: boolean;
/** Geometry pooling */
geometryPooling?: boolean;
/** Cull off-screen objects */
culling?: boolean;
}Usage Examples:
import {
autoDetectRenderer,
WebGLRenderer,
WebGPURenderer,
Geometry,
Buffer,
Shader,
RenderTarget,
BUFFER_USAGE
} from 'pixi.js';
// Renderer creation and setup
const renderer = await autoDetectRenderer({
width: 1024,
height: 768,
preference: 'webgpu',
antialias: true,
resolution: window.devicePixelRatio
});
document.body.appendChild(renderer.canvas);
// Manual renderer creation
const webglRenderer = new WebGLRenderer({
width: 800,
height: 600,
powerPreference: 'high-performance'
});
// Custom geometry creation
const geometry = new Geometry();
// Vertex positions (triangle)
const positions = new Float32Array([
0, 50, // Top vertex
-50, -50, // Bottom left
50, -50 // Bottom right
]);
geometry.addAttribute('aPosition', new Buffer(positions), 2);
// Index buffer
const indices = new Uint16Array([0, 1, 2]);
geometry.addIndex(new Buffer(indices, BUFFER_USAGE.STATIC, true));
// Custom shader
const shader = Shader.from(`
attribute vec2 aPosition;
uniform mat3 uProjectionMatrix;
uniform mat3 uWorldTransformMatrix;
void main() {
gl_Position = vec4((uProjectionMatrix * uWorldTransformMatrix * vec3(aPosition, 1.0)).xy, 0.0, 1.0);
}
`, `
uniform vec4 uColor;
void main() {
gl_FragColor = uColor;
}
`);
// Render target for off-screen rendering
const renderTexture = RenderTarget.create({
width: 512,
height: 512,
multisample: 4 // 4x MSAA
});
// Render scene to texture
renderer.render({
container: scene,
target: renderTexture
});
// Performance monitoring
const stats = getPerformanceStats(renderer);
console.log(`FPS: ${stats.fps}, Draw Calls: ${stats.drawCalls}`);
// Batch optimization
const batcher = renderer.batcher;
batcher.maxTextures = 16; // Increase batch size
// Memory management
renderer.texture.gc(); // Clean up unused textures
renderer.buffer.gc(); // Clean up unused buffers
// Conditional rendering based on capabilities
if (renderer.type === RENDERER_TYPE.WEBGL) {
const glRenderer = renderer as WebGLRenderer;
console.log('WebGL version:', glRenderer.context.webGLVersion);
// WebGL-specific optimizations
glRenderer.state.setState({
culling: true,
clockwiseFrontFace: false,
depthTest: true
});
}
// High-performance particle rendering
const particleGeometry = new Geometry();
const particleCount = 10000;
// Create instanced attributes
const positions = new Float32Array(particleCount * 2);
const colors = new Float32Array(particleCount * 4);
const scales = new Float32Array(particleCount);
for (let i = 0; i < particleCount; i++) {
const i2 = i * 2;
const i4 = i * 4;
positions[i2] = Math.random() * 800;
positions[i2 + 1] = Math.random() * 600;
colors[i4] = Math.random();
colors[i4 + 1] = Math.random();
colors[i4 + 2] = Math.random();
colors[i4 + 3] = 1.0;
scales[i] = 0.5 + Math.random() * 1.5;
}
particleGeometry.addAttribute('aInstancePosition', positions, 2);
particleGeometry.addAttribute('aInstanceColor', colors, 4);
particleGeometry.addAttribute('aInstanceScale', scales, 1);
// Clean up resources
geometry.dispose();
shader.destroy();
renderTexture.destroy();
renderer.destroy(true);Install with Tessl CLI
npx tessl i tessl/npm-pixi-js