Procedimientos recomendados para el almacenamiento conectado

Dividir datos guardados en agrupaciones lógicas

Debe dividir los datos guardados en agrupaciones lógicas que se pueden actualizar de forma independiente en lugar de escribir en un almacenamiento monolítico. Esto permite que los títulos reduzcan la cantidad de datos que escriben en diversas situaciones, lo que reduce el consumo de recursos locales y carga el uso de ancho de banda.

La API también permite que los títulos actualicen más de un elemento de datos en una operación atómica, lo que tiene la garantía de que se realizará de forma completa o no surtirá efecto (por ejemplo, en caso de que se produzca un error catastrófico).

Mantener el estado actual listo para guardar en breve aviso

Como Xbox One (o posterior) permite a los usuarios cambiar rápidamente entre los títulos, debe diseñar el título para mantener el estado actual listo para guardar en breve aviso en previsión de recibir un evento de suspensión, lo cual puede ocurrir prácticamente en cualquier momento.

La API de almacenamiento conectado usa RAM fuera de la reserva de título como primer punto de almacenamiento para maximizar la velocidad de escritura del título durante la ventana de tiempo de suspensión breve. El sistema conserva los datos en el almacenamiento duradero, los reconcilia con cualquier otra escritura de datos desde la última carga y programa las cargas de datos.

Una vez que se ha guardado y se ha puesto en cola para su carga, el sistema es sólido para diversos errores, como pérdida de conectividad de red o error de alimentación.

Cuándo cargar los datos del espacio de almacenamiento conectado de un usuario

El tiempo de ejecución para cargar el espacio de datos de almacenamiento conectado de un usuario puede variar. Las aplicaciones deben realizar esta acción durante la ejecución principal, en lugar de en respuesta al inicio de sesión de un usuario o como respuesta a recibir una notificación de suspensión del sistema.

Por lo general, las aplicaciones deben cargar un espacio de almacenamiento conectado a medida que un usuario inicia sesión e indica que desea jugar, a menos que el juego esté en un modo en el que no se necesita ninguna funcionalidad de guardado. También debe considerar la posibilidad de alinear la carga de un espacio de almacenamiento conectado con largas secuencias de datos para que las operaciones puedan ejecutarse en paralelo.

Una vez que la aplicación haya cargado los datos del espacio de almacenamiento conectado de un usuario, debe conservar este valor para guardarlo en el futuro. Mantener un espacio de almacenamiento conectado a lo largo del tiempo no tiene efectos negativos en el rendimiento o la solidez.

Debido a que la carga de un espacio de almacenamiento conectado provoca una comprobación de sincronización con la nube si el sistema está en línea, al liberar y volver a cargar el espacio de almacenamiento conectado de un usuario durante condiciones de red lentas o no confiables, es posible que el usuario vea una interfaz de usuario de sincronización hasta que se agote el tiempo del sistema.

Los espacios de almacenamiento conectados no necesitan liberarse explícitamente para provocar la sincronización en la nube. Una vez que se devuelve el controlador SubmitUpdatesAsync de finalización especificado AsyncStatus::Completeden una llamada, el sistema se encarga de la sincronización con la nube, tanto si la aplicación ConnectedStorageSpace libera el objeto como si no.

Cuándo guardar

Siempre que una aplicación recibe una notificación de suspensión, la aplicación debe guardar los datos relevantes al menos, lo que permite al sistema volver a un estado contextualmente apropiado para el usuario.

Si el diseño de tu juego usa un almacenamiento periódico, automático o Iniciado por el usuario, se puede llamar a un almacenamiento conectado con mayor frecuencia que al recibir una notificación de suspensión; hacerlo es una buena forma de reducir el riesgo de pérdida de datos debido a la pérdida de energía o a un bloqueo.

Si estás desarrollando tu juego con el XDK, cuando un usuario cierra sesión, el objeto de usuario del usuario sigue siendo válido y, en ese momento, la aplicación puede realizar operaciones de guardado finales con el almacenamiento conectado.

Solidez

Dado que los datos guardados siempre se sincronizan con la nube, se puede realizar una copia de seguridad de la aplicación en la nube y un error en el código de la aplicación y los datos guardados que hacen que la aplicación se bloquee en la nube.

Para evitar que los usuarios tengan una aplicación que se bloquee en cada inicio, diseñe la aplicación para asegurarse de que:

  • Los usuarios pueden tener acceso a un punto de la aplicación en el que pueden administrar el estado guardado, incluso si algunos datos guardados son informados.
  • La aplicación puede controlar datos dañados de forma automática, lo que recupera tantos datos como puedan y reinicializar todo lo demás con un estado seguro.

Casos de uso para diseños de Save-Game

El diseño de un sistema de ahorro de juego que hace el mejor uso de contenedores en el espacio de almacenamiento conectado depende del tipo de aplicación: almacenamiento único frente a varios guardado, como sigue.

Guardar único

Para las aplicaciones que usan un único sistema de almacenamiento de estilo de campaña, como un shooter de primera persona:

  • Coloque todos los datos en un único contenedor y escriba siempre en el mismo contenedor, identificado por nombre.

  • Considere la posibilidad de exponer una opción para restablecer todos los datos que borrarán todos los datos guardados de un usuario, en caso de que él o él quiera comenzar a reproducir la aplicación desde el principio, sin conservar el progreso anterior.

Varios guardados

