Fonctionnement de la machine à états
Game Saves utilise une machine à états interne pour coordonner les rappels d’interface utilisateur avec le cycle de vie de l’opération asynchrone. Lorsqu’un rappel d’interface utilisateur se déclenche, l’opération asynchrone est suspendue. Le rappelXAsyncBlock ne se déclenche pas tant que le rappel n’est pas résolu. La machine à états ne progresse pas tant que le jeu n’appelle pas l’API de réponse correspondante ou que l’opération asynchrone n’est pas annulée.
Cela signifie que :
- Chaque type de rappel possède une API de réponse correspondante. Appelez l’API de réponse pour indiquer au système ce qu’il doit faire ensuite.
- Les API de réponse peuvent être appelées à l’intérieur ou à l’extérieur de la fonction de rappel.
- Si une action de réponse est
Retry, l’opération est retentée et peut déclencher de nouveau le même rappel. - Le rappel
XAsyncBlockne se déclenche qu’une fois que l’opération atteint un état final : réussite, annulation ou basculement hors connexion.
PFGameSaveFilesUiSyncFailedCallbackse déclenche avec l’erreur.- Le rappel
XAsyncBlockne se déclenche pas encore. La machine à états attend une réponse. - Si l’utilisateur sélectionne
Retryet que la nouvelle tentative échoue également, le rappel d’échec de synchronisation se déclenche de nouveau. - Si l’utilisateur sélectionne
Cancel, le rappelXAsyncBlockse déclenche avecE_PF_GAMESAVE_USER_CANCELLED. - Si une nouvelle tentative réussit, le rappel
XAsyncBlockse déclenche avecS_OK.
Moment de déclenchement des rappels
Les rappels d’interface utilisateur ne se déclenchent que pendant deux opérations asynchrones :Inscription des rappels
Inscrivez tous les rappels avant d’appelerPFGameSaveFilesAddUserWithUiAsync ou PFGameSaveFilesUploadWithUiAsync :
Référence des rappels
Progression
Signale la progression du téléversement ou du téléchargement. UtilisezPFGameSaveFilesUiProgressGetProgress dans le rappel pour obtenir le PFGameSaveFilesSyncState actuel, le nombre d’octets traités et le nombre total d’octets.
Rappel : PFGameSaveFilesUiProgressCallback
API de réponse : PFGameSaveFilesSetUiProgressResponse
Le rappel de progression n’a pas besoin de réponse pour continuer. L’opération progresse d’elle-même. N’appelez l’API de réponse que si l’utilisateur souhaite annuler.
États de synchronisation
L’énumérationPFGameSaveFilesSyncState indique la phase dans laquelle se trouve l’opération :
Échec de synchronisation
Se déclenche lorsqu’une opération de synchronisation échoue, par exemple en raison de problèmes réseau ou de limites de débit. Rappel :PFGameSaveFilesUiSyncFailedCallback
Paramètres : reçoit PFGameSaveFilesSyncState (la phase qui a échoué) et HRESULT (le code d’erreur).
API de réponse : PFGameSaveFilesSetUiSyncFailedResponse
Pour plus de détails sur le comportement du mode hors connexion, consultez Mode hors connexion de Game Saves.
Conflit d’appareil actif
Se déclenche pendantPFGameSaveFilesAddUserWithUiAsync lorsqu’un autre appareil est déjà l’appareil actif pour cet utilisateur. Le rappel reçoit des structures PFGameSaveDescriptor pour les données de sauvegarde locales et distantes, qui comprennent les noms des appareils, les horodatages et la taille des sauvegardes, que vous pouvez afficher pour aider l’utilisateur à prendre une décision.
Rappel : PFGameSaveFilesUiActiveDeviceContentionCallback
API de réponse : PFGameSaveFilesSetUiActiveDeviceContentionResponse
Pour plus de détails sur le comportement de l’appareil actif, consultez Changements d’appareil actif de Game Saves.
Conflit
Se déclenche pendantPFGameSaveFilesAddUserWithUiAsync lorsque les données de sauvegarde locales et infonuagiques ont divergé. Le rappel reçoit des structures PFGameSaveDescriptor pour les données de sauvegarde locales et distantes.
Rappel : PFGameSaveFilesUiConflictCallback
API de réponse : PFGameSaveFilesSetUiConflictResponse
La résolution des conflits s’applique à l’ensemble de la sauvegarde, et non à des fichiers ou dossiers individuels. Pour plus de détails sur la façon dont les conflits sont détectés au niveau de l’unité atomique et résolus globalement, consultez Conflits de Game Saves.
Stockage insuffisant
Se déclenche pendantPFGameSaveFilesAddUserWithUiAsync lorsque l’appareil local ne dispose pas de suffisamment d’espace disque pour télécharger les données de sauvegarde à partir du nuage. Le rappel reçoit requiredBytes, qui indique l’espace nécessaire.
Rappel : PFGameSaveFilesUiOutOfStorageCallback
API de réponse : PFGameSaveFilesSetUiOutOfStorageResponse
En processus ou hors processus (interface utilisateur système)
L’endroit où Game Saves s’exécute dépend de la plateforme, ce qui influe sur la gestion des événements d’interface utilisateur :- Hors processus (XBOX et Windows) : sur XBOX et Windows, Game Saves s’exécute toujours hors processus. La plateforme (Connected Storage / GRTS) effectue la synchronisation et fournit des boîtes de dialogue d’interface utilisateur système intégrées pour les échecs de synchronisation, les conflits, les conflits d’appareil actif et le stockage insuffisant. Le joueur interagit directement avec ces boîtes de dialogue, et la plateforme traduit le résultat en codes de fin d’opération asynchrone identiques à ceux que votre jeu reçoit en processus. Vous pouvez tout de même inscrire des rappels pour remplacer l’interface utilisateur intégrée.
- En processus (autres plateformes, comme Steam Deck) : lorsque le service de la plateforme n’est pas disponible, votre jeu héberge le moteur de synchronisation de Game Saves et gère les événements d’interface utilisateur au moyen des rappels décrits ci-dessus. Votre jeu pilote entièrement la machine à états à l’aide des API de réponse.
L’annulation est toujours un résultat possible
Quel que soit le chemin, chaque flux d’interface utilisateur peut se terminer par l’abandon de l’utilisateur sans synchronisation réussie; votre jeu doit donc toujours gérer une annulation finale :
La seule action d’« abandon » qui permet tout de même au joueur de continuer est Use Offline dans l’invite d’échec de synchronisation (un résultat réussi). Toute autre annulation est finale et ne laisse aucun dossier de sauvegarde. Traitez-la comme ne pas permettre de jouer. Consultez Mode hors connexion de Game Saves.
Dans l’interface utilisateur système intégrée (hors processus), ces choix s’affichent avec le libellé de la plateforme. Par exemple, la boîte de dialogue d’échec de synchronisation propose « Try again » / « Play offline », et la boîte de dialogue de conflit d’appareil actif propose « Stop sync & continue » / « Quit game ». « Play offline » correspond au mode hors connexion (
S_OK, non connecté); « Quit game » correspond à E_PF_GAMESAVE_USER_CANCELLED.
L’annulation d’une invite de conflit est finale sur les deux chemins. Elle se termine avec E_PF_GAMESAVE_USER_CANCELLED et ne mène pas à une invite d’échec de synchronisation.
Pour une interface utilisateur multiplateforme personnalisée (par exemple, pour correspondre à votre implémentation Steam Deck), inscrivez des rappels partout et validez les flux hors processus sur votre matériel cible. Quel que soit le chemin, conditionnez le jeu au résultat de fin d’opération : S_OK + connecté → jeu en ligne; S_OK + non connecté → jeu hors connexion (avertissez le joueur); annulation ou échec sans dossier → bloquez le jeu.
Exigences des plateformes
Pour les détails de l’implémentation sur Steam Deck, consultez le Guide d’implémentation pour Steam Deck.
