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

# Memoria

> Cómo el administrador de memoria del GDK proporciona a los juegos de consola XBOX un acceso a memoria física determinista y de alto rendimiento con garantías de recursos predecibles.

## Introducción

A diferencia de la mayoría de las aplicaciones informáticas, en las que se debe permitir que varias aplicaciones se ejecuten simultáneamente en el hardware, las consolas de juegos intentan garantizar al juego acceso exclusivo a los recursos del dispositivo. Aunque la mayoría de las consolas tienen especificaciones inferiores a las de los equipos de juego de gama alta, esto permite que los juegos de consola se optimicen explícitamente para su plataforma de destino y ofrezcan así experiencias de altísima calidad que superan las que cabría esperar al observar las estadísticas de hardware sin procesar.

Hoy en día, los jugadores esperan características (especialmente funcionalidad social y en línea) que tienen un costo y requieren cierta relajación de la garantía de recursos para admitir esa funcionalidad. Esto permite que los proveedores de servicios y plataformas como XBOX implementen esas características de manera coherente en todos los juegos.

El Microsoft Game Development Kit (GDK) proporciona a los desarrolladores de juegos acceso a la memoria física de alto rendimiento, determinista y predecible. Aunque nuestro anterior administrador de memoria del sistema operativo de la era XBOX One cubría muchas de las necesidades de los desarrolladores de juegos, se recibieron muchos comentarios sobre cómo mejorarlo. Por ejemplo, históricamente, el uso compartido de recursos de memoria entre el código del juego y los servicios de la plataforma no era tan determinista como podría haber sido.

Hemos reconstruido el administrador de memoria para abordar estos problemas, cuidando de conservar los aspectos en los que tuvimos más éxito.

Nuestra nueva arquitectura proporciona garantías más concretas y deterministas que los desarrolladores de juegos desean y esperan. La arquitectura mantiene las optimizaciones de rendimiento y la flexibilidad en las que los juegos de XBOX One han llegado a confiar.

## Diagrama de la arquitectura

El diagrama siguiente muestra la arquitectura de memoria del Microsoft Game Development Kit (GDK).

<img src="https://mintcdn.com/microsoft-4404708b/hRvcUkfcfa4mBzT_/images/gdk/features/console/mem_overview_arch.webp?fit=max&auto=format&n=hRvcUkfcfa4mBzT_&q=85&s=f36ec2f81bad373099d63f9e51bcb013" alt="Diagrama de la arquitectura de memoria del Microsoft Game Development Kit" width="1400" height="872" data-path="images/gdk/features/console/mem_overview_arch.webp" />

## Características clave

* Similitud sustancial con el sistema de la era XBOX One para aprovechar los conocimientos y la experiencia existentes de los desarrolladores:
  * Incluidas las optimizaciones para asignar páginas de 64 KB/2 MB como memoria sin inicializar
  * Familia de API `XMemAlloc`
  * Asignación y mapeo de páginas físicas con granularidad de 64 KB
* Aislamiento estricto del consumo de memoria entre los componentes del juego y los componentes que no son del juego (plataforma)
* Seguimiento en tiempo de ejecución de todo el consumo de memoria en el espacio de la partición de título
* Todos los montones Win32 usan páginas de 2 MB para mejorar el rendimiento

> \[!NOTE] El código fuente de la implementación predeterminada de `XMemAlloc` y `XMemFree` se instala como parte del Microsoft Game Development Kit (GDK). Consulte *\GXDK\gameKit\Source\amd64\heap.c*.

## Información general

### Particiones de memoria

La arquitectura de memoria del Microsoft Game Development Kit (GDK) continúa con el modelo de "tres grupos" que se creó para el sistema operativo de la era XBOX One. Dentro de esta arquitectura, cada grupo tiene la propiedad explícita de categorías específicas de uso de memoria.

* **Partición del sistema:** responsable de los procesos del sistema y las asignaciones de la plataforma, así como de las páginas ejecutables de la plataforma
* **Partición de título:** responsable de todo el consumo de memoria generado por el proceso del juego y de las páginas ejecutables del juego
* **Partición de herramientas:** un grupo de memoria opcional que se puede usar para aislar la memoria extendida/de depuración de la memoria comercial (solo disponible en los kits de desarrollo)

