LifePlay-Revival/Docs/Migration/etat/REL/QPERS/QPERS-PRE.md
2026-10-21 09:36:04 +02:00

180 lines
27 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

Fiche QPERS-PRE — Niveau N2 — Modèle prévu non précisé par la fiche | utilisé Sonnet 5.5 (claude-sonnet-5-5) — Agent lp-cart — Skills sk-protocol, ue-cpp-build, lp-commandlets, lp-paths
# QPERS-PRE : quick win sur la qualité des personnages, réglages de rendu à essayer en console (2026-10-20)
Hors gabarit : les sections 7 (protocole d'essai console) et 8 (recommandation et diff d'ini) sont demandées par la fiche et s'ajoutent aux six sections CART. Lecture seule : rien n'a été lancé (ni jeu, ni éditeur, ni MCP) ; aucun effet visuel ni coût GPU n'a été mesuré par l'auteur de cette fiche.
## 1. Objet et périmètre
Demande de l'utilisateur, citée mot pour mot : « un quick win sur la qualité des personnages ».
Domaine : le rendu des personnages (peau, visage, cheveux, yeux) dans le build Development `D:\Game\LifePlay_Build_5.8_Development_COM23\Windows\LifePlay.exe` (présent, 301 568 octets), moteur 5.8.3 (`D:\Game\Launcher\Engine\UE_5.8\Engine\Build\Build.version` : `"PatchVersion": 3`, `"Changelist": 58210709`). Réglages visés : essayables par la console (touche `²`, `Config/DefaultInput.ini:166-168`), sans compilation, à graver ensuite dans `Config/DefaultScalability.ini` ou `Config/DefaultEngine.ini`. Machine de la session relevée dans le journal du build COM23 : processeur Ryzen 7 5800H, carte AMD Radeon RX 6600M (`Saved/Logs/LifePlay.log:295`), mémoire vidéo dédiée détectée 8,0 Go (`LifePlay.log:1503`).
Hors périmètre : toute modification d'asset ou de code (décrite en section 6 comme piste, non traitée).
## 2. Commandes et lectures (exactes) avec compte brut
Raccourcis : `LOG` = `D:\Game\LifePlay_Build_5.8_Development_COM23\Windows\LifePlay\Saved\Logs\LifePlay.log` ; `MOT` = `D:\Game\Launcher\Engine\UE_5.8\Engine\Source\Runtime`.
| # | Commande ou lecture | Compte brut |
|---|---|---|
| 1 | Read `Config/DefaultScalability.ini` ; Read `Config/DefaultEngine.ini` l.1-60 ; Grep `r\.|sg\.|TemporalAA|SSS|SkinCache|Streaming|Sharpen|ContactShadow…` dans `DefaultEngine.ini` | 127 lignes lues ; `DefaultEngine.ini` : réglages de rendu aux l.17-30 seulement, aucune ligne SSS, SkinCache, Substrate, DynamicRes, Sharpen |
| 2 | Grep `r\.…|sg\.…` dans `Source/LifePlay/LPVideoQualitySubsystem.cpp` ; Read l.225-285 | 4 `sg.*` posés (l.265-268), 3 noms `r.*` cités en commentaire (l.256) |
| 3 | `rg -a -o ".{0,70}(SubsurfaceProfile\|MSM_Subsurface\|SSP_Girl).{0,70}" DazSkin.uasset DazSkin_Face.uasset DazSkinHide.uasset` (dossier `Content/Heavy/Daz/Bridget`) | les trois : `ShadingModel…MSM_Subsurface…ShadingModels…(ShadingModelField=4)` ; `DazSkin` et `DazSkinHide` : en plus `SubsurfaceProfile`, `/Game/Heavy/New3/Characters/SSP_Girl_Head` |
| 4 | `rg -a -o --with-filename -g "*.uasset" "ShadingModel.{1,6}MSM_[A-Za-z]+\|MSM_(Subsurface\|…)\b" Bridget Michael -d 1` | 21 lignes : 9 matériaux de corps `B_*` / `M_*` + `DazSkin`, `DazSkin_Face`, `DazSkinHide` en `MSM_Subsurface` ; `Cornea`, `EyeMoisture`, `Eyelashes`, `Transparent`, `DazBump`, `DazRough` en `MSM_DefaultLit` |
| 5 | Dans `Content` : `rg --no-ignore -a -l -g "*.uasset" -g "*.umap" -g "!**/Anims/**" "MSM_(SubsurfaceProfile\|Eye\|Hair\|PreintegratedSkin\|Cloth)" .` | **sortie vide, code 1** (aucun fichier) ; témoin : même commande avec `MSM_Subsurface` = **227** fichiers ; `rg --files -g "*.uasset"` = 8525 (filtre git) et 9074 (`--no-ignore`) |
| 6 | `rg -a -o --with-filename "ShadingModel.{1,8}MSM_…\|BLEND_…" Bridget/Hairs -d 1` | 26 lignes : cartes de cheveux en `BLEND_Masked` ; `DazHair` : `BLEND_Masked` ×2 + `MSM_Subsurface` ; `DazAcessory` : `BLEND_Opaque` + `MSM_DefaultLit` |
| 7 | `rg -a -o ".{0,100}(r\.SSS\.Scale\|r\.Streaming\.PoolSize\|r\.ScreenPercentage\|r\.DynamicRes…).{0,60}" Content/BPs/GI.uasset` | `r.SSS.Scale 0` et `r.SSS.Scale 1`, `r.Streaming.PoolSize 1500`, `r.ScreenPercentage `, `r.DynamicRes.MinScreenPercentage 50`, `…Max… 100`, `…FrameTimeBudget 33.3`, `sg.PostProcessQuality `, `r.MorphTarget.Mode ` |
| 8 | Grep sur `LOG` (motifs `r\.DynamicRes\|r\.ScreenPercentage\|r\.SSS\.Scale\|r\.Streaming\.PoolSize\|Video :…`, puis `OperationMode\|r\.TemporalAA…`) | 30 lignes (limite de sortie) puis 14 lignes : voir constats |
| 9 | `rg -a -l "ContactShadowLength" .` dans `Content` (`*.uasset`, `*.umap`, filtre git actif : 8525 `.uasset`) | **0 fichier** |
| 10 | Lectures de sources moteur (`MOT` et `Engine/Shaders`, `Engine/Config`) | fichiers et lignes cités en section 3 |
| 11 | `rg -a -l "SkeletalMeshLODInfo\|LODInfo" Heavy/Daz/Bridget Heavy/Daz/Michael -d 1` | 2 fichiers : `Michael/michael.uasset`, `Bridget/bridget_gp.uasset` |
| 12 | `ls -l` des textures de peau (`Bridget8TorsoD_1002`, `Bridget8Face01D_1001`, `Bridget8_Torso_NM_1002`) | 7 368 606 / 10 834 981 / 1 616 354 octets |
| 13 | Grep `LifePlay.uproject` (`HairStrands\|Groom\|SkinCache\|Nanite`) | 1 ligne : `LifePlay.uproject:135` `"Name": "HairStrands"` |
## 3. Constats `fichier:ligne`
### 3.1 Ce qui est déjà réglé
- **AA** : `Config/DefaultEngine.ini:17` `r.AntiAliasingMethod=2` (TAA, commentaire l.14-16, ERR-032). Le journal confirme `LOG:389` `Set CVar [[r.AntiAliasingMethod:2]]`.
- **Rendu figé** : `DefaultEngine.ini:22-24` pas de GI dynamique, reflets SSR, pas d'ombres virtuelles ; `:26` streaming de textures actif ; `:28` éclairage statique autorisé.
- **Ombres** : `DefaultScalability.ini:34-50` : `r.Shadow.MaxResolution` et `r.Shadow.MaxCSMResolution` valent 2048 à la fois au niveau 2 (High) et au niveau 3 (Epic) ; seuls le nombre de cascades (3 / 4), `RadiusThreshold` (0.04 / 0.03) et `PreShadowResolutionFactor` (0.75 / 1.0) diffèrent. Journal niveau 3 : `LOG:455-456`.
- **Textures** : `DefaultScalability.ini:67-77` : `r.Streaming.MipBias=0` aux niveaux 2 et 3, `r.MaxAnisotropy` 4 / 8, `r.Streaming.PoolSize` 700 / 1000, `r.Streaming.MaxEffectiveScreenSize=0`. Journal : anisotropie 8 au niveau 3 (`LOG:584`), 4 au niveau 2 (`LOG:1520`).
- **SSS** : `DefaultScalability.ini:85-86, 94-95, 101-102, 109-110` : `r.SSS.Scale` 0.25 / 0.5 / 0.75 / 1.0 et `r.SSS.SampleSet` 0 / 1 / 2 / 2.
- **Qualité d'AA** : `DefaultScalability.ini:117-128` ne pose que `r.PostProcessAAQuality` (0 / 2 / 4 / 4). **Cette variable n'existe pas en 5.8** : `LOG:1805` `Command not recognized: r.PostProcessAAQuality 3` ; `LOG:450`, `LOG:1546` `CVar [[r.PostProcessAAQuality:4]] deferred - dummy variable created` ; aucun résultat dans `Engine/Config` ni dans `MOT`. Ce qui varie réellement avec le niveau d'AA vient de `Engine/Config/BaseScalability.ini:52-94` : `r.TemporalAA.Quality` = 0 / 1 / 1 / 2 (journal : 2 au niveau 3 `LOG:442`, 1 au niveau 2 `LOG:1542`).
- **Panneau Video** : `Source/LifePlay/LPVideoQualitySubsystem.cpp:258-269` n'écrit que `sg.ShadowQuality`, `sg.TextureQuality`, `sg.EffectsQuality`, `sg.AntiAliasingQuality` en SetByConsole (commentaire l.255-257). Session COM23 : niveaux lus depuis Scalability = 3 (`LOG:902`), puis « Recommended = High (niveau 2), VRAM dediee detectee 8.0 Go » (`LOG:1503`), puis niveaux 2 appliqués (`LOG:1547`).
- **Réglages posés par le Blueprint `GI`** (SetByConsole, plus prioritaires que le Scalability) : `LOG:1683` `r.Streaming.PoolSize = "1500"`, `LOG:1688-1690` `r.DynamicRes.MinScreenPercentage = "50"`, `…Max… = "100"`, `…FrameTimeBudget = "33.3"`, `LOG:1786-1787` `r.SSS.Scale = "1"`, `r.ScreenPercentage = "100"`, `LOG:1804` `sg.PostProcessQuality = "2"`, `LOG:1822` `Error: r.MorphTarget.Mode is read only!`. Preuve de priorité : `LOG:4250, 4252` « `SetByScalability` was ignored as it is lower priority than the previous `SetByConsole` ». **Conséquence : graver en ini `r.ScreenPercentage`, `r.Streaming.PoolSize` ou `r.SSS.Scale` ne changerait rien tant que le Blueprint les repose.**
- **Résolution dynamique** : `r.DynamicRes.OperationMode` vaut 0 (désactivée) par défaut (`MOT/Engine/Private/UnrealEngine.cpp:538-545`) ; absent de `Config/` (Grep « OperationMode|DynamicRes » : aucun résultat) et du journal COM23. Les valeurs 50 / 100 / 33.3 du Blueprint sont donc, selon ces sources, sans effet (voir section 4, estimé).
### 3.2 Comment les personnages sont rendus
- **Peau** : `Content/Heavy/Daz/Bridget/DazSkin.uasset`, `DazSkin_Face.uasset`, `DazSkinHide.uasset` portent `ShadingModel = MSM_Subsurface` et `ShadingModelField=4` (4 = 1<<2, indice de `MSM_Subsurface` : `MOT/Engine/Classes/Engine/EngineTypes.h:707-714`). `DazSkin` et `DazSkinHide` référencent un asset de profil de diffusion (`/Game/Heavy/New3/Characters/SSP_Girl_Head`, le fichier existe) ; `DazSkin_Face` n'en référence aucun. Les 9 matériaux de corps `B_*` et `M_*` sont aussi en `MSM_Subsurface` (tableau 2, ligne 4).
- **Aucun matériau n'utilise un modèle à diffusion écran** : 0 fichier avec `MSM_SubsurfaceProfile`, `MSM_Eye`, `MSM_Hair`, `MSM_PreintegratedSkin` ou `MSM_Cloth` sur 9074 `.uasset` et les `.umap` (tableau 2, ligne 5) ; 227 fichiers en `MSM_Subsurface`.
- **Pourquoi c'est décisif** : la passe de diffusion écran ne s'exécute que si la vue contient un modèle à profil : `MOT/Engine/Public/MaterialShared.h:131-139` (`UseSubsurfaceProfile` = Subsurface Profile ou Eye ; masque = Subsurface Profile | Eye | Preintegrated Skin seulement si Substrate) et `MOT/Renderer/Private/PostProcess/PostProcessSubsurface.cpp:338-344` (`IsSubsurfaceRequiredForView` exige ce masque). Substrate est désactivé (`MOT/RenderCore/Private/RenderUtils.cpp:2069-2072` : défaut 0, lecture seule, non posé dans `DefaultEngine.ini`). Les descriptions des variables le disent : `r.SSS.Scale` « use shadingmodel SubsurfaceProfile » (`PostProcessSubsurface.cpp:36-46`), `r.SSS.Quality` « when using the SubsurfaceScatteringProfile shading model » (`:62-69`). **Donc `r.SSS.Quality`, `r.SSS.HalfRes`, `r.SSS.Checkerboard`, `r.SSS.Burley.*`, `r.SSS.SampleSet`, `r.SSS.Scale` n'ont, par lecture du code, aucun effet sur la peau actuelle**, y compris les lignes `r.SSS.*` de `DefaultScalability.ini` et les `r.SSS.Scale` du Blueprint `GI`. Le modèle `MSM_Subsurface` est éclairé par `SubsurfaceBxDF` (`Engine/Shaders/Private/ShadingModels.ush:1145-1146`) ; aucune variable de console de qualité n'a été trouvée pour lui.
- **Yeux** : `Cornea`, `EyeMoisture`, `Eyelashes` en `MSM_DefaultLit` (tableau 2, ligne 4) ; pas de modèle `Eye`.
- **Cheveux** : cartes en `BLEND_Masked` (≈ 25 matériaux, tableau 2, ligne 6). Le plugin `HairStrands` est déclaré (`LifePlay.uproject:135`), mais aucun asset de mèches n'a été établi : les occurrences de « Strands » dans les fichiers trouvés sont des noms de textures et de matériaux de cartes.
- **Maillages squelettiques** : `Michael/michael.uasset` et `Bridget/bridget_gp.uasset` contiennent le nom `LODInfo` ; le nombre de LOD n'est pas lu. `r.SkeletalMeshLODBias` : défaut 0, ajouté au LOD souhaité (`MOT/Engine/Private/Components/SkinnedMeshComponent.cpp:87-93, 4626-4633`). `r.SkeletalMeshLODRadiusScale` : défaut 1.0, **borné à 0.25-1.0** (`MOT/Core/Private/HAL/ConsoleManager.cpp:4585-4588` ; `MOT/Engine/Private/SkeletalRender.cpp:144-147`) : déjà au maximum. `r.ForceLOD` : défaut -1 (`MOT/RenderCore/Private/RenderCore.cpp:223-226`).
- **Textures de peau** : fichiers `.uasset` de 7,4 Mo (corps, diffuse), 10,8 Mo (visage, diffuse), 1,6 Mo (normale) ; la diffuse du corps porte `TEXTUREGROUP_World`, `TMGS_FromTextureGroup` et le nom de propriété `NeverStream` (valeur non lue). Dimensions non lues.
- **Ombres de contact** : `r.ContactShadows` vaut 1 par défaut (`MOT/Core/Private/HAL/ConsoleManager.cpp:4222-4227`) mais la longueur vient de la lumière (`MOT/Renderer/Private/LightRendering.cpp:669-688`) ; `ContactShadowLength` vaut 0 par défaut (`MOT/Engine/Private/Components/LightComponent.cpp:470`, propriété `LightComponent.h:129-131` « Zero is disabled ») et aucun fichier du contenu ne pose cette propriété (tableau 2, ligne 9). **La variable de console n'a donc rien à activer** : le levier est la propriété de chaque lumière (modification d'asset).
- **Cache de peau (skin cache)** : `r.SkinCache.CompileShaders` vaut 0 par défaut et est en lecture seule (`MOT/Engine/Private/GPUSkinCache.cpp:92-100`) ; `r.SkinCache.Mode` exige `CompileShaders != 0` (`:104-115`) ; `r.SkinCache.RecomputeTangents` vaut 2 (`:128-139`). Le projet ne pose rien de tel (`DefaultEngine.ini`). **Non essayable en console** : réglage de projet + recompilation des shaders.
- **Netteté** : `r.TemporalAACurrentFrameWeight` 0.04 (« Low values cause blurriness and ghosting, high values fail to hide jittering », `MOT/Renderer/Private/PostProcess/TemporalAA.cpp:40-44`) ; `r.TemporalAA.Quality` 2 (`:46-53`) ; `r.TemporalAASamples` 8 (`MOT/Renderer/Private/SceneVisibility.cpp:100-103`) ; `r.TemporalAA.Upsampling` 1, ne joue qu'en mise à l'échelle (`MOT/Engine/Private/SceneView.cpp:336-342`) ; `r.Tonemapper.Sharpen` -1 = hérite du volume de post-traitement (`MOT/Renderer/Private/PostProcess/PostProcessTonemap.cpp:34-42`) ; `r.ScreenPercentage` accepte > 100 (« supersampling », `MOT/Engine/Private/LegacyScreenPercentageDriver.cpp:38-42`) ; `sg.ResolutionQuality=0` est sans action (`MOT/Engine/Private/Scalability.cpp:532-538`).
- **Ombres des personnages** : `r.Shadow.MaxResolution` et `r.Shadow.MaxCSMResolution` valent 2048 par défaut (`ConsoleManager.cpp:4366-4376`) ; `r.Shadow.TexelsPerPixel` vaut 1.27324 « for per-object shadows », sans drapeau Scalability (`MOT/Renderer/Private/ShadowSetup.cpp:277-280`) ; le plafond lu est `r.Shadow.MaxResolution` (`ShadowSetup.cpp:707-724`) ; sur D3D11 et D3D12 la taille maximale de carte d'ombre suit `GMaxTextureDimensions` (`MOT/Windows/D3D11RHI/Private/D3D11Device.cpp:200`, `MOT/D3D12RHI/Private/D3D12RHI.cpp:231`), donc 4096 n'est pas bloqué par le RHI (valeur de `GMaxTextureDimensions` non relue).
- **Streaming** : `r.Streaming.Boost` 1.0, `r.Streaming.MipBias` 0, `r.Streaming.PoolSize` -1, `r.Streaming.FullyLoadUsedTextures` 0 (`MOT/Engine/Private/Streaming/TextureStreamingHelpers.cpp:79-86, 119-123, 191-199, 208-212`). Dans le jeu, `PoolSize` vaut 1500 (Blueprint `GI`, `LOG:1683`).
- **Capture** : `HighResShot` (`MOT/Engine/Private/GameViewportClient.cpp:3577`), `Shot` / `Screenshot` (`:3585`) ; dossier : `FPaths::ScreenShotDir` (`MOT/Core/Private/Misc/Paths.cpp:553`).
## 4. Établi / estimé / incertain
**Établi** (lu à la source) :
- La peau (3 matériaux principaux + 9 matériaux de corps) est en `MSM_Subsurface` ; aucun matériau du contenu n'est en Subsurface Profile / Eye / Hair (0 fichier sur 9074).
- La passe SSS écran est conditionnée à ces modèles (`MaterialShared.h:131-139`, `PostProcessSubsurface.cpp:338-344`) ; Substrate est désactivé.
- Aucune lumière du contenu ne pose `ContactShadowLength` (0 fichier sur 8525 `.uasset` filtrés) et le défaut moteur est 0.
- `r.PostProcessAAQuality` n'existe pas en 5.8 (journal l.1805) : les quatre sections `AntiAliasingQuality` de `DefaultScalability.ini` ne règlent rien ; l'AA varie par `r.TemporalAA.Quality` de `BaseScalability.ini`.
- `r.SkinCache.CompileShaders` = 0 en lecture seule, non posé par le projet.
- Le Blueprint `GI` repose en SetByConsole `r.ScreenPercentage`, `r.Streaming.PoolSize`, `r.SSS.Scale` : l'ini ne peut pas gagner contre lui (`LOG:1683, 1786-1787, 4250-4252`).
- Sur la machine d'essai, le jeu recommande et applique le niveau High (2) (`LOG:1503, 1547`), pas Epic.
- Noms et valeurs par défaut des variables du tableau de la section 7 : lus dans les sources 5.8.3 (section 3).
**Estimé** (déduit) :
- Résolution dynamique inactive : `OperationMode` à 0 par défaut, jamais posé dans `Config/` ni dans le journal COM23 → les valeurs 50 / 100 du Blueprint n'agissent pas (à vérifier par `r.DynamicRes.OperationMode`, section 7).
- Cheveux = cartes à masque, pas des mèches (aucun asset de mèches établi).
- Les lumières des pièces n'ont donc pas d'ombres de contact ; la diffusion de la peau n'est pas floutée en espace écran, d'où un aspect plus « mat » qu'avec un profil (jugement visuel non vérifié).
- Coûts : supersampling 125 % ≈ 1,56 fois plus de pixels → temps GPU des passes liées aux pixels ≈ +30 à +55 % ; netteté de l'étalonnage, poids TAA : < 0,1 ms ; ombres : +0,2 à +1,5 ms selon le nombre de lumières à ombre ; anisotropie 16 : < 0,3 ms ; chargement complet des textures : mémoire vidéo, pas de GPU. Raisonnement : proportionnalité aux pixels et aux texels d'ombre, passes plein écran déjà présentes ; **aucune mesure**.
- Les textures de peau ont peut-être `NeverStream` actif (nom de propriété présent, donc probablement non défaut) : dans ce cas `MipBias` et `PoolSize` ne changent rien pour elles.
**Incertain** (essai qui trancherait) :
- Nombre de LOD des deux maillages de personnages (essai : `r.ForceLOD 0` / `-1` à 5 m, section 7 ; ou lecture éditeur).
- Valeur de `NeverStream` et dimensions des textures de peau (lecture éditeur ou commandlet).
- Conditions et ordre des commandes du Blueprint `GI` (lecture par MCP, lot dédié).
- Effet visuel réel de chaque réglage et coût en millisecondes sur la RX 6600M (protocole section 7).
- Contenu hors `Content/` : `Plugins/*/Content` et `Mods/` non parcourus ; le filtre git a écarté 549 `.uasset` pour la ligne 9 du tableau 2 (ombres de contact).
- Une capture par `Shot` contient-elle la console fermée ? (à constater à la première capture).
## 5. Points à confirmer (repris par la fiche suivante)
1. Contrôle négatif : `r.SSS.Scale 0` ne change rien à la peau (section 7, étape 6). Un changement visible invaliderait la section 3.2.
2. `r.DynamicRes.OperationMode` relevé = 0 en jeu.
3. Valeurs relevées avant essai (étape 2) : `r.ScreenPercentage`, `r.TemporalAA.Quality`, `r.MaxAnisotropy`, niveaux `sg.*` ; elles servent de commandes de retour.
4. GPU en ms avant / après (`stat unit`) pour chaque réglage retenu.
5. Verdict de l'utilisateur par réglage : graver / non (grille de la section 7).
## 6. Questions pour la SPEC ou l'utilisateur
1. **Piste hors console, à plus fort potentiel (non essayable ici)** : faire passer la peau de `MSM_Subsurface` à Subsurface Profile (le profil `SSP_Girl_Head` est déjà référencé par `DazSkin` et `DazSkinHide`, pas par `DazSkin_Face`). Ce changement rend `r.SSS.*` utile et coûte du GPU. Il touche des assets (227 fichiers contiennent `MSM_Subsurface`, dont des matériaux autres que la peau) : à ouvrir comme lot avec instantané, essai éditeur sur un matériau, puis décision. Voulez-vous ce lot ?
2. Même nature : `ContactShadowLength` des lumières des pièces (propriété de lumière, ex. 0.02 d'après la plage `UIMax 0.1` de `LightComponent.h:130`) pour obtenir des ombres de contact (visage, mains, objets). Voulez-vous l'essayer dans l'éditeur ?
3. Niveau cible : la machine d'essai joue en High (niveau 2) ; graver les réglages gratuits aux niveaux 2 et 3, les coûteux au niveau 3 seul ?
4. Corriger la clé morte `r.PostProcessAAQuality` (les quatre sections AA ne règlent rien) : la remplacer par `r.TemporalAA.Quality` ou la retirer ? Hors périmètre de cette fiche.
5. Le Blueprint `GI` repose résolution, pool de textures et `r.SSS.Scale` : un éventuel supersampling doit passer par ce Blueprint ou par une option du panneau Video, pas par l'ini.
## 7. Protocole d'essai console (≈ 15 minutes)
**Préparation (3 min)**
1. Lancer `D:\Game\LifePlay_Build_5.8_Development_COM23\Windows\LifePlay.exe`, entrer dans une pièce éclairée avec un personnage immobile. Fixer la caméra : gros plan du visage et des cheveux (≈ 1 m). Ne pas ouvrir le panneau Video pendant l'essai : il réapplique les quatre `sg.*` (`LPVideoQualitySubsystem.cpp:258-269`) ; les valeurs posées en console restent prioritaires sur le Scalability (`LOG:4250`).
2. Ouvrir la console (`²`). **Relever** en tapant chaque nom seul (la console répond `nom = "valeur"`, format vu en `LOG:1683`) et noter : `r.ScreenPercentage`, `r.DynamicRes.OperationMode`, `r.TemporalAA.Quality`, `r.TemporalAACurrentFrameWeight`, `r.Tonemapper.Sharpen`, `r.MaxAnisotropy`, `r.Shadow.MaxResolution`, `r.Shadow.MaxCSMResolution`, `r.Shadow.TexelsPerPixel`, `r.Streaming.FullyLoadUsedTextures`, `sg.ShadowQuality`.
3. Taper `stat unit` et laisser affiché (temps image / jeu / dessin / **GPU** en ms). Capture : taper `Shot` (la console se ferme à la validation) ; les fichiers sont dans le dossier `Saved\Screenshots` du build (`Paths.cpp:553`). Une « capture » = un `Shot`, dans l'ordre : avant, après.
**Pour chaque réglage** : (a) `Shot` « avant » (état de départ), (b) taper la commande, attendre 3 s (5 s pour les textures), (c) `Shot` « après », noter le GPU en ms, (d) taper la commande de retour.
| Étape | Réglage | Commande à taper | Ce qu'il faut regarder | Coût attendu (estimé) | Commande de retour |
|---|---|---|---|---|---|
| 3 | **R1 Netteté de l'image par suréchantillonnage** | `r.ScreenPercentage 125` | bords des cartes de cheveux, cils, contour du visage, scintillement ; netteté de près | GPU ≈ +30 à +55 % sur les passes liées aux pixels ; si le GPU dépasse 16 ms, ne pas pousser | `r.ScreenPercentage 100` (valeur relevée) |
| 4 | **R2 Accentuation à l'étalonnage** | `r.Tonemapper.Sharpen 0.5` | détail de la peau et des yeux en gros plan, halos aux contours des cheveux, grain | < 0,1 ms | `r.Tonemapper.Sharpen -1` |
| 4 | **R3 Poids de l'image courante du TAA** | `r.TemporalAACurrentFrameWeight 0.08` | tourner lentement la caméra : texture de la peau et mèches plus nettes en mouvement, mais scintillement des cheveux et du visage (voir ERR-032) | ≈ 0 | `r.TemporalAACurrentFrameWeight 0.04` |
| 5 | **R4 Ombres des personnages** | `r.Shadow.TexelsPerPixel 2.5`, puis `r.Shadow.MaxResolution 4096`, puis `r.Shadow.MaxCSMResolution 4096` | ombre du personnage sur le sol et le mur : contour net ou crénelé, ombre sous le nez et le menton, ombre sur les vêtements | +0,2 à +1,5 ms selon les lumières à ombre ; relever le GPU après la troisième commande | `r.Shadow.TexelsPerPixel 1.27324`, `r.Shadow.MaxResolution 2048`, `r.Shadow.MaxCSMResolution 2048` |
| 6 | **R5 Textures (diagnostic)** | `r.Streaming.FullyLoadUsedTextures 1`, puis `r.MaxAnisotropy 16` | peau de très près, vêtements, sol en oblique ; si « après » = « avant », les textures sont déjà au maximum : rien à graver | pas de GPU notable ; mémoire vidéo en hausse (8 Go) : au moindre à-coup, retour | `r.Streaming.FullyLoadUsedTextures 0`, `r.MaxAnisotropy <valeur relevée>` |
| 6bis | Contrôle négatif (1 min) | `r.SSS.Scale 0` | la peau ne doit **pas** changer (section 5, point 1) | 0 | `r.SSS.Scale 1` |
| 7 | Diagnostic LOD (optionnel, 1 min) | à 5 m du personnage : `r.ForceLOD 0` | aucun changement = un seul LOD ou LOD 0 déjà choisi ; changement = des LOD existent et basculent tôt | ≈ 0 | `r.ForceLOD -1` |
**Grille à remplir**
| Réglage | Capture avant | Capture après | GPU avant (ms) | GPU après (ms) | Visible ? (oui / non / dégrade) | Graver ? |
|---|---|---|---|---|---|---|
| R1 | | | | | | |
| R2 | | | | | | |
| R3 | | | | | | |
| R4 | | | | | | |
| R5 | | | | | | |
Fin : taper les commandes de retour restantes, ou quitter le jeu (les valeurs de console ne sont pas conservées entre deux lancements).
## 8. Recommandation et diff d'ini proposé (non appliqué)
**Ce qu'il faut savoir avant de choisir.** Sur cinq candidats de la fiche, trois ne s'appliquent pas à la peau actuelle : `r.SSS.*` (aucun matériau à profil), `r.ContactShadows` (aucune lumière à longueur non nulle), `r.SkinCache.*` (non compilé, lecture seule) ; `r.SkeletalMeshLODBias` et `r.SkeletalMeshLODRadiusScale` sont soit déjà au maximum, soit sans objet si un seul LOD. Les réglages réellement essayables sont R1 à R5. Aucun effet visuel n'a été vu : la recommandation est **conditionnelle** aux captures de l'utilisateur.
**Ordre proposé (rapport effet estimé / coût)**
1. **R2 et R3 (netteté, coût nul)** : à graver aux niveaux High (2) et Epic (3) si les captures « après » sont meilleures sans scintillement gênant. Valeurs d'essai : `r.Tonemapper.Sharpen 0.5`, `r.TemporalAACurrentFrameWeight 0.08` ; si le scintillement apparaît, redescendre à 0.06.
2. **R4 (ombres)** : à graver **au niveau Epic seulement**. Aujourd'hui High et Epic ont les mêmes tailles d'ombre (2048) ; 4096 différencie enfin Epic. À essayer d'abord sur la machine d'essai en GPU ms (budget suggéré : ≤ +1 ms).
3. **R5 (textures)** : à graver (`r.MaxAnisotropy=16` au niveau 3) seulement si « après » diffère de « avant ». `FullyLoadUsedTextures` n'est pas à graver (mémoire).
4. **R1 (suréchantillonnage)** : **ne pas graver en ini** (le Blueprint `GI` repose la résolution en SetByConsole, `LOG:1787`) ; coût élevé sur une carte de 8 Go. À traiter, si l'essai plaît, comme option du panneau Video (lot de code, hors quick win).
5. **Pistes à plus fort potentiel mais hors console** : voir section 6, questions 1 et 2 (profil de diffusion pour la peau, longueur d'ombre de contact des lumières).
**Diff proposé** (texte, non appliqué ; numéros de lignes de la version actuelle de `Config/DefaultScalability.ini`). Avant d'appliquer : `Tools/Snapshot.ps1` et entrée CHG. Les valeurs `0.5` et `0.08` sont celles de l'essai ; les remplacer par celles que l'utilisateur aura retenues.
```
--- a/Config/DefaultScalability.ini
+++ b/Config/DefaultScalability.ini
@@ [ShadowQuality@3] (l.43-50)
-r.Shadow.MaxResolution=2048
-r.Shadow.MaxCSMResolution=2048
+r.Shadow.MaxResolution=4096
+r.Shadow.MaxCSMResolution=4096
@@ [TextureQuality@3] (l.73-77) ; seulement si R5 est visible
-r.MaxAnisotropy=8
+r.MaxAnisotropy=16
@@ [AntiAliasingQuality@2] (l.123-124)
r.PostProcessAAQuality=4
+r.TemporalAACurrentFrameWeight=0.08
+r.Tonemapper.Sharpen=0.5
@@ [AntiAliasingQuality@3] (l.126-127)
r.PostProcessAAQuality=4
+r.TemporalAACurrentFrameWeight=0.08
+r.Tonemapper.Sharpen=0.5
```
Notes sur le diff :
- `r.Shadow.TexelsPerPixel` n'a pas de drapeau Scalability (`ShadowSetup.cpp:277-280`) : si R4 plaît avec `2.5`, la poser dans `Config/DefaultEngine.ini` section `[SystemSettings]` (`r.Shadow.TexelsPerPixel=2.5`), valable pour tous les niveaux, ou l'ajouter à `[ShadowQuality@3]` (une variable sans drapeau Scalability posée par une section Scalability est, par estimation, acceptée ; à vérifier dans le journal par une ligne `Set CVar [[r.Shadow.TexelsPerPixel:…]]`).
- La ligne `r.PostProcessAAQuality=4` est inchangée dans le diff : elle est inerte (section 3.1) ; son sort relève de la question 4 de la section 6.
- Les clés ajoutées à `AntiAliasingQuality` restent dans le périmètre de l'en-tête du fichier (pas de méthode d'AA, pas de GI, pas de VSM, pas de reflets : `DefaultScalability.ini:7-8`).
- Vérification après application : relancer le build, lire `LifePlay.log` pour `Set CVar [[r.Tonemapper.Sharpen:0.5]]` aux niveaux 2 et 3 (même méthode que `LOG:442`).
Tours : 24 / 25
## Constats
- Anomalie hors périmètre, à signaler : le Blueprint `GI` exécute `r.MorphTarget.Mode` alors que la variable est en lecture seule (`LOG:1822` `Error: r.MorphTarget.Mode is read only!`) et `r.PostProcessAAQuality 3` (`LOG:1805`, commande non reconnue). Deux erreurs de console à chaque démarrage.
- Fichiers écrits : `D:\Game\LifePlay-master 5.8\Docs\Migration\etat\REL\QPERS\QPERS-PRE.md`.
- Fichiers à commiter : `A Docs/Migration/etat/REL/QPERS/QPERS-PRE.md` (dépôt du jeu, `.md` suivi sous `etat/`).
- À verser : `lp-perf` ou `lp-build` — le journal d'un build Development (`Saved/Logs/LifePlay.log`) donne les valeurs de console réellement appliquées (`Set CVar`, priorité SetByConsole vs SetByScalability) : le lire avant de graver un réglage en ini.