> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Optimisation guidée par profil dans Visual Studio

> Optimisation guidée par profil dans Visual Studio

Cette rubrique décrit comment utiliser les [optimisations guidées par profil](https://learn.microsoft.com/cpp/build/profile-guided-optimizations) (PGO) pour les jeux déployés et exécutés sur un kit de développement XBOX Series X ou XBOX One. PGO est une technologie d'optimisation du compilateur qui utilise des données de profilage, collectées lors de l'exécution de scénarios utilisateur importants ou axés sur les performances, pour générer une version optimisée du titre.

Les optimisations guidées par profil présentent des avantages significatifs par rapport aux optimisations statiques traditionnelles, car elles reposent sur la manière dont le titre est susceptible d'être utilisé dans un environnement commercial. PGO privilégie la vitesse pour les chemins de code correspondant aux scénarios utilisateur courants et la taille pour les scénarios peu courants. Il en résulte un code plus rapide pour les scénarios courants et un code plus compact pour les scénarios moins fréquents.

Les gains de performances obtenus avec PGO varient selon le titre, mais vous pouvez vous attendre à des gains de 5 à 30 pour cent. Sachez que PGO n'agit pas sur les performances des parties de l'application centrées sur le GPU.

## Créer une build instrumentée

L'entraînement avec PGO repose sur une build de votre titre qui contient l'instrumentation PGO. PGO utilise cette instrumentation pour déterminer les chemins de code exécutés le plus fréquemment. Pour créer une build instrumentée, il vous suffit de définir deux propriétés de build dans Visual Studio.

#### Pour créer une build instrumentée

1. Dans l'**Explorateur de solutions** (**Solution Explorer**), cliquez avec le bouton droit sur votre projet, puis sélectionnez **Properties**.
2. Dans la boîte de dialogue **Property Pages**, développez les nœuds **Configuration Properties** et **C/C++**.
3. Sélectionnez la page de propriétés **Optimization**, puis définissez **Whole Program Optimization** sur **Yes** (figure 1). **Figure 1.   Définition de la propriété Whole Program Optimization.** <img src="https://mintcdn.com/microsoft-4404708b/stYRJgFi22xot4tO/images/gdk/tools/pgo_wpo.png?fit=max&auto=format&n=stYRJgFi22xot4tO&q=85&s=6ecb0d86d212e2b6aa8c5c95d0cf4d40" alt="Capture d'écran montrant l'emplacement de la propriété Whole Program Optimization" width="787" height="545" data-path="images/gdk/tools/pgo_wpo.png" />
4. Développez le nœud **Linker**.
5. Sélectionnez la page de propriétés **Optimization**, puis définissez **Link Time Code Generation** sur **Profile Guided Optimization - Instrument** (figure 2). **Figure 2.   Définition de la propriété Link Time Code Generation pour une build instrumentée.** <img src="https://mintcdn.com/microsoft-4404708b/stYRJgFi22xot4tO/images/gdk/tools/pgo_instrumented_build.png?fit=max&auto=format&n=stYRJgFi22xot4tO&q=85&s=03a70b82d39722d95fc1ccfef8ceb5cd" alt="Capture d'écran montrant l'emplacement de la propriété Link Time Code Generation, définie pour créer une build instrumentée" width="787" height="546" data-path="images/gdk/tools/pgo_instrumented_build.png" /> \[!NOTE] Les deux propriétés décrites dans cette procédure correspondent au commutateur de compilateur `/GL` et au commutateur d'éditeur de liens `/LTCG:PGInstrument` dans MSBuild.
6. Générez et déployez la build instrumentée sur votre console XBOX One. Lorsque votre titre est en cours d'exécution, vous pouvez constater que les fichiers PGO sont déployés avec votre titre, comme dans la figure 3. **Figure 3.   Fichiers PGO déployés par une build instrumentée.** <img src="https://mintcdn.com/microsoft-4404708b/z-rLYkO3Ax6HPtgm/images/gdk/tools/pgo_deployed_files.png?fit=max&auto=format&n=z-rLYkO3Ax6HPtgm&q=85&s=30778992c2fee2f3762bac43a8269b48" alt="Capture d'écran d'un répertoire en ligne de commande montrant les fichiers PGO déployés" width="554" height="462" data-path="images/gdk/tools/pgo_deployed_files.png" />

## Déployer les fichiers requis

Le Microsoft Game Development Kit (GDK) comprend trois fichiers qui doivent être déployés avec votre titre pour utiliser PGO. Un fichier, nommé *psapi.dll*, est installé dans *C:\Program Files (x86)\Microsoft GDK\edition\GXDK\bin*. Les deux autres, nommés *pgort140.dll* et *pgosweep.exe*, proviennent de votre installation de Visual Studio.

Si vous utilisez MSBuild pour générer votre titre, ces fichiers sont automatiquement copiés dans votre répertoire *Layout* lorsque vous créez une build instrumentée.

Si vous utilisez des `makefiles` pour générer votre titre, vous devez ajouter manuellement ces trois fichiers à votre répertoire *Layout* afin qu'ils soient déployés avec votre titre. Dans Visual Studio, ajouter ces fichiers à votre projet en les excluant de la build est un moyen pratique de les faire copier dans votre répertoire *Layout* et déployer avec le titre.

#### Pour ajouter les fichiers requis à votre projet Visual Studio

1. Dans l'**Explorateur de solutions**, cliquez avec le bouton droit sur votre projet, sélectionnez **Add**, puis **Existing Item** (figure 4). **Figure 4.   Ajout des fichiers PGO à un projet.** <img src="https://mintcdn.com/microsoft-4404708b/z-rLYkO3Ax6HPtgm/images/gdk/tools/pgo_add_binaries.png?fit=max&auto=format&n=z-rLYkO3Ax6HPtgm&q=85&s=7f212c1d64c1eb1ca76e4ed731fb1ef8" alt="Capture d'écran montrant comment ajouter un fichier à un projet" width="669" height="532" data-path="images/gdk/tools/pgo_add_binaries.png" />
2. Accédez à *C:\Program Files (x86)\Microsoft GDK\edition\GXDK\bin*, sélectionnez le fichier PGO (*psapi.dll*), puis sélectionnez **Add** pour ajouter le fichier à votre projet.
3. Accédez à *C:\Program Files (x86)\Microsoft Visual Studio\2019\edition\VC\Tools\MSVC\version\bin\Hostx64\x64\onecore* ou à *C:\Program Files\Microsoft Visual Studio\2022\edition\VC\Tools\MSVC\version\bin\Hostx64\x64\onecore* pour votre ensemble d'outils, puis sélectionnez les fichiers PGO (*pgort140.dll* et *pgosweep.exe*). Sélectionnez ensuite **Add** pour ajouter les fichiers à votre projet.
4. Dans l'**Explorateur de solutions**, cliquez avec le bouton droit sur *pgort140.dll*, puis sélectionnez **Properties**.
5. Dans la boîte de dialogue **Property Pages**, développez le nœud **Configuration Properties**, puis sélectionnez la page de propriétés **General**.
6. Définissez **Excluded From Build** sur **Yes**, puis **Item Type** sur **Does not participate in build** (figure 5). **Figure 5.   Exclusion d'un fichier PGO des builds.** <img src="https://mintcdn.com/microsoft-4404708b/z-rLYkO3Ax6HPtgm/images/gdk/tools/pgo_exclude_binaries.png?fit=max&auto=format&n=z-rLYkO3Ax6HPtgm&q=85&s=3ad61a9625ce53e6776c58e0f8f990d5" alt="Capture d'écran montrant comment exclure un fichier PGO des builds" width="788" height="640" data-path="images/gdk/tools/pgo_exclude_binaries.png" />

Les fichiers PGO sont maintenant copiés dans votre répertoire *Layout* et déployés avec votre titre.

## Entraînement avec la build instrumentée

L'entraînement est la phase la plus importante de PGO. Les gains de performances obtenus avec PGO dépendent directement de la qualité de l'entraînement de l'application. Pendant la phase d'entraînement de PGO, exécutez les scénarios courants axés sur les performances pendant que votre titre s'exécute.

Après avoir exécuté les scénarios de performances courants, lancez la collecte d'un fichier d'artefact PGO (.pgc), qui capture vos données d'entraînement. Utilisez *pgosweep.exe* pour générer votre fichier .pgc (figure 6).

**Figure 6.   Exécution de pgosweep.exe.**

<img src="https://mintcdn.com/microsoft-4404708b/stYRJgFi22xot4tO/images/gdk/tools/pgo_run_pgosweep.png?fit=max&auto=format&n=stYRJgFi22xot4tO&q=85&s=19e5af6dae653bff3e8ff35815c156bf" alt="Capture d'écran montrant l'exécution de pgosweep.exe à l'aide de la commande &#x22;xbrun /x/title /O g:\pgosweep.exe Direct3DGame1.exe d:\Direct3DGame1!1.pgc&#x22;" width="740" height="68" data-path="images/gdk/tools/pgo_run_pgosweep.png" />

Dans cet exemple, nous avons créé un fichier .pgc nommé *Direct3DGame1!1.pgc*. Lors de la création d'un fichier .pgc, nous utilisons généralement la convention *titlename!#.pgc*, où *titlename* est le nom du titre en cours d'exécution et *#* correspond à 1 plus le nombre de fichiers *titlename!#.pgc* créés précédemment.

Chaque exécution de *pgosweep.exe* crée un fichier .pgc distinct. Idéalement, vous créerez de nombreux fichiers .pgc représentant divers scénarios axés sur les performances. Une fois vos fichiers .pgc créés, vous pouvez les voir dans le répertoire *D:\\* de votre **console** (c'est-à-dire SystemScratch), comme dans la figure 7.

**Figure 7.   Fichiers .pgc nommés séquentiellement.**

<img src="https://mintcdn.com/microsoft-4404708b/stYRJgFi22xot4tO/images/gdk/tools/pgo_pgc_files.png?fit=max&auto=format&n=stYRJgFi22xot4tO&q=85&s=9fb63ae09835246453011a1e670267e3" alt="Capture d'écran montrant la liste d'un répertoire contenant trois fichiers .pgc nommés séquentiellement" width="509" height="204" data-path="images/gdk/tools/pgo_pgc_files.png" />

Vous devez ensuite fusionner vos fichiers .pgc dans un autre artefact PGO appelé fichier .pgd. Le fichier .pgd est utilisé par le compilateur pendant la dernière phase de PGO, l'optimisation.

Avant de démarrer l'optimisation, copiez vos fichiers .pgc de la console vers votre PC à l'aide de [xbcp.exe](/fr/tools/tools-console/commandlinetools/xbcp). Les fichiers .pgc doivent être copiés dans le répertoire de sortie de votre build. (Dans la figure 8, le répertoire de sortie de la build est *C:\temp\Direct3DGame1\Gaming.Xbox.XboxOne.x64\Release*.)

**Figure 8.   Copie des fichiers .pgc dans le répertoire de sortie de la build.**

<img src="https://mintcdn.com/microsoft-4404708b/stYRJgFi22xot4tO/images/gdk/tools/pgo_pgc_file_copy.png?fit=max&auto=format&n=stYRJgFi22xot4tO&q=85&s=2968da3f83e400958c52e50eb65f5ac4" alt="Capture d'écran montrant la copie de fichiers .pgc de la console vers un répertoire de sortie de build" width="651" height="129" data-path="images/gdk/tools/pgo_pgc_file_copy.png" />

## Créer la build optimisée

Pour créer votre build optimisée, définissez la propriété **Link Time Code Generation** sur **Profile Guided Optimization - Update** (figure 9).

**Figure 9.   Définition de la propriété Link Time Code Generation pour une build optimisée.**

<img src="https://mintcdn.com/microsoft-4404708b/stYRJgFi22xot4tO/images/gdk/tools/pgo_optimized_build.png?fit=max&auto=format&n=stYRJgFi22xot4tO&q=85&s=8b2cca5395984b3e25478674c66d0a6e" alt="Capture d'écran montrant l'emplacement de la propriété Link Time Code Generation, définie pour créer une build optimisée" width="787" height="543" data-path="images/gdk/tools/pgo_optimized_build.png" />

<Note>
  Cette propriété correspond au commutateur d'éditeur de liens `/LTCG:PGOptimize` dans MSBuild.
</Note>

Après avoir régénéré votre titre, la sortie de votre build contient des messages liés à PGO, semblables à ceux de la figure 10.

**Figure 10.   Messages liés à PGO dans la sortie de build.**

<img src="https://mintcdn.com/microsoft-4404708b/stYRJgFi22xot4tO/images/gdk/tools/pgo_optimized_build_output.png?fit=max&auto=format&n=stYRJgFi22xot4tO&q=85&s=67ad41198da6a7925eeca4761b438038" alt="Capture d'écran montrant un extrait de sortie de build contenant des messages liés à PGO" width="731" height="263" data-path="images/gdk/tools/pgo_optimized_build_output.png" />

## Recommandations pour PGO sur XBOX

Les instructions précédentes fournissent une vue d'ensemble de l'utilisation de PGO avec le Microsoft Game Development Kit (GDK) sur XBOX à l'aide des propriétés de projet intégrées de Visual Studio. Le compilateur Visual C++ a toutefois déconseillé l'utilisation de PGO via les commutateurs `/LTCG:PGInstrument`, `/LTCG:PGOptimize` et `/LTCG:PGUpdate`, que contrôlent les propriétés de projet de Visual Studio dans Visual Studio 2019 et Visual Studio 2022.

Les remplacements recommandés sont les suivants.

* Pour le compilateur C/C++, utilisez `/GL` (propriété **Whole Program Optimization** définie sur **Yes (/GL)**, comme indiqué précédemment dans la figure 1).
* Pour l'éditeur de liens, utilisez `/LTCG` (propriété **Link Time Code Generation** définie sur **Use Link Time Code Generation (/LTCG)**, comme indiqué dans la figure 11). **Figure 11.   Définition de la propriété Link Time Code Generation.** <img src="https://mintcdn.com/microsoft-4404708b/stYRJgFi22xot4tO/images/gdk/tools/pgo_ltcg_new_linker_switch1.png?fit=max&auto=format&n=stYRJgFi22xot4tO&q=85&s=d5400ad2c7d5451776e58d3454a56095" alt="Capture d'écran montrant l'emplacement de la propriété Link Time Code Generation" width="601" height="415" data-path="images/gdk/tools/pgo_ltcg_new_linker_switch1.png" />

Utilisez ensuite l'un des nouveaux commutateurs d'éditeur de liens suivants en l'ajoutant dans la zone **Additional Options** de la page de propriétés **Command Line** :

* `/FASTGENPROFILE` ou `/GENPROFILE` pour générer un profil PGO (figure 12). Pour plus d'informations sur ces commutateurs, consultez [/GENPROFILE, /FASTGENPROFILE (Générer une build instrumentée de profilage)](https://learn.microsoft.com/cpp/build/reference/genprofile-fastgenprofile-generate-profiling-instrumented-build) sur Microsoft Docs. **Figure 12.   Définition du commutateur d'éditeur de liens pour générer un profil PGO.** <img src="https://mintcdn.com/microsoft-4404708b/stYRJgFi22xot4tO/images/gdk/tools/pgo_ltcg_new_linker_switch2.png?fit=max&auto=format&n=stYRJgFi22xot4tO&q=85&s=6d24306b34e2a2282af826c5d05e9075" alt="Capture d'écran montrant le commutateur d'éditeur de liens /FASTGENPROFILE ajouté à la page de propriétés Command Line" width="601" height="415" data-path="images/gdk/tools/pgo_ltcg_new_linker_switch2.png" />
* `/USEPROFILE` pour optimiser à partir d'un ensemble de profils PGO (figure 13). Pour plus d'informations sur ce commutateur, consultez [/USEPROFILE (Exécuter PGO en mode thread-safe)](https://learn.microsoft.com/cpp/build/reference/useprofile) sur Microsoft Docs. **Figure 13.   Définition du commutateur d'éditeur de liens pour optimiser à partir d'un ensemble de profils PGO.** <img src="https://mintcdn.com/microsoft-4404708b/stYRJgFi22xot4tO/images/gdk/tools/pgo_ltcg_new_linker_switch3.png?fit=max&auto=format&n=stYRJgFi22xot4tO&q=85&s=6eb5e198e65bf9ced6af8c947c5702a0" alt="Capture d'écran montrant le commutateur d'éditeur de liens /USEPROFILE ajouté à la page de propriétés Command Line" width="601" height="415" data-path="images/gdk/tools/pgo_ltcg_new_linker_switch3.png" />

## Résolution des problèmes PGO

### Performances à l'exécution

Lors du profilage d'une build instrumentée, les outils peuvent entraîner des problèmes de performances, susceptibles de rendre votre titre difficile à contrôler. Le commutateur `/FASTGENPROFILE` est un bon choix pour accélérer une build instrumentée destinée au profilage de sessions de jeu interactives.

### Dépendances

Si vous activez l'instrumentation PGO et constatez ensuite que votre titre ne se charge plus, vérifiez que *pgort140.dll* et *vcruntime140.dll* se trouvent dans le même dossier que le fichier .exe de votre titre.

Si l'exécution de *pgosweep.exe* échoue (généralement avec une erreur STATUS\_DLL\_NOT\_FOUND), vérifiez que *pgort140.dll*, *psapi.dll* et *vcruntime140.dll* se trouvent dans le même dossier que le fichier .exe de votre titre.

Veillez également à utiliser la version x64 *onecore* de *pgort140.dll* et de *pgosweep.exe*.

### Utilisation de la mémoire

PGO utilise de la mémoire pour capturer le profil, ce qui peut poser problème pour un titre qui utilise une part importante de la mémoire disponible. Pour réussir l'utilisation de PGO, vous devrez peut-être utiliser le paramètre ExtraTitleMemory de [xbconfig.exe](/fr/tools/tools-console/commandlinetools/xbconfig), la fonction [XMemTransferMemory](/fr/reference/system/xmem/functions/xmemtransfermemory), ou les deux.

L'utilisation de `/FASTGENPROFILE` plutôt que de `/LTCG:PGInstrument` ou `/GENPROFILE` réduit l'empreinte mémoire pour un résultat similaire.

\[!NOTE] La version de PGO fournie dans le GDK de juin 2020 (et ses QFE) utilise la mémoire du titre. PGO sera mis à jour pour utiliser correctement la mémoire des outils dans une version ultérieure.

## Voir aussi

[Optimisation guidée par profil](/fr/tools/tools-console/pgo/pgo) [Développement de jeux sur console XBOX (environnement et outils)](/fr/tools/tools-console/gc-tools-console-toc)


## Related topics

- [Optimisation guidée par profil](/fr/tools/tools-console/pgo/pgo.md)
- [Optimisation guidée par profil (PGO) pour les titres XBOX](/fr/tools/tools-console/pgo/index.md)
- [Recommandations relatives aux commutateurs du compilateur et de l'éditeur de liens Visual C++](/fr/tools/tools-console/visualstudio/compiler-switch-recommendations.md)
- [Environnement et outils de développement de jeux sur console XBOX](/fr/tools/tools-console/gc-tools-console-toc.md)
- [Outils et API de l'environnement XBOX](/fr/tools/tools-console/gc-xbox-tools-and-apis-toc.md)