Las particiones de memoria se implementan internamente como instancias únicas del administrador de memoria del sistema operativo, donde cada partición tiene la propiedad de cuotas dedicadas de memoria física. Las diferentes particiones también pueden tener sus propias directivas de comportamiento; por ejemplo, el comportamiento de paginación e inicialización a cero. La partición de título está configurada para proporcionar el mejor rendimiento a los procesos del juego, y su comportamiento está ajustado para proporcionar lo siguiente:

* Normalmente, durante la asignación, el administrador de memoria de Windows rellena con ceros las páginas de memoria como medida de seguridad. En la partición de título, esta funcionalidad está deshabilitada, lo que devuelve ese rendimiento a su título.

Para obtener detalles acerca del uso de memoria del kernel, consulte [Uso de memoria del kernel](/build/console-features/memory/kernel_memory_usage).

### Separación de las asignaciones de memoria del título y del sistema

El sistema operativo de juego del Microsoft Game Development Kit (GDK) garantiza el aislamiento del uso de memoria del sistema y del juego mediante las particiones de memoria. A todos los procesos se les asigna una partición de memoria en el momento del inicio. Dado que todos los procesos del sistema se inician dentro de la partición de memoria del sistema, esos procesos no pueden asignar memoria de la partición de título que usa el juego. El proceso del título, por otro lado, usa la partición de título y obtiene su memoria de este grupo dedicado.

Se aplican varias personalizaciones al proceso del título en el inicio para lograr el aislamiento de las asignaciones de memoria entre el código del título y el del sistema. Entre ellas se incluyen las siguientes:

* Un controlador de minifiltro del sistema de archivos supervisa cada asignación de archivos y clasifica el archivo como archivo del sistema (como *kernelbase.dll*) o archivo del juego. Los archivos del sistema se etiquetan para asignarse a la partición del sistema, mientras que los archivos del juego se cargan a la partición de título.
* Se crean montones Win32 independientes tanto en la partición del sistema como en la de título (el montón de título se crea en el primer uso), que poseen las asignaciones de montón realizadas por el código del sistema y del título, respectivamente.
* Las API relacionadas con las asignaciones que se llaman a través de la tabla de direcciones de importación de cada módulo se redirigen en tiempo de carga a implementaciones independientes que atienden la asignación desde la partición del sistema o del título, según la DLL de origen.

Como resultado de esto, la partición del sistema pasa a ser responsable del costo de cargar los binarios del sistema operativo y de la plataforma, así como de cualquier asignación de memoria persistente o transitoria que se produzca.

### Costos de memoria que se cargan al título

La partición de título sigue siendo responsable de cubrir lo siguiente:

* Superficie de memoria del código y los datos/contenido específicos del proceso del juego.
* Todas las secciones de datos modificadas (es decir, secciones de copia en escritura) de los módulos cargados por el proceso del juego.
* Espacio de pila de los subprocesos.
* Entradas de la tabla de páginas necesarias para la traducción de direcciones virtuales a físicas por parte del proceso del juego.
* La memoria necesaria para crear los búferes que se pasan en las llamadas a las API del sistema.
* La memoria necesaria para capturar los resultados de las llamadas a las API del sistema, las operaciones asincrónicas y las notificaciones.
* Otros metadatos necesarios para usar las características. Por ejemplo, el montón requiere metadatos para hacer el seguimiento de las asignaciones. Se cargan a la partición de título para cualquier asignación que realice.

### Supervisión del uso de memoria y de las llamadas de asignación

El sistema de memoria del Microsoft Game Development Kit (GDK) incluye amplia compatibilidad para supervisar y hacer el seguimiento del uso de memoria en tiempo de ejecución.

La macro `XMEM_SET_ALLOCATION_HOOKS` habilita el seguimiento de la memoria que se devuelve mediante llamadas a `XMemAlloc`. Además, todas las asignaciones del montón Win32 se pueden supervisar mediante una devolución de llamada de seguimiento configurada (consulte [XMemSetWin32HeapTrackingHooks](/reference/system/xmem/functions/xmemsetwin32heaptrackinghooks)) para detectar cualquier uso de `malloc`/`new`/`HeapAlloc`.

Por último, las API `XMemGetWorkingSetStatistics` y [XMemVirtualQuery](/reference/system/xmem/functions/xmemvirtualquery) se pueden usar para proporcionar instantáneas detalladas del uso de memoria física y virtual. [XMemVirtualQuery](/reference/system/xmem/functions/xmemvirtualquery) es muy similar a `VirtualQuery`, pero devuelve información adicional que no está disponible en `VirtualQuery`, incluidos el tamaño de página y la propiedad (sistema o juego) de la memoria.

