LifePlay-Revival/Docs/25_Video_Quality.md
edujiro5972 8084622450 LifePlay UE 5.8 : état de développement au 2026-10-19
Tickets : REP1-T4

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-19 22:57:42 +02:00

10 KiB

25 — Qualité vidéo et réglages graphiques (chantier VQ)

V1 close — VQ4, 2026-10-07 (voir §8 Acceptation). Ébauche initiale VQ0-T3 : documentation de cadrage pour la V1 du chantier VQ (rationalisation de l'onglet Video).

Cartographie validée : etat/VQ/VQ0/VQ0-CART.md (VQ0-T1), preuve : etat/VQ/VQ0/VQ0-VAL.md (VQ0-T2, PASS).

1. Périmètre V1

La V1 du chantier VQ vise un socle C++ ULPVideoQualitySubsystem (nom provisoire) qui :

  1. Injecte un bloc de réglages LPVideo* dans MainMenu.SettingsScrollBox, avant les cinq lignes LPColor* (LPColorGradeSubsystem).
  2. Ne remplace pas en V1 l'intégralité du menu Video Blueprint : les lignes LifePlay spécifiques (Toon, censure, morphs, jiggle, DoF, etc.) restent telles qu'elles sont classées par LPSettingsSubsystem.
  3. Prépare la sync avec UGameUserSettings et les groupes Scalability Unreal pour les curseurs déjà présents en Blueprint (ShadowQuality, PostProcessQuality, PostProcessAAQuality, ScreenPercentage) — soit en les pilotant depuis C++, soit en masquant le widget BP et en exposant un contrôle unique LPVideo*.
  4. Corrige le faux-positif NewAnimationsOnly (classé Video à cause du mot « quality » dans l'infobulle) — lot connexe sur CategoryOf ou renommage/tooltip BP ; peut être livré dans le même lot ou immédiatement avant.

Hors périmètre V1 : résolution / mode fenêtré avancé au-delà de FullscreenButton, presets « Ultra / Cinematic », motion blur, DLSS/FSR, profils par machine, migration de GameSettings.sav.

2. Synchronisation (sync)

Couche Rôle V1 Fichier / API
Blueprint existant Curseurs Scalability et cases à cocher ; écriture historique via le flux Blueprint / GameSettings Content/UI/MainMenu.uasset
LPSettingsSubsystem Classement onglet Video (CategoryOf, ApplyRows) ; ne modifie pas les valeurs graphiques Source/LifePlay/LPSettingsSubsystem.cpp
Futur LPVideo* Source de vérité affichée pour les leviers retenus ; applique Scalability:: / GEngine->Exec / GameUserSettings ; relit à l'ouverture du menu À créer
LPColorGradeSubsystem Color grading post-process ; indépendant (LPColorGrade.ini) Source/LifePlay/LPColorGradeSubsystem.cpp

Règle V1 : une seule commande visible par CVar Scalability — si un LPVideo* expose Shadow Quality, le SettingSlider BP ShadowQuality doit être Collapsed (ou synchronisé bidirectionnellement sans boucle ; préférer masquage + sync à l'injection).

Ordre d'initialisation recommandé (tick ou première ouverture des réglages) :

  1. LPSettingsSubsystem::EnsureTabs — structure d'onglets prête.
  2. LPVideoQualitySubsystem::EnsureControls — insertion avant le premier enfant dont le nom commence par LPColor.
  3. LPColorGradeSubsystem::EnsureControls — ajout en queue si absent (comportement actuel).

2.1 État après VQ2 / VQ3 (2026-10-07)

ULPVideoQualitySubsystem (Source/LifePlay/LPVideoQualitySubsystem.*) est en place ; la ligne « Futur LPVideo* » du tableau ci-dessus est donc réalisée.

Sujet Comportement
Lignes injectées LPVideoOverall, LPVideoShadows, LPVideoTextures, LPVideoEffects, LPVideoAA, LPVideoRecommended, insérées avant le premier LPColor*
Blueprint masqués ShadowQuality, PostProcessQuality, PostProcessAAQuality (TabHidden dans CategoryOf)
Application Scalability::SetQualityLevels sur 4 groupes seulement (sg.ShadowQuality, sg.TextureQuality, sg.EffectsQuality, sg.AntiAliasingQuality), relecture et repli console
Overall Curseur Overall → FromOverall : les 4 curseurs s'alignent. Un curseur individuel → Normalize() : Overall = niveau commun, sinon Custom (-1)
Persistance Saved/Config/Windows/LPVideoQuality.ini (Version, Overall, Shadows, Textures, Effects, AA), relu à l'initialisation ; sans INI ni action du joueur, l'état moteur est conservé
Recommended (VQ3) Lit DedicatedVideoMemory via RHIGetTextureMemoryStats : < 4 Go → 0 Low ; < 6 → 1 Med ; < 10 → 2 High ; sinon 3 Epic. VRAM inconnue (0, -1, pas de RHI) → 2 High. Puis SetLevels(FromOverall(niveau), true) et journal Video : Recommended = ... VRAM dediee detectee X Go

Limite connue : un GPU intégré annonce une VRAM dédiée faible (partage avec la RAM système) et obtient donc Low ou Med ; SharedSystemMemory n'est volontairement pas pris en compte.

Preuves : etat/VQ/VQ2/VQ2-VAL.md, etat/VQ/VQ3/VQ3-IMPL-H.md, etat/VQ/VQ3/VQ3-VAL.md.

3. Ancrage rendu L7c

Les valeurs de rendu validées en jeu (lot L7c, CHG-049) restent la baseline visuelle ; les réglages Video ne doivent pas les écraser implicitement :

Clé Valeur jouée Fichier
r.DynamicGlobalIlluminationMethod 0 Config/DefaultEngine.ini
r.ReflectionMethod 2 (SSR) idem
r.Shadow.Virtual.Enable 0 idem
DefaultGraphicsRHI D3D12 idem

Référence : 07_Architecture_5.5.md, 04_Cahier_Des_Charges.md (L7c), Journal_Modifications.md (CHG-049). Toute évolution VQ post-V1 qui touche ces clés exige une campagne de validation jour/nuit comparable à L7c/L7d.

4. Injection UI : avant LPColor*

Motif ergonomique : affichage / scalabilité / effets LifePlay d'abord ; étalonnage colorimétrique (LPColor*) en fin d'onglet Video (cf. CART §7).

Motif technique : aujourd'hui ULPColorGradeSubsystem::AddRow appelle Scroll->AddChild(Row) — les lignes LPColor* sont toujours dernières. Le futur sous-système doit :

  • repérer l'index du premier enfant LPColor* (ou GetChildrenCount() si absent) ;
  • utiliser UScrollBox::InsertChildAt(Index, Row) (ou équivalent) pour le bloc LPVideo* ;
  • laisser LPColorGradeSubsystem inchangé en V1 (append) pour minimiser le diff.

Widgets injectés : préfixe de nom LPVideo (classification Video garantie par le même mécanisme que LPColor*, ou règle dédiée dans CategoryOf).

5. Conflits Blueprint — note V1

Conflit Widgets / leviers Traitement V1 proposé
Ombres BP ShadowQuality (sg.ShadowQuality) vs futur LPVideoShadow* Un seul contrôle visible ; masquer BP si C++ prend le relais
Post-process BP PostProcessQuality (sg.PostProcessQuality) vs preset global LPVideo* Idem ; documenter que « PP Quality (FPS intensive) » reste le libellé utilisateur jusqu'à refonte textes
Anti-aliasing BP PostProcessAAQuality (r.PostProcessAAQuality) vs LPVideoAA* Idem
Échelle interne BP ScreenPercentage vs LPVideo* render scale Sync sur r.ScreenPercentage / GameUserSettings selon API retenue
Luminosité LPColorBrightness (AutoExposureBias) vs gamma écran Ne pas fusionner en V1 ; distinct « exposition 3D » (Color) vs futur gamma (Video)
Faux-positif onglet NewAnimationsOnly Corriger classification (General) — indépendant des CVars

6. Prochaines fiches (hors VQ0)

Fiche Contenu attendu
VQ1-SPEC API LPVideo*, liste des CVars, persistance (ini dédié vs GameUserSettings)
VQ1-IMPL Module C++, masquage BP, tests menu Video
VQ1-VAL PASS/FAIL en jeu + non-régression L7c

7. Documents liés

  • etat/VQ/VQ0/VQ0-CART.md — inventaire exhaustif onglet Video
  • etat/VQ/VQ0/VQ0-VAL.md — validation amont
  • 14_Interface_V1.4.md — menu principal (contexte UI)
  • 10_Protocole_Operations.md — déroulé de lot avant code
  • etat/VQ/VQ1/VQ1-SPEC.md §8, etat/VQ/VQ2/VQ2-SPEC.md §13 — critères d'acceptation d'origine
  • etat/VQ/VQ4/VQ4-VAL.md — validation finale V1 (PASS, BLOCKED-UI manuel)
  • 26_Eval_Agents_VideoQuality.md + etat/VQ/VQ5/VQ5-VAL.md — évaluation des agents VQ5 (GO conditionnel ; écarts Epic de DefaultScalability.ini)

8. Acceptation V1 (clôture VQ4, 2026-10-07)

Statut : V1 close, PASS (etat/VQ/VQ4/VQ4-VAL.md). Les cases cochées sont prouvées par relecture du code, grep et démarrage -nullrhi. Les cases non cochées exigent le menu Settings ouvert en jeu (BLOCKED-UI), à faire à la main ; elles ne bloquent pas la clôture.

8.1 Configuration et non-régression L7c

  • Config/DefaultScalability.ini ne contient que [ShadowQuality@0..3], [TextureQuality@0..3], [EffectsQuality@0..3], [AntiAliasingQuality@0..3] (16 sections).
  • Aucune occurrence de Virtual, Lumen, GlobalIllumination, AntiAliasingMethod, ReflectionMethod, SSR dans DefaultScalability.ini (grep insensible à la casse, 0 hit).
  • Config/DefaultEngine.ini inchangé : L7c intact (GI 0, SSR, VSM 0, TAA, D3D12).
  • Aucune cvar L7c dans le code LPVideoQualitySubsystem.*.
  • Niveau 3 en jeu : GI dynamique, VSM et méthode d'AA inchangés (BLOCKED-UI).

8.2 Code et classement

  • LPVideoQualitySubsystem.h/.cpp compilent ; DLL UnrealEditor-LifePlay.dll postérieure aux sources.
  • SetLevels : Overall → 4 niveaux (FromOverall) ; niveau individuel → Normalize (Overall ou Custom).
  • Recommended : VRAM dédiée (< 4 Low, < 6 Med, < 10 High, sinon Epic ; inconnue = High).
  • CategoryOf : LPVideo* et LPColor* → Video ; ShadowQuality, PostProcessQuality, PostProcessAAQuality → TabHidden.
  • LPColorGradeSubsystem non modifié.
  • Démarrage -nullrhi : exit 0, lecture des niveaux depuis Scalability, aucun avertissement vidéo.

8.3 Menu Settings (test manuel)

  • Six lignes LPVideo* avant LPColor* ; trois curseurs BP masqués après changement d'onglet (BLOCKED-UI).
  • Overall 0→3 : les 4 curseurs suivent ; un curseur individuel → Custom (BLOCKED-UI).
  • Recommended : niveau conforme au GPU, journal VRAM (BLOCKED-UI).
  • Relance : niveaux relus depuis Saved/Config/Windows/LPVideoQuality.ini (BLOCKED-UI).

8.4 Limites connues V1

  • GPU intégré : VRAM dédiée faible, donc Low ou Med ; SharedSystemMemory volontairement ignorée.
  • PostProcessQuality n'est plus pilotable par le joueur (masqué, hors des 4 groupes) ; ScreenPercentage reste en Blueprint.