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’a pas appelé l’API de réponse correspondante ou que l’opération asynchrone n’a pas été 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 la suite à donner.
- 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 repli 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.
Quand les rappels se déclenchent
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 chargement ou du téléchargement. UtilisezPFGameSaveFilesUiProgressGetProgress dans le rappel pour récupérer 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 ne nécessite pas 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 d’informations 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 incluent les noms des appareils, les horodatages et la taille des sauvegardes, que vous pouvez afficher pour aider l’utilisateur à décider.
Rappel : PFGameSaveFilesUiActiveDeviceContentionCallback
API de réponse : PFGameSaveFilesSetUiActiveDeviceContentionResponse
Pour plus d’informations sur le comportement de l’appareil actif, consultez Changements d’appareil actif dans Game Saves.
Conflit
Se déclenche pendantPFGameSaveFilesAddUserWithUiAsync lorsque les données de sauvegarde locales et cloud 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’intégralité de la sauvegarde, et non à des fichiers ou dossiers individuels. Pour savoir comment 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 depuis le cloud. Le rappel reçoit requiredBytes, qui indique la quantité d’espace nécessaire.
Rappel : PFGameSaveFilesUiOutOfStorageCallback
API de réponse : PFGameSaveFilesSetUiOutOfStorageResponse
In-process ou hors processus (interface utilisateur système)
L’endroit où s’exécute Game Saves 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 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 d’achèvement asynchrone identiques à ceux que votre jeu reçoit en mode in-process. Vous pouvez tout de même inscrire des rappels pour remplacer l’interface utilisateur intégrée.
- In-process (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 mode, 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 encore au joueur de continuer est Use Offline dans l’invite d’échec de synchronisation (un résultat de réussite). Toute autre annulation est finale et ne laisse aucun dossier de sauvegarde : traitez-la comme ne pas autoriser le jeu. Consultez Mode hors connexion de Game Saves.
Dans l’interface utilisateur système intégrée (hors processus), ces choix apparaissent avec la formulation 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 dans les deux modes : 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, identique à votre implémentation Steam Deck), inscrivez des rappels partout et validez les flux hors processus sur votre matériel cible. Quel que soit le mode, conditionnez l’accès au jeu au résultat d’achèvement : S_OK + connecté → jeu en ligne ; S_OK + non connecté → jeu hors connexion (avertissez le joueur) ; annulation/échec sans dossier → bloquez l’accès au jeu.
Configuration requise des plateformes
Pour plus d’informations sur l’implémentation sur Steam Deck, consultez le Guide d’implémentation pour Steam Deck.
