/** * AdaptiveQualityManager - FPS-based automatic quality adjustment * * Monitors frame rate via a rolling window average and steps quality up or down * based on sustained performance. Integrated into the BackgroundController's * animation loop so consumers get adaptive quality for free. * * Design decisions: * - Rolling window of ~60 frames for stable FPS estimation * - Downgrades after sustained low FPS (default: <30 for 3s) * - Upgrades after sustained high FPS (default: >55 for 10s) * - Steps one level at a time to avoid oscillation * - 5-second cooldown between adjustments * - Respects a quality ceiling set by device detection */ import type { QualityLevel } from "../domain/types.js"; export interface AdaptiveQualityOptions { /** FPS threshold below which quality downgrades. Default: 30. */ downgradeThresholdFps?: number; /** FPS threshold above which quality upgrades. Default: 55. */ upgradeThresholdFps?: number; /** How long FPS must stay below downgrade threshold before acting. Default: 3000ms. */ downgradeSustainMs?: number; /** How long FPS must stay above upgrade threshold before acting. Default: 10000ms. */ upgradeSustainMs?: number; /** Minimum time between quality adjustments. Default: 5000ms. */ cooldownMs?: number; /** Whether adaptive quality is active. Default: true. */ enabled?: boolean; } type QualityChangeCallback = (newQuality: QualityLevel, oldQuality: QualityLevel) => void; /** * Tracks FPS and auto-adjusts quality level. * * Call `tick(timestamp)` every animation frame. The manager handles the rest. */ export declare class AdaptiveQualityManager { private currentQuality; private qualityCeiling; private enabled; private readonly frameTimes; private readonly maxFrameSamples; private lastTimestamp; private lowFpsSince; private highFpsSince; private lastAdjustmentTime; private readonly downgradeThresholdFps; private readonly upgradeThresholdFps; private readonly downgradeSustainMs; private readonly upgradeSustainMs; private readonly cooldownMs; private readonly callbacks; constructor(initialQuality: QualityLevel, options?: AdaptiveQualityOptions); /** * Called every animation frame with the rAF timestamp. * Computes rolling FPS and triggers quality changes when thresholds are sustained. */ tick(timestamp: number): void; getCurrentQuality(): QualityLevel; setQualityCeiling(level: QualityLevel): void; setEnabled(enabled: boolean): void; onQualityChange(callback: QualityChangeCallback): void; /** * Reset tracking state. Optionally set a new quality level. * Call this after background switches to avoid stale FPS data * from the old background triggering adjustments. */ reset(quality?: QualityLevel): void; dispose(): void; private evaluateQuality; private applyQualityChange; } export {}; //# sourceMappingURL=AdaptiveQualityManager.d.ts.map