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

# Información general de la API XGameSave

> Referencia de la API XGameSave de XBOX que cubre el modelo de contenedores y blobs, la inicialización del proveedor, los identificadores de actualización, las actualizaciones atómicas y los diagramas del flujo de sincronización.

Este artículo explica el modelo de contenedores y blobs, y aborda la inicialización del proveedor, el cierre del proveedor y el ciclo de vida del identificador de actualización. Describe el comportamiento de las actualizaciones atómicas e incluye diagramas del flujo de sincronización. Este artículo también proporciona las restricciones de tamaño de archivo y de cuota, junto con procedimientos recomendados y preguntas frecuentes.

La API `XGameSave` le permite administrar blobs y contenedores para gestionar los datos de Game Saves. Recomendamos [XGameSaveFiles](/build/core-features/common/game-save/xgamesavefiles) para Game Saves en títulos de Microsoft Game Development Kit (GDK). Use `XGameSave` si `XGameSaveFiles` no es una opción.

Para consultar la referencia de la API del sistema de XGameSave, vea [XGameSave (contenido de la API)](/reference/system/xgamesave/xgamesave_members).

Los siguientes términos aparecen con frecuencia en `XGameSave`.

* **Bloqueo (lock)**: mecanismo que concede acceso exclusivo a los Game Saves de un título para un usuario específico en el dispositivo que está usando activamente. Garantiza que ningún otro dispositivo pueda modificar los Game Saves del usuario mientras se mantiene el bloqueo.
  * Por ejemplo, si un usuario juega al Título T en el dispositivo A, este tiene un bloqueo del Título T para ese usuario.
* **Proveedor**: proceso intermediario que se comunica con el sistema de Game Save y es responsable de administrar los datos del título. El proveedor también administra el bloqueo de un usuario en un dispositivo.
* **Contenedores**: análogos a carpetas.
* **Blobs**: análogos a archivos individuales.

## Administración del proveedor

Para adquirir un espacio de almacenamiento, el juego debe inicializar un proveedor. Después de la conexión, el título intenta adquirir un bloqueo del almacenamiento en la nube del título llamando a `XGameSaveInitializeProvider` o `XGameSaveInitializeProviderAsync`.

Si el título no puede sincronizarse desde la nube debido a una pérdida de conexión, determine si los usuarios pueden seguir jugando en modo sin conexión.

El título debe cerrar el proveedor con [XGameSaveCloseProvider](/reference/system/xgamesave/functions/xgamesavecloseprovider) cuando un título se suspende o finaliza. El proveedor no se puede reutilizar a través de los límites de suspensión y reanudación.

<Note>Este problema solo se aplica a `XGameSave`. `XGameSaveFiles` cierra el proveedor automáticamente.</Note>

## Administración de contenedores

Para evitar la pérdida de datos al acceder a los contenedores, como crear contenedores antes de que se complete la sincronización, llame a `XGameSaveEnumerateContainerInfo` o `XGameSaveEnumerateContainerInfoByName` para ver los contenedores que tiene un usuario.

Use `XGameSaveCreateContainer` para obtener un identificador de contenedor de un contenedor nuevo o existente. Si el contenedor ya existe, se proporciona su identificador. Si el contenedor no existe, se crea un contenedor nuevo y se proporciona su identificador.

Use `XGameSaveDeleteContainer` para eliminar un contenedor. Todos los blobs dentro del contenedor también se eliminan.

Para evitar fugas de identificadores, cierre todos los identificadores de contenedor con `XGameSaveCloseContainer` cuando el contenedor ya no se use o cuando el título se suspenda o finalice.

## Administración de blobs

La manipulación de datos dentro de un contenedor se realiza llamando a `XGameSaveCreateUpdate`.

Los detalles siguientes describen cómo `XGameSaveUpdate` administra los cambios de blobs dentro de un contenedor y cómo se crea, modifica y envía cada actualización.

* Una actualización se aplica a un contenedor.

* Una actualización puede escribir como máximo GS\_MAX\_BLOB\_SIZE (16 MB).

* Se pueden modificar varios blobs en una sola actualización.

* Un blob individual solo puede tener una modificación por actualización.