Para las aplicaciones que tienen un número fijo de ranuras de guardado (como cinco ranuras), hay dos formas de usar contenedores para guardar los datos de los juegos:

  • Almacene las 5 ranuras en un contenedor de nombre fijo con 1 BLOB por cada ranura de guardado. Con este método, las 5 ranuras estarán totalmente sincronizadas y disponibles, o, en el caso de que se produzca un error en la sincronización en cualquier punto, ninguna de las ranuras se sincronizará y permanecerá en el estado anterior. Si un usuario reproduce la aplicación sin conexión en dos consolas diferentes, lo que guarda el progreso de la ranura 1 en la primera consola y en la ranura 2 de la segunda consola, el usuario debe elegir qué datos desea conservar al conectar ambas consolas a Xbox Live; la lógica de combinación de los contenedores producirá un conflicto.

  • Almacene cada ranura en un contenedor con su propio nombre. Esto permite un progreso independiente en cada ranura, incluso en varios equipos que pueden estar desconectados. Sin embargo, si un usuario cancela parcialmente a través de una sincronización, es posible que solo algunas de las ranuras estén disponibles durante esa sesión; es posible que algunos de los contenedores no se hayan completado la descarga. En tal caso, se notifica al usuario que la sincronización ha sido incompleta y que algunos de los datos de la nube no se encuentran en la consola local.

Proporcionar la interfaz de usuario para eliminar las ranuras guardadas individuales

El uso de cualquiera de los dos enfoques anteriores, la aplicación debe proporcionar al usuario la interfaz de usuario para eliminar las ranuras guardadas individuales.

Advertencia

No almacene datos dependientes entre contenedores. No almacene datos con dependencias en más de un contenedor. Los contenedores se pueden separar debido a una sincronización incompleta, pérdida de energía u otras condiciones de error. Los datos almacenados en un único contenedor deben ser autosuficientes y coherentes.

Recomendaciones

No desaconseja que los usuarios desactiven la consola o se desplacen.

El título no debe disuadir a los usuarios para que desactiven la consola o se desplacen fuera de la aplicación al guardar.

  • En Xbox 360, si un usuario apaga el sistema mientras el título está en ahorro, los datos del usuario no se guardan.
  • En Xbox One (o posterior), tu título recibe un evento suspender y tiene 1 segundo para usar la API de almacenamiento conectado para guardar el estado.

El sistema garantiza que los datos se hayan confirmado correctamente en el disco duro antes de que se apaguen por completo o se introduzcan en estado de bajo consumo. El mismo proceso de suspensión se produce si el usuario expulsa el disco del puesto para reproducir otro.

Retener espacios de almacenamiento conectados.

CONSERVE ConnectedStorageSpace los objetos en lugar de intentar cargarlos cada vez que se produzca un evento de lectura o escritura.

No hay efectos negativos en el rendimiento o la solidez causados por la conservación de ConnectedStorageSpace un objeto durante un tiempo prolongado.

Mantenga los tamaños de datos pequeños.

Reducir el tamaño de los datos guardados. Todos los datos de usuario en almacenamiento conectado se cargan en la nube cuando la consola está en línea. Optimiza los formatos de datos para garantizar retrasos mínimos y el uso del ancho de banda.

Verifique que los usuarios no tengan en cuenta que no se guardan.

Compruebe si hay errores de OutOfLocalStorage devueltos desde GetForUserAsync y SubmitUpdatesAsync, y consulte a los usuarios para ver si realmente quieren jugar sin guardar. Si un usuario indica que quiere guardar juegos, vuelva a intentar la operación.

Compruebe la cuota del usuario y solicite borrar espacio.

Comprobar si se produjo un error de SubmitUpdatesAsyncQuotaExceeded.

Si tu aplicación recibe este mensaje, notifica a los usuarios que no pueden guardar más datos hasta que hayan liberado algo de espacio y los presenten con una interfaz de usuario que les permita hacerlo. Cada usuario obtiene 256 o 64 MB de datos por aplicación, y cada título de XDK obtiene 64 MB de almacenamiento por equipo local en la consola.

Guarde el estado de los menús para restaurar más tarde.

Guardar el estado del menú y otras opciones de configuración de la aplicación, además de guardar datos básicos del juego.

Si el usuario reproduce otra aplicación y, a continuación, regresa a la suya, restáurela en un estado de menú contextualmente apropiado. Responder a los cambios de usuario que han iniciado sesión.

Los usuarios pueden cerrar sesión mientras la aplicación está suspendida. Cuando se reanuda la aplicación, debe determinar si el conjunto de usuarios que han iniciado sesión ha cambiado. Cuando esto sucede, te recomendamos que navegues a una ubicación adecuada dentro de la aplicación, como un menú.

Proporcione la interfaz de usuario para administrar los datos guardados.

La aplicación debe proporcionar una interfaz de usuario que permita a los usuarios administrar sus datos guardados dentro de la aplicación. En el caso de las aplicaciones con un sistema de guardado automático, la aplicación debe ofrecer una opción para restablecer los datos guardados y permitir a los usuarios restablecer el estado de reproducción predeterminado.

Asegúrate de que los usuarios siempre puedan acceder a la interfaz de usuario para administrar las partidas guardadas.

Asegúrate de que tu aplicación siempre pueda alcanzar su interfaz de usuario de administración para juegos guardados, incluso en presencia de datos guardados con errores. Si los datos guardados de un usuario no se pueden leer debido a un error de la aplicación o a la corrupción de los datos, la aplicación debe permitir que los usuarios se recuperen a un estado que no se bloquee o impedir que se reproduzcan.