LifePlay-Revival/Docs/Migration/etat/REL/QPERS/QPERS-PRE.md

181 lines
27 KiB
Markdown
Raw Normal View History

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.