LifePlay.uproject : SupportedTargetPlatforms Win64 sur LPAnimCore, origine non revendiquee, range ici. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
10 KiB
23 — 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 :
- Injecte un bloc de réglages
LPVideo*dansMainMenu.SettingsScrollBox, avant les cinq lignesLPColor*(LPColorGradeSubsystem). - 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. - Prépare la sync avec
UGameUserSettingset 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 uniqueLPVideo*. - Corrige le faux-positif
NewAnimationsOnly(classé Video à cause du mot « quality » dans l'infobulle) — lot connexe surCategoryOfou 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) :
LPSettingsSubsystem::EnsureTabs— structure d'onglets prête.LPVideoQualitySubsystem::EnsureControls— insertion avant le premier enfant dont le nom commence parLPColor.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*(ouGetChildrenCount()si absent) ; - utiliser
UScrollBox::InsertChildAt(Index, Row)(ou équivalent) pour le blocLPVideo*; - laisser
LPColorGradeSubsysteminchangé 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 Videoetat/VQ/VQ0/VQ0-VAL.md— validation amont14_Interface_V1.4.md— menu principal (contexte UI)10_Protocole_Operations.md— déroulé de lot avant codeetat/VQ/VQ1/VQ1-SPEC.md§8,etat/VQ/VQ2/VQ2-SPEC.md§13 — critères d'acceptation d'origineetat/VQ/VQ4/VQ4-VAL.md— validation finale V1 (PASS, BLOCKED-UI manuel)24_Eval_Agents_VideoQuality.md+etat/VQ/VQ5/VQ5-VAL.md— évaluation des agents VQ5 (GO conditionnel ; écarts Epic deDefaultScalability.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.inine contient que[ShadowQuality@0..3],[TextureQuality@0..3],[EffectsQuality@0..3],[AntiAliasingQuality@0..3](16 sections).- Aucune occurrence de
Virtual,Lumen,GlobalIllumination,AntiAliasingMethod,ReflectionMethod,SSRdansDefaultScalability.ini(grep insensible à la casse, 0 hit). Config/DefaultEngine.iniinchangé : 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/.cppcompilent ; DLLUnrealEditor-LifePlay.dllpostérieure aux sources.SetLevels: Overall → 4 niveaux (FromOverall) ; niveau individuel →Normalize(Overall ouCustom).Recommended: VRAM dédiée (< 4Low,< 6Med,< 10High, sinon Epic ; inconnue = High).CategoryOf:LPVideo*etLPColor*→ Video ;ShadowQuality,PostProcessQuality,PostProcessAAQuality→TabHidden.LPColorGradeSubsystemnon modifié.- Démarrage
-nullrhi: exit 0, lecture des niveaux depuis Scalability, aucun avertissement vidéo.
8.3 Menu Settings (test manuel)
- Six lignes
LPVideo*avantLPColor*; 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 ;
SharedSystemMemoryvolontairement ignorée. PostProcessQualityn'est plus pilotable par le joueur (masqué, hors des 4 groupes) ;ScreenPercentagereste en Blueprint.