Para obtener más información acerca de las API disponibles para el seguimiento de memoria en tiempo de ejecución, consulte la sección Seguimiento de memoria de [Adaptación del título para usar el administrador de memoria del sistema operativo de juego del Microsoft GDK](/build/console-features/memory/system-memory-porting).

## Tamaños de las particiones

Un cambio significativo de esta versión en comparación con las anteriores es que la consola está configurada para proporcionar la misma configuración de memoria que se espera que su título experimente en el entorno de *consumidor comercial*.

Además, se ha agregado compatibilidad con la partición de herramientas. El tema [Adaptación del título para usar el administrador de memoria del sistema operativo de juego del Microsoft GDK](/build/console-features/memory/system-memory-porting) describe los cambios realizados para proporcionar un modelo de contabilidad de memoria determinista. Ahora se garantiza a los desarrolladores un grupo de memoria coherente para su código, al tiempo que se asegura que los binarios de la plataforma y las asignaciones transitorias se carguen a un grupo de memoria del sistema independiente del espacio de memoria direccionable por el título.

### Modo de generación de perfiles

El modo de generación de perfiles es una opción que desvía parte de los recursos del sistema operativo del sistema hacia el juego y es necesario para que herramientas como PIX funcionen a plena capacidad. Algunas características, como las aplicaciones de Hub, Game DVR y Microsoft Edge, pueden tener una experiencia degradada o no funcionar en absoluto cuando el modo de generación de perfiles está habilitado. Se puede habilitar o deshabilitar con XBOX Manager, *xbconfig.exe* (en un equipo con Windows), *wdconfig.exe* (en la consola) o el shell de Developer Home en la consola para restaurar la funcionalidad de estas características.

Cuando el modo de generación de perfiles está habilitado, hay memoria extendida/de depuración adicional que opcionalmente se puede agregar al grupo de título si se necesita más memoria. Para agregar más memoria al espacio de título, use lo siguiente:

```text theme={null}
  xbconfig ExtraTitleMemory=<value>
```

Como alternativa, active el conmutador de la opción **Extra Title Memory** en XBOX Manager o en el shell de Developer Home.

#### Configuración de la memoria

La configuración de la memoria se describe en la tabla siguiente.

| Tipo de consola      |           Modo de consola          | Modo de memoria de título |      Memoria de título     |    Memoria de herramientas |
| :------------------- | :--------------------------------: | :-----------------------: | :------------------------: | -------------------------: |
| XBOX One/XBOX One S  |                                    |                           |          5.120 MiB         |                  1.012 MiB |
| XBOX One X           |                                    |   Standard<br />Advanced  |  8.128 MiB<br />9.152 MiB  |  2.024 MiB<br /> 1.012 MiB |
|                      |                                    |                           |                            |                            |
| XBOX One X Devkit    |        XBOX One / XBOX One S       |                           |          5.120 MiB         |                  5.028 MiB |
| XBOX One X Devkit    |           XBOX One X test          |   Standard<br />Advanced  |  8.128 MiB<br />9.152 MiB  |  2.024 MiB<br /> 1.012 MiB |
| XBOX One X Devkit    |       XBOX One X Devkit \[44]      |   Standard<br />Advanced  |  8.128 MiB<br />9.152 MiB  | 14.168 MiB<br />13.156 MiB |
|                      |                                    |                           |                            |                            |
| XBOX Series S        |                                    |   Standard<br />Advanced  |  7.998 MiB<br />8.572 MiB  |                        N/D |
| XBOX Series X        |                                    |   Standard<br />Advanced  | 10.208 MiB<br />13.312 MiB |                        N/D |
|                      |                                    |                           |                            |                            |
| XBOX Series X Devkit | Lockhart Profiling (XBOX Series S) |   Standard<br />Advanced  |  7.998 MiB<br />8.572 MiB  |   6.056 MiB<br />6.048 MiB |
| XBOX Series X Devkit | Anaconda Profiling (XBOX Series X) |   Standard<br />Advanced  | 10.208 MiB<br />13.312 MiB |  9.614 MiB<br />15.666 MiB |
| XBOX Series X Devkit |            Scarlett 40GB           |                           |         37.156 MiB         |                            |

<Note>
  La memoria de herramientas de la tabla anterior solo está disponible si el modo de generación de perfiles está habilitado.
</Note>