* Enviar una actualización consume el identificador de `XGameSaveUpdate`. Cierre el identificador tanto si el envío se realizó correctamente como si falló.

* Las actualizaciones son atómicas. Si falla cualquiera de sus partes, falla toda la actualización.

* `XGameSaveCreateUpdate` crea un contexto de actualización para almacenar todas las modificaciones de blobs.

* `XGameSaveSubmitBlobWrite` escribe datos en un blob nuevo o existente y requiere un contexto de actualización.

* `XGameSaveSubmitBlobDelete` elimina el blob.

* `XGameSaveSubmitUpdate` envía el contexto de actualización.

* `XGameSaveCloseUpdate` cierra el identificador de actualización. El título lo llama después de cada envío para evitar fugas.

* Use `XGameSaveEnumerateBlobInfo` o `XGameSaveEnumerateBlobInfoByName` para acceder a todos los blobs de un contenedor.

<Note>Los datos escritos en blobs se representan como `Base64` cuando los datos se exportan en XML.</Note>

## Implementación

Los pasos siguientes muestran el flujo general de una implementación de `XGameSave`.

1. Al iniciar o reanudar el título, inicialice el proveedor.
2. Enumere y cree identificadores de contenedor.
3. Envíe periódicamente `XGameSaveUpdates` con modificaciones de blobs y limpie el identificador de actualización al enviar.
4. Cierre los identificadores de contenedor y de proveedor cuando el título se suspenda o finalice.

<Info>Llame a `XGameSaveInitializeProvider` cuando el título se inicie y cuando se reanude. Esta llamada garantiza que el proveedor se inicialice correctamente y permanezca activo mientras el título se ejecuta. Si no se llama, el título puede comportarse de forma impredecible.</Info>

### Ejemplo de código

