> ## 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.

# Optimización guiada por perfiles en Visual Studio

> Optimización guiada por perfiles en Visual Studio

En este tema se describe cómo usar las [optimizaciones guiadas por perfiles](https://learn.microsoft.com/cpp/build/profile-guided-optimizations) (PGO) para juegos implementados y en ejecución en un kit de desarrollo XBOX Series X o un kit de desarrollo XBOX One. PGO es una tecnología de optimización del compilador en tiempo de ejecución que usa datos de generación de perfiles recopilados mientras se ejecutan escenarios de usuario importantes o centrados en el rendimiento para compilar una versión optimizada del título.

Las optimizaciones guiadas por perfiles tienen ventajas significativas frente a las optimizaciones estáticas tradicionales porque se basan en cómo es probable que se use el título en un entorno comercial. PGO favorece la velocidad en las rutas de código correspondientes a escenarios de usuario comunes y favorece el tamaño en los escenarios de usuario poco comunes. El resultado es un código más rápido para los escenarios comunes y un código más pequeño para los escenarios usados con menos frecuencia.

Las mejoras de rendimiento de PGO varían según el título, pero puede esperar mejoras del 5 al 30 por ciento. Tenga en cuenta que PGO no aborda el rendimiento de las partes de la aplicación centradas en la GPU.

## Creación de una compilación instrumentada

El entrenamiento con PGO se basa en una compilación del título que contiene la instrumentación de PGO. PGO usa esta instrumentación para determinar qué rutas de código se ejecutan con más frecuencia. Lo único que necesita hacer para crear una compilación instrumentada es establecer dos propiedades de compilación en Visual Studio.

#### Para crear una compilación instrumentada

1. En el **Explorador de soluciones**, haga clic con el botón derecho en el proyecto y, a continuación, seleccione **Propiedades**.
2. En el cuadro de diálogo **Páginas de propiedades**, expanda los nodos **Propiedades de configuración** y **C/C++**.
3. Seleccione la página de propiedades **Optimización** y, a continuación, establezca **Optimización de todo el programa** en **Sí** (figura 1). **Figura 1.   Establecimiento de la propiedad Optimización de todo el programa.** <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="Captura de pantalla que muestra la ubicación de la propiedad Optimización de todo el programa" width="787" height="545" data-path="images/gdk/tools/pgo_wpo.png" />
4. Expanda el nodo **Vinculador**.
5. Seleccione la página de propiedades **Optimización** y, a continuación, establezca **Generación de código en tiempo de vínculo** en **Optimización guiada por perfiles - Instrumentar** (figura 2). **Figura 2.   Establecimiento de la propiedad Generación de código en tiempo de vínculo para una compilación instrumentada.** <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="Captura de pantalla que muestra la ubicación de la propiedad Generación de código en tiempo de vínculo, configurada para crear una compilación instrumentada" width="787" height="546" data-path="images/gdk/tools/pgo_instrumented_build.png" /> \[!NOTE] Las dos propiedades descritas en este procedimiento corresponden al modificador del compilador `/GL` y al modificador del vinculador `/LTCG:PGInstrument` en MSBuild.
6. Compile e implemente la compilación instrumentada en la consola XBOX One. Con el título en ejecución, puede ver que los archivos de PGO se implementan como parte del título, de forma similar a la figura 3. **Figura 3.   Los archivos de PGO implementados por una compilación instrumentada.** <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="Captura de pantalla del directorio de la CLI que muestra los archivos de PGO implementados" width="554" height="462" data-path="images/gdk/tools/pgo_deployed_files.png" />

## Implementación de los archivos necesarios

El Microsoft Game Development Kit (GDK) incluye tres archivos que deben implementarse con el título para usar PGO. Un archivo, denominado *psapi.dll*, se instala en *C:\Program Files (x86)\Microsoft GDK\edition\GXDK\bin*.  Los otros dos, denominados *pgort140.dll* y *pgosweep.exe*, provienen de la instalación de Visual Studio.

Si usa MSBuild para compilar el título, estos archivos se copian automáticamente en el directorio *Layout* al crear una compilación instrumentada.

Si usa `makefiles` para compilar el título, debe agregar manualmente estos tres archivos al directorio *Layout* para que se implementen con el título. En Visual Studio, agregar estos archivos al proyecto y excluirlos de la compilación es una forma cómoda de conseguir que los archivos se copien en el directorio *Layout* y se implementen con el título.

#### Para agregar los archivos necesarios al proyecto de Visual Studio

1. En el **Explorador de soluciones**, haga clic con el botón derecho en el proyecto, seleccione **Agregar** y, a continuación, seleccione **Elemento existente** (figura 4). **Figura 4.   Adición de los archivos de PGO a un proyecto.** <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="Captura de pantalla que muestra cómo agregar un archivo a un proyecto" width="669" height="532" data-path="images/gdk/tools/pgo_add_binaries.png" />
2. Vaya a *C:\Program Files (x86)\Microsoft GDK\edition\GXDK\bin*, seleccione el archivo de PGO (*psapi.dll*) y, a continuación, seleccione **Agregar** para agregar el archivo al proyecto.
3. Vaya a *C:\Program Files (x86)\Microsoft Visual Studio\2019\edition\VC\Tools\MSVC\version\bin\Hostx64\x64\onecore* -o bien- *C:\Program Files\Microsoft Visual Studio\2022\edition\VC\Tools\MSVC\version\bin\Hostx64\x64\onecore* según su conjunto de herramientas y seleccione los archivos de PGO (*pgort140.dll* y *pgosweep.exe*). A continuación, seleccione **Agregar** para agregar los archivos al proyecto.
4. En el **Explorador de soluciones**, haga clic con el botón derecho en *pgort140.dll* y, a continuación, seleccione **Propiedades**.
5. En el cuadro de diálogo **Páginas de propiedades**, expanda el nodo **Propiedades de configuración** y, a continuación, seleccione la página de propiedades **General**.
6. Establezca **Excluido de la compilación** en **Sí** y, a continuación, establezca **Tipo de elemento** en **No participa en la compilación** (figura 5). **Figura 5.   Exclusión de un archivo de PGO de las compilaciones.** <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="Captura de pantalla que muestra cómo excluir un archivo de PGO de las compilaciones" width="788" height="640" data-path="images/gdk/tools/pgo_exclude_binaries.png" />

Los archivos de PGO ahora se copiarán en el directorio *Layout* y se implementarán con el título.

## Entrenamiento con la compilación instrumentada

El entrenamiento es la fase más importante de PGO. Las mejoras de rendimiento que obtenga con PGO son una función directa de lo bien que se entrene la aplicación. Para la fase de entrenamiento de PGO, ejercite los escenarios comunes centrados en el rendimiento con el título en ejecución.

Después de ejercitar los escenarios de rendimiento comunes, inicie la recopilación de un archivo de artefacto de PGO (.pgc), que captura los datos de entrenamiento. Use *pgosweep.exe* para generar el archivo .pgc (figura 6).

**Figura 6.   Ejecución 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="Captura de pantalla que muestra la ejecución de pgosweep.exe mediante el comando &#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" />

En este ejemplo, creamos un archivo .pgc denominado *Direct3DGame1!1.pgc*. Al crear un archivo .pgc, normalmente usamos la convención *titlename!#.pgc*, donde *titlename* es el nombre del título en ejecución y *#* es 1 más el número de archivos *titlename!#.pgc* que haya creado anteriormente.

Cada ejecución de *pgosweep.exe* crea un archivo .pgc independiente. Lo ideal es crear numerosos archivos .pgc que representen varios escenarios centrados en el rendimiento. Cuando termine de crear los archivos .pgc, puede verlos en el directorio *D:\\* de la **consola** (es decir, SystemScratch), de forma similar a la figura 7.

**Figura 7.   Archivos .pgc con nombres secuenciales.**

<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="Captura de pantalla que muestra un listado de directorio de tres archivos .pgc con nombres secuenciales" width="509" height="204" data-path="images/gdk/tools/pgo_pgc_files.png" />

A continuación, debe combinar los archivos .pgc en otro artefacto de PGO conocido como archivo .pgd. El compilador usa el archivo .pgd durante la última fase de PGO, la optimización.

Antes de iniciar la optimización, copie los archivos .pgc de la consola de vuelta al equipo mediante [xbcp.exe](/tools/tools-console/commandlinetools/xbcp). Los archivos .pgc deben copiarse en el directorio de salida de la compilación. (En la figura 8, el directorio de salida de la compilación es *C:\temp\Direct3DGame1\Gaming.Xbox.XboxOne.x64\Release*.)

**Figura 8.   Copia de los archivos .pgc en el directorio de salida de la compilación.**

<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="Captura de pantalla que muestra la copia de archivos .pgc desde la consola a un directorio de salida de compilación" width="651" height="129" data-path="images/gdk/tools/pgo_pgc_file_copy.png" />

## Creación de la compilación optimizada

Para crear la compilación optimizada, establezca la propiedad **Generación de código en tiempo de vínculo** en **Optimización guiada por perfiles - Actualizar** (figura 9).

**Figura 9.   Establecimiento de la propiedad Generación de código en tiempo de vínculo para una compilación optimizada.**

<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="Captura de pantalla que muestra la ubicación de la propiedad Generación de código en tiempo de vínculo, configurada para crear una compilación optimizada" width="787" height="543" data-path="images/gdk/tools/pgo_optimized_build.png" />

<Note>
  Esta propiedad corresponde al modificador del vinculador `/LTCG:PGOptimize` en MSBuild.
</Note>

Después de recompilar el título, la salida de la compilación incluye mensajes relacionados con PGO, similares a los de la figura 10.

**Figura 10.   Mensajes relacionados con PGO en la salida de la compilación.**

<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="Captura de pantalla que muestra un extracto de la salida de compilación que incluye mensajes relacionados con PGO" width="731" height="263" data-path="images/gdk/tools/pgo_optimized_build_output.png" />

## Recomendaciones de PGO para XBOX

Las instrucciones anteriores proporcionan información general para usar PGO en el Microsoft Game Development Kit (GDK) en XBOX mediante las propiedades de proyecto integradas de Visual Studio. Sin embargo, el compilador de Visual C++ ha dejado en desuso el uso de PGO a través de los modificadores `/LTCG:PGInstrument`, `/LTCG:PGOptimize` y `/LTCG:PGUpdate`, que son los que controlan las propiedades de proyecto de Visual Studio en Visual Studio 2019 y Visual Studio 2022.

Los reemplazos preferidos son los siguientes.

* Para el compilador de C/C++, use `/GL` (propiedad **Optimización de todo el programa** establecida en **Sí (/GL)**, como se mostró anteriormente en la figura 1).
* Para el vinculador, use `/LTCG` (propiedad **Generación de código en tiempo de vínculo** establecida en **Usar generación de código en tiempo de vínculo (/LTCG)**, como se muestra en la figura 11). **Figura 11.   Establecimiento de la propiedad Generación de código en tiempo de vínculo.** <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="Captura de pantalla que muestra la ubicación de la propiedad Generación de código en tiempo de vínculo" width="601" height="415" data-path="images/gdk/tools/pgo_ltcg_new_linker_switch1.png" />

A continuación, use uno de los siguientes modificadores nuevos del vinculador agregándolo al cuadro **Opciones adicionales** de la página de propiedades **Línea de comandos**:

* `/FASTGENPROFILE` o `/GENPROFILE` para generar un perfil de PGO (figura 12). Para obtener más información sobre estos modificadores, consulte [ /GENPROFILE, /FASTGENPROFILE (Generar compilación instrumentada para generación de perfiles)](https://learn.microsoft.com/cpp/build/reference/genprofile-fastgenprofile-generate-profiling-instrumented-build) en Microsoft Docs. **Figura 12.   Establecimiento del modificador del vinculador para generar un perfil de 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="Captura de pantalla que muestra el modificador del vinculador /FASTGENPROFILE agregado a la página de propiedades Línea de comandos" width="601" height="415" data-path="images/gdk/tools/pgo_ltcg_new_linker_switch2.png" />
* `/USEPROFILE` para optimizar según un conjunto de perfiles de PGO (figura 13). Para obtener más información sobre este modificador, consulte [/USEPROFILE (Ejecutar PGO en modo seguro para subprocesos)](https://learn.microsoft.com/cpp/build/reference/useprofile) en Microsoft Docs. **Figura 13.   Establecimiento del modificador del vinculador para optimizar según un conjunto de perfiles de 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="Captura de pantalla que muestra el modificador del vinculador /USEPROFILE agregado a la página de propiedades Línea de comandos" width="601" height="415" data-path="images/gdk/tools/pgo_ltcg_new_linker_switch3.png" />

## Solución de problemas de PGO

### Rendimiento en tiempo de ejecución

Al generar el perfil de una compilación instrumentada, las herramientas pueden causar problemas de rendimiento. Estos problemas pueden hacer que el título sea difícil de controlar. El modificador `/FASTGENPROFILE` es una buena opción para hacer que una compilación instrumentada sea más rápida al generar perfiles de sesiones de juego interactivas.

### Dependencias

Si habilita la instrumentación de PGO y luego descubre que el título ya no se carga, compruebe que *pgort140.dll* y *vcruntime140.dll* estén en la misma carpeta que el archivo .exe del título.

Si el intento de ejecutar *pgosweep.exe* produce un error (normalmente con un error STATUS\_DLL\_NOT\_FOUND), compruebe que *pgort140.dll*, *psapi.dll* y *vcruntime140.dll* estén presentes en la misma carpeta que el archivo .exe del título.

Asegúrese también de que está usando la versión x64 *onecore* de *pgort140.dll* y *pgosweep.exe*.

### Uso de memoria

PGO usa memoria para capturar el perfil, lo que puede ser un desafío para un título que usa una parte significativa de la memoria disponible. Para realizar PGO correctamente, es posible que necesite usar la configuración ExtraTitleMemory en [xbconfig.exe](/tools/tools-console/commandlinetools/xbconfig), la función [XMemTransferMemory](/reference/system/xmem/functions/xmemtransfermemory), o ambas.

Usar `/FASTGENPROFILE` en lugar de `/LTCG:PGInstrument` o `/GENPROFILE` produce una superficie de memoria menor con un resultado similar.

\[!NOTE] La versión de PGO que se incluye en el GDK de junio de 2020 (y sus QFE) usa memoria del título. PGO se actualizará para usar correctamente la memoria de herramientas en una versión futura.

## Consulte también

[Optimización guiada por perfiles](/tools/tools-console/pgo/pgo) [Desarrollo de juegos para consola XBOX (entorno y herramientas)](/tools/tools-console/gc-tools-console-toc)


## Related topics

- [Optimización guiada por perfiles](/es/tools/tools-console/pgo/pgo.md)
- [Optimización guiada por perfiles (PGO) para títulos de XBOX](/es/tools/tools-console/pgo/index.md)
- [Entorno y herramientas de desarrollo de juegos para consolas XBOX](/es/tools/tools-console/gc-tools-console-toc.md)
- [Herramientas y API del entorno de XBOX](/es/tools/tools-console/gc-xbox-tools-and-apis-toc.md)
- [Optimización de los flujos de trabajo de desarrollo de juegos con Visual Studio e IA](/es/build/core-features/graphics/overviews/presentations/xdd2024/gc-graphics-xdd-2024-gr12.md)
