ISteamRemoteStorage, qui écrivent les fichiers dans le dossier de stockage du jeu sur le disque dur local et les synchronisent avec le nuage. Vous pouvez aussi effectuer toutes vos lectures et écritures directement dans le système de fichiers de l’ordinateur, puis utiliser Steam Auto-Cloud pour synchroniser avec le nuage le dossier local contenant les données du jeu.
Le Microsoft Game Development Kit (GDK) prend en charge les deux approches :
- Pour les sauvegardes infonuagiques basées sur le code, le GDK offre un wrapper simplifié de l’API
XGameSave, plus complexe, qui fournit des fonctionnalités similaires aux méthodes deISteamRemoteStorage. - Pour une approche semblable à Steam Auto-Cloud, le GDK prend en charge le portage de titres antérieurs vers PC Game Saves avec des sauvegardes infonuagiques sans code, qui synchronise un dossier local désigné avec le nuage sans nécessiter de modifications à votre code d’E/S de fichiers.
L’API
XGameSave complète, sans wrapper, offre plus de fonctionnalités et de souplesse que le wrapper simple. Si vous avez besoin de l’une de ces fonctionnalités, n’utilisez pas le wrapper. Les jeux ne doivent pas passer de l’un à l’autre ni combiner des appels d’API des deux. Pour plus d’informations sur l’API XGameSave, consultez Sauvegardes de jeu.Comparaisons des opérations sur les fichiers
Les exemples de code suivants montrent comment effectuer des opérations de base sur les fichiers avec l’API Steamworks Remote Storage et son équivalent dans le GDK. Ils supposent que la variableprovider contient un pointeur vers un objet Microsoft::Xbox::Wrappers::GameSave::Provider initialisé.
Si vous n’utilisez pas l’API Steam Remote Storage, mais avez plutôt choisi d’utiliser Steam Auto-Cloud, remplacez les appels à l’API Remote Storage par leurs équivalents de l’API du système de fichiers.
Lecture d’un fichier
Steamworks
GDK
Documentation de référence
Microsoft.Xbox.Wrappers.XGameSave.Provider.LoadÉcriture d’un fichier
Steamworks
GDK
Documentation de référence
Microsoft.Xbox.Wrappers.XGameSave.Provider.SaveSupprimer un fichier
Sur Steam, vous pouvez soit supprimer un fichier dans le nuage tout en conservant la copie locale (FileForget), soit supprimer un fichier des deux emplacements (FileDelete). L’API du wrapper XGameSave n’a pas d’équivalent à FileForget. Sa fonction Delete fonctionne comme FileDelete dans Steamworks.
Steamworks
GDK
Documentation de référence
- Microsoft.Xbox.Wrappers.XGameSave.Provider.Delete(std::string)
- Microsoft.Xbox.Wrappers.XGameSave.Provider.Delete(std::string, std::string)
- Microsoft.Xbox.Wrappers.XGameSave.Provider.Delete(std::string, BlobNames)
Obtenir tous les fichiers
Steamworks
GDK
Documentation de référence
- Microsoft.Xbox.Wrappers.XGameSave.Provider.QueryContainers
- Microsoft.Xbox.Wrappers.XGameSave.Provider.QueryContainerBlobs
Vérifier l’espace disponible
Dans les exemples suivants,totalBytes correspond à la quantité d’espace attribuée à votre jeu chez le fournisseur de stockage infonuagique. availableBytes correspond à la quantité d’espace libre restant (c’est-à-dire availableBytes = totalBytes – bytesUsed).
Steamworks
GDK
Documentation de référence
Microsoft.Xbox.Wrappers.XGameSave.Provider.GetQuotaDifférences de terminologie
Sur Steam, les données de stockage à distance sont gérées sous forme de fichiers, qui fonctionnent comme des fichiers sur un disque dur local. Pour lire ou écrire, vous spécifiez le fichier, puis vous obtenez ou définissez les octets qu’il contient. Dans le Microsoft Game Development Kit (GDK), l’équivalent des fichiers Steam est l’objet blob. Les blobs sont regroupés dans une structure appelée conteneur. Un conteneur est un groupe nommé de blobs. Par exemple, vous pouvez utiliser des conteneurs pour prendre en charge plusieurs emplacements de sauvegarde par utilisateur, avec les mêmes noms de fichiers dans chaque emplacement. Si vous n’avez pas besoin de la couche d’organisation supplémentaire qu’offrent les conteneurs, placez tous vos blobs (fichiers) dans le même conteneur.Les noms de conteneur ne peuvent pas contenir d’espaces. Toute tentative d’accéder à un conteneur ou d’en créer un dont le nom contient un espace amène la méthode du fournisseur à retourner un HRESULT
0x80830001 : le volume spécifié ne prend pas en charge les niveaux de stockage.Limites de stockage
Le Microsoft Game Development Kit (GDK) impose une taille maximale d’écriture de blob ou de fichier et une limite de stockage globale inférieures à celles de Steam. Sur Steam, chaque opération d’écriture de fichier est limitée à 100 mébioctets (Mio), et chaque fichier ne peut pas dépasser 200 Mio. En revanche, l’APIXGameSave et son wrapper limitent chaque blob à 16 Mo et autorisent un maximum de 256 Mo par utilisateur et par jeu.
Si vous devez stocker plus de 16 Mo de données dans un blob, divisez les données en plusieurs blobs. Implémentez ensuite une fonction de lecture et d’écriture séquentielle pour traiter les données un blob à la fois.
Les fonctions du wrapper sont bloquantes
L’interfaceISteamRemoteStorage offre deux versions des fonctions de lecture et d’écriture : FileRead et FileWrite, ainsi que FileReadAsync et FileWriteAsync. Les versions Async effectuent un rappel lorsque le fichier a été lu ou écrit. Les fonctions du wrapper XGameSave simplifié n’offrent pas de versions asynchrones de leurs équivalents à FileRead et FileWrite. Provider::Load et Provider::Save sont toutes deux bloquantes; tenez donc compte de ce comportement lorsque vous les utilisez dans votre jeu.
Pour cette raison, Provider::Initialize lève une exception si vous l’appelez à partir du thread d’interface utilisateur.
Initialisation
Incluez le fichier d’en-tête du wrapper dans la solution de votre jeu avant d’utiliser les méthodes du wrapper. Vous le trouverez à l’emplacement %GRDKLatest%\GameKit\Include\xgamesavewrappers.hpp. Avant d’utiliser les méthodes du wrapperXGameSave, créez une instance de la classe Provider et appelez la méthode Provider::Initialize. Conservez un pointeur vers l’instance Provider pendant toute la durée de vie de votre jeu. Appelez Provider::Initialize à partir d’un thread autre que le thread d’interface utilisateur. La méthode lève une exception si vous l’appelez à partir du thread d’interface utilisateur. Pour initialiser le fournisseur du wrapper, vous avez besoin d’un XUserHandle pour l’utilisateur actuel et de l’identificateur de configuration de service (SCID) de votre jeu.