Para ver un ejemplo de código que muestra cómo usar las API de `XGameSave`, consulte [GameSaveCombo](https://learn.microsoft.com/samples/microsoft/xbox-gdk-samples/gamesavecombo/).

## Flujo de Game Saves

Este es un diagrama de flujo del flujo simplificado de Game Saves. Se explica a continuación.

<img src="https://mintcdn.com/microsoft-4404708b/UZTRJSf0emX1fheE/images/gdk/features/common/simple-sync-overview.png?fit=max&auto=format&n=UZTRJSf0emX1fheE&q=85&s=98c2d4bdfc034fdd8340c67e10c4d5e7" alt="Diagrama de flujo del proceso de sincronización simplificado de Game Saves." width="530" height="572" data-path="images/gdk/features/common/simple-sync-overview.png" />

### Inicio del título

El inicio del título se produce cuando el usuario inicia o reanuda el título.

### Inicio de sesión del usuario

El título inicia el inicio de sesión del usuario. Esta llamada también es donde se invoca `XGameSaveInitializeProvider`.
Para obtener más información sobre la configuración de usuarios, consulte [Modelos de usuario](/build/core-features/common/game-save/game-saves-developer-guide#user-models).

### Comprobación de conexión

El título determina si puede conectarse a la red de XBOX. Si no puede, depende de usted habilitar el [modo sin conexión](/build/core-features/common/game-save/game-saves-syncing#connection-check) para su título.

### Comprobación de propiedad de los datos

El dispositivo comprueba si el usuario está jugando actualmente en otros dispositivos. Solo un dispositivo a la vez puede acceder a los datos del usuario para un título específico.

### Sincronización de datos con la nube

El dispositivo sincroniza los datos del almacenamiento local de Game Saves con la nube. Si hay un conflicto, el sistema pide al usuario que lo resuelva con un diálogo de resolución de conflictos.

Diálogo: [¿Cuál desea usar?](/build/core-features/common/game-save/game-saves-dialogues#which-one-do-you-want-to-use)

Cuando los datos del dispositivo son más recientes que los datos de la nube, el título pide al usuario que elija entre usar los datos locales o los datos de la nube.

### Bucle de juego

El título puede leer y escribir libremente en el almacenamiento local de Game Saves.

### Fin de la sesión de juego

Cuando la sesión de juego finaliza, el sistema intenta cargar automáticamente los datos en la nube. Asegúrese de que su título llame a `XGameSaveUninitializeProvider` durante su flujo de salida para evitar dejar un proveedor inicializado. Un cierre estructurado garantiza que los datos se guarden correctamente antes de salir.

Para obtener información detallada sobre la sincronización, consulte [Descripción del flujo de sincronización de Game Saves](/build/core-features/common/game-save/game-saves-syncing).

## Límites y cuotas

### Límites

`XGameSaveUpdate` limita cada actualización a 16 MB. Como resultado, `XGameSave` solo puede administrar actualizaciones de archivos individuales de hasta 16 MB. Este límite difiere de `XGameSaveFiles`, que admite archivos de hasta 64 MB.

### Cuotas

La cantidad máxima de datos que un usuario puede guardar por título es de 256 MB. Use [XGameSaveGetRemainingQuota](/reference/system/xgamesave/functions/xgamesavegetremainingquota) para obtener la cuota restante. Para obtener una extensión de almacenamiento para su título, póngase en contacto con su Developer Partner Manager (DPM).

## Procedimientos recomendados

* No guarde datos e inmediatamente los consulte para pedir los mismos datos de vuelta.
* Las dependencias de datos entre contenedores no son confiables. Cada llamada a `XGameSaveSubmitUpdate` aplica todos los cambios de forma atómica o no aplica ninguno.
* Cuantos más blobs use por llamada de actualización, más tiempo se requiere para completar las operaciones atómicas necesarias del sistema de archivos para almacenar los datos.

## Preguntas frecuentes

### Estoy actualizando mi implementación de Game Saves. ¿Cuál es el enfoque correcto?

Use [XGameSaveFiles](/build/core-features/common/game-save/xgamesavefiles).

### ¿Puedo usar XGameSave con XGameSaveFiles?

Sí. Sin embargo, hágalo solo para migraciones. Para obtener información detallada, consulte [Interoperabilidad entre XGameSave y XGameSaveFiles](/build/core-features/common/game-save/game-saves-walkthroughs-and-samples#interop-between-xgamesave-and-xgamesavefiles).

### ¿En qué ruta de archivo guarda XGameSave?

**Consola**: se proporciona una ruta temporal mientras el título está activo. No se puede acceder a los archivos de la consola mediante el Explorador de archivos.

**PC**: `%AppData%\Local\Packages\<PACKAGE_NAME>\SystemAppData\wgs\<HexXuid>_<SCID>\`

Tenga en cuenta que la ruta de PC de `XGameSave` es diferente de la de `XGameSaveFiles`. Esta usa `xgs`.

### ¿Puedo especificar la ruta donde se deben guardar los datos?

Sí, pero solo para PC. Recomendamos este enfoque solo si está portando su solución desde otro título. Esta solución usa [guardados en la nube sin código](/build/core-features/common/game-save/game-saves-walkthroughs-and-samples#porting-previous-titles-to-pc-game-saves-with-no-code-cloud-saves).

### ¿Hay alguna situación en la que deba usar Sync on Demand?

No. Existe por motivos de compatibilidad heredada.

## Documentación de referencia de la API

* [XGameSave (contenido de la API)](/reference/system/xgamesave/xgamesave_members)
  * Funciones
    * [XGameSaveCloseProvider](/reference/system/xgamesave/functions/xgamesavecloseprovider)
    * [XGameSaveGetRemainingQuota](/reference/system/xgamesave/functions/xgamesavegetremainingquota)

## Consulte también

[Tabla de contenido de Game Saves](/build/core-features/common/game-save/game-saves-toc)


## Related topics

- [Información general de Game Saves](/es/build/core-features/common/game-save/game-saves-overview.md)
- [XGameSaveCloseProvider](/es/reference/system/xgamesave/functions/xgamesavecloseprovider.md)
- [XGameSaveGetRemainingQuota](/es/reference/system/xgamesave/functions/xgamesavegetremainingquota.md)
- [Información general de la API XGameSaveFiles](/es/build/core-features/common/game-save/xgamesavefiles.md)
- [XGameSave](/es/reference/system/xgamesave/xgamesave_members.md)
