or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

docs

animation.mdapplication.mdassets.mddisplay-objects.mdevents.mdfilters.mdgraphics.mdindex.mdmath.mdrendering.mdtext.mdtextures.mdutils.md
tile.json

rendering.mddocs/

Rendering and Performance

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.

Capabilities

Renderer Classes

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;
}

Batching System

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;
}

Geometry System

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;
}

Buffer Management

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 System

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 Targets

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 Optimization

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);