# VQ5-VAL — Annexe : chemins de code Overall / Custom / Recommended **Fiche :** VQ5-T2 **Rôle :** A-VAL (annexe de `Docs/Migration/24_Eval_Agents_VideoQuality.md`) **Date :** 07 octobre 2026 **Entrée :** `VQ2-VAL.md`, `VQ3-VAL.md`, `VQ4-VAL.md`, `Source/LifePlay/LPVideoQualitySubsystem.cpp` ## Modèle | | Modèle | |---|---| | Attendu | `claude-opus-5-5-medium` (M4) | | **Réel** | `claude-opus-5-5-medium` (Claude Opus 5.5) | ## Verdict : **PASS (code)** — **BLOCKED-UI** inchangé pour l'exécution des clics ## 1. Choix : note annexe plutôt que nouveau smoke `-nullrhi` Un nouveau démarrage `-nullrhi` n'apporterait rien de plus que `VQ4VAL.log` : - aucun code n'a changé depuis VQ4 (`git diff --stat` : seuls `LPSettingsSubsystem.cpp`, `LifePlay.Build.cs` et le journal ; DLL 23:29:07 postérieure aux sources, cf. VQ4-VAL §3) ; - les trois chemins Overall / Custom / Recommended ne s'exécutent que sur un événement du menu Settings (curseur ou bouton). Le sous-système n'expose aucune commande console : `-ExecCmds` ne peut pas les atteindre. En `-nullrhi`, `RHIGetTextureMemoryStats` ne renvoie de toute façon pas de VRAM réelle. Le smoke VQ4 est donc réutilisé comme preuve de démarrage, et cette annexe relie chaque chemin à son code. ## 2. Preuve de démarrage réutilisée (`Saved/Logs/VQ4VAL.log`, relu) ``` l.1121 LogLifePlay: Display: Couleur : relu Brightness 0.00, Saturation 1.00, Contrast 1.00, White Balance 6500, Tint 0.00 depuis .../LPColorGrade.ini l.1153 LogLifePlay: Display: Video : pas de .../LPVideoQuality.ini, niveaux lus depuis Scalability (Overall 3, Shadows 3, Textures 3, Effects 3, AA 3) ``` - Aucun `Warning` ni `Error` `LogLifePlay`. Seules lignes contenant `Error` : l.12 (Trace Server, accès refusé, sans lien) et l.1468 (`InputMode:UIOnly ... Non-Focusable widget`, déjà vue en VQ2/VQ3). - Chemin couvert : `Initialize` → `Load` → `ReadFromScalability` → `Normalize` (Overall = 3 car les 4 groupes sont égaux), puis `ApplyToScalability` sort sans rien écrire (`bConfigured == false`). ## 3. Chemins de code (`LPVideoQualitySubsystem.cpp`) | Chemin | Appel | Code | Résultat attendu | Statut | |---|---|---|---|---| | **Overall** | curseur `LPVideoOverall` → `OnOverallChanged` (l.331) | `SetLevels(FromOverall(RoundToInt(V)), true)` ; `FromOverall` (l.116) borne 0..3 et met les 5 champs au même niveau ; `SetLevels` (l.289) prend la branche `bFromOverall && Overall >= 0` | 4 groupes = N, readout `Low/Med/High/Epic`, `Save`, `ApplyToScalability` | **PASS (code)** | | **Custom** | curseur individuel → `OnShadows/Textures/Effects/AAChanged` (l.340-382) | copie de `Levels`, un champ modifié, `SetLevels(L, false)` → `Normalize` (l.128) : `Overall = (4 égaux) ? niveau : -1` | `LevelLabel(-1)` = `Custom` (l.150) ; curseur Overall placé sur la moyenne arrondie (l.314) | **PASS (code)** | | **Retour depuis Custom** | ramener les 4 curseurs au même niveau | même `Normalize` | Overall réaffiche ce niveau | **PASS (code)** | | **Recommended** | bouton `LPVideoRecommended` → `OnRecommendedClicked` (l.384, lié l.465) | `QueryDedicatedVideoMemoryBytes` (l.36 : garde `GDynamicRHI`, `max(.., 0)`) → `LevelFromVramGB` (l.48 : ≤ 0 → 2 ; < 4 → 0 ; < 6 → 1 ; < 10 → 2 ; sinon 3) → `SetLevels(FromOverall(Level), true)` | même chemin que Overall ; journal `Recommended = ... VRAM dediee ...` | **PASS (code)** | | Anti-boucle | `RefreshWidgets` (l.306) | garde `bRefreshing` ; chaque handler sort si elle est levée | `SetValue` ne relance pas `SetLevels` | **PASS (code)** | | Ré-application | `Tick` (l.168) nouveau monde de jeu ; fin d'`EnsureControls` (l.621) | `ApplyToScalability` | le Blueprint ne réécrase pas les niveaux au chargement / à l'ouverture du menu | **PASS (code)** | | Exécution réelle des clics | menu Settings ouvert, vrai RHI | — | journaux `controles ajoutes`, `enregistres dans`, `Recommended = ...` | **BLOCKED-UI** | ## 4. Constat hors des trois chemins (relevé pendant VQ5) Le point 1 de `VQ1-IMPL.md` §4 (« confronter chaque valeur à `Engine/Config/BaseScalability.ini` ») n'a été repris par aucune fiche VAL. Comparaison faite ici (`D:\Game\Launcher\Engine\UE_5.5\Engine\Config\BaseScalability.ini`), écarts réels au niveau **3 (Epic)**, celui que le moteur applique au démarrage (`Overall 3` ci-dessus) : | cvar | Moteur 5.5 | Projet | Effet | |---|---|---|---| | `r.Shadow.CSM.MaxCascades` | 10 | 4 | moins de cascades au loin | | `r.Shadow.RadiusThreshold` | 0.01 | 0.03 | les petits objets perdent leur ombre plus tôt | | `r.DetailMode` | 3 | 2 | composants « detail mode » Epic masqués | | `r.RefractionQuality` | 2 | 3 | **au-dessus** du palier Epic moteur (contraire à VQ1-SPEC §3) | | `r.PostProcessAAQuality` | (non fixé par `AntiAliasingQuality@3`) | 4 | valeur imposée | Aux niveaux 0–2, d'autres écarts existent (`r.Streaming.PoolSize` 200/400/700 contre 400/600/800, `r.Streaming.MipBias@0` 2.5 contre 16, `r.Shadow.MaxResolution@2` 2048 contre 1024, etc.). Conséquence : `DefaultScalability.ini` modifie le rendu Epic **pour tous les joueurs, même sans ouvrir l'onglet Video**. L'affirmation « sans INI, aucun changement par rapport à l'état actuel » (VQ2-SPEC §6.2, doc 23 §2.1) n'est vraie que pour les niveaux `sg.*`, pas pour les cvars qu'ils appliquent. Aucun verrou L7c n'est touché (GI, VSM, méthode d'AA, reflets), donc les verdicts VQ1 et VQ4 tiennent sur leur contrat. En revanche, la baseline visuelle de L7c n'est plus garantie au niveau Epic. Suite proposée : voir la recommandation 1 du doc 24. ## 5. Synthèse | Critère | Statut | |---|---| | Overall → `FromOverall` → 4 groupes | PASS (code) | | Individuel → `Normalize` → `Custom` / retour niveau | PASS (code) | | Recommended → VRAM → `FromOverall` | PASS (code) | | Démarrage `-nullrhi` (preuve VQ4 relue) | PASS | | Clics réels dans Settings | BLOCKED-UI | | Valeurs `DefaultScalability.ini` vs moteur | **Réserve** (écarts Epic, §4) |