PERFORMANCE_BUDGET.md
Budgets de performance — Slot Factory Engine. Appliqués par la validation automatique du Factory (bloquant = ❌, warning = ⚠). Basés sur les standards observés (payload jouable < 10 Mo, 60 fps mobile) et notre vécu (TNF = 123 Mo assumés pour un jeu vidéo-heavy : c'est l'EXCEPTION du style « personnage vidéo », pas la règle des slots reels).
1. Poids (par jeu buildé, après compression build — brotli/gzip servis par le CDN Stake)
| Catégorie | Budget ❌ (bloquant) | Cible ⚠ | Notes |
|---|---|---|---|
| Payload initial jouable (P0 : html+js+css + assets premier écran) | ≤ 10 Mo | ≤ 5 Mo | first playable < 8 s en 4G |
| JS moteur (min+gz) | ≤ 900 Ko | ≤ 600 Ko | Pixi ~450 Ko gz inclus |
| Textures P0+P1 (atlas premier spin) | ≤ 6 Mo | ≤ 4 Mo | WebP q80–90, atlas ≤ 2048² |
| Audio total | ≤ 4 Mo | ≤ 2,5 Mo | MP3 128–192 kbps ; bgm ≤ 1,2 Mo/piste |
| Vidéos (toutes, lazy P2) | ≤ 20 Mo | ≤ 12 Mo | H.264 CRF 19–23 ; 1 cinématique ≤ 4 Mo |
| Clips personnage (module character-actor, opt-in) | ≤ 40 Mo | ≤ 25 Mo | budget SÉPARÉ, assumé, affiché au créateur |
| Fonts | ≤ 200 Ko | ≤ 120 Ko | WOFF2, sous-ensembles latin |
| Total bundle slot reels (sans character-actor) | ≤ 30 Mo | ≤ 18 Mo | |
| Total bundle avec character-actor | ≤ 70 Mo | ≤ 45 Mo | à la TNF, gaté en P2 |
2. Runtime
| Métrique | Budget ❌ | Cible ⚠ |
|---|---|---|
| FPS desktop (spin + win presentation) | ≥ 55 | 60 |
| FPS mobile milieu de gamme (throttle CPU ×4 Playwright) | ≥ 30 | ≥ 50 |
| First playable (4G simulé, cache froid) | ≤ 10 s | ≤ 6 s |
| Interaction → spin start | ≤ 120 ms | ≤ 60 ms |
| Mémoire GPU textures résidentes | ≤ 256 Mo | ≤ 160 Mo |
| Fuites : delta heap après 200 spins auto | ≤ 10 % | ~0 % |
| Long tasks (> 50 ms) pendant le spin | 0 | 0 |
3. Techniques imposées par le moteur
- Lazy par priorité : P0 (écran d'accueil) → P1 (préchargé pendant l'accueil, requis au 1er spin) → P2 (bonus/cinématiques/big-win, chargés en idle). Un asset P2 manquant au moment T ⇒ fallback léger (jamais d'attente bloquante).
- Atlas : packing automatique au build (symboles+UI par écran), pages ≤ 2048×2048.
- Pooling : sprites de symboles, particules, textes de gain — zéro allocation dans la boucle de spin.
- Device tiering : détection au boot (dpr, cores,
deviceMemory, benchmark 100 ms) → tier low/mid/high pilotant densité de particules, blur procédural, ombres. Tier low = présentation simplifiée, JAMAIS de features en moins. - Vidéo :
preload=metadata, jouées muted + piste Web Audio (pattern TNF), libérées après usage. - Audio : buffers décodés à la demande par scène ; voix/bonus en P2.
- Images : WebP obligatoire (le Factory convertit à l'import) ; le lint refuse un PNG opaque plein écran.
4. Mesure (harnais factory/qa/perf)
- Playwright : trace de chargement (cache froid, 4G simulé), FPS via
requestAnimationFramesampler pendant 30 spins turbo, heap avant/après 200 spins, screenshots des long tasks. - Rapport
perf-report.jsonarchivé par build ; l'Export refuse de packager si un ❌ est présent (override possible avec justification écrite dans le changelog — décision humaine). - Budgets ajustables PAR JEU dans
game.config.json > performance(uniquement à la baisse, jamais au-dessus des plafonds ❌).