ISteamRemoteStorage API メソッドを使用してすべての読み取り/書き込みを行う方法です。これらのメソッドは、ローカルハードドライブ上のゲームのストレージフォルダーにファイルを書き込み、クラウドに同期します。もう 1 つは、コンピューターのファイルシステムに対して直接すべての読み取り/書き込みを行い、Steam Auto-Cloud を使用して、ゲームデータが含まれるローカルフォルダーをクラウドに自動同期する方法です。
XBOX Game Development Kit (GDK) は、両方のアプローチをサポートしています。
- コードベースのクラウドセーブでは、GDK はより複雑な
XGameSavesAPI のシンプル化されたラッパーを提供し、ISteamRemoteStorageのメソッドと類似した機能を提供します。 - Steam Auto-Cloud に類似したアプローチでは、GDK はノーコードクラウドセーブによる以前のタイトルの PC Game Saves への移植をサポートしています。これは、ファイル I/O コードを変更することなく、指定されたローカルフォルダーをクラウドに同期します。
ラップされていない完全な
XGameSaves API は、このシンプルなラッパーよりも多くの機能と柔軟性を提供します。ゲームは、決して一方から他方へ切り替えたり、API 呼び出しを混在させたりしてはいけないため、その API の機能を使用したい場合は、ラッパーを使用しないでください。XGameSaves API の詳細については、Game saves を参照してください。ファイル操作の比較
次のコード例は、Steamworks Remote Storage API と GDK 相当で、基本的なファイル操作を実行する方法を示しています。これらは、provider 変数が初期化された Microsoft::Xbox::Wrappers::GameSave::Provider オブジェクトへのポインターを保持していると想定しています。
Steam Remote Storage API を使用せず、代わりに Steam Auto-Cloud を選択している場合は、Remote Storage API 呼び出しをファイルシステム API 相当に置き換えてください。
ファイルを読み取る
Steamworks
GDK
リファレンスドキュメント
Microsoft.Xbox.Wrappers.XGameSave.Provider.Loadファイルを書き込む
Steamworks
XBOX Game Development Kit (GDK)
リファレンスドキュメント
Microsoft.Xbox.Wrappers.XGameSave.Provider.Saveファイルの削除
Steam では、クラウド内のファイルを削除してローカルコピーは保持する (FileForget)、あるいは両方の場所からファイルを削除する (FileDelete) のどちらかを行うことができます。XGameSave ラッパー API には FileForget に相当する機能はありません。その Delete 関数は、Steamworks の FileDelete と同様に動作します。
Steamworks
XBOX Game Development Kit (GDK)
リファレンスドキュメント
- 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)
すべてのファイルを取得する
Steamworks
XBOX Game Development Kit (GDK)
リファレンスドキュメント
- Microsoft.Xbox.Wrappers.XGameSave.Provider.QueryContainers
- Microsoft.Xbox.Wrappers.XGameSave.Provider.QueryContainerBlobs
利用可能な容量を確認する
次の例では、totalBytes はクラウドストレージプロバイダーがゲームに割り当てた容量、availableBytes は残りの空き容量です (つまり、availableBytes = totalBytes – bytesUsed)。
Steamworks
XBOX Game Development Kit (GDK)
リファレンスドキュメント
Microsoft.Xbox.Wrappers.XGameSave.Provider.GetQuota用語の違い
Steam では、リモートストレージのデータはファイルとして管理され、ローカルハードドライブ上のファイルと同じように動作します。読み取りと書き込みは、読み書きしたいファイルを指定し、そのファイルに含まれるバイトを取得/設定することによって行われます。 XBOX Game Development Kit (GDK) では、Steam のファイルに相当するものは ブロブ (blob) であり、ブロブは コンテナー (container) と呼ばれる構造にまとめられます。コンテナーは単に名前付きのブロブグループです。コンテナーは、たとえば、ユーザーごとに複数のセーブスロットを持ち、各スロットに同じファイル名を持たせるために使用できます。コンテナーが提供する追加の整理レイヤーが不要な場合は、すべてのブロブ (ファイル) を同じコンテナーに配置するだけです。コンテナー名にスペースを含めることはできません。スペースを含むコンテナー名にアクセスまたは作成しようとすると、
0x80830001 の HRESULT を返します: 指定されたボリュームはストレージ層をサポートしていません。
ストレージ制限
XBOX Game Development Kit (GDK) は、Steam よりも最大ブロブ/ファイル書き込みサイズと全体的なストレージ制限が低くなっています。Steam では、各ファイル書き込み操作は 100 メビバイト (MiB) に制限されています。各ファイルは 200 MiB を超えることはできませんが、XGameSave API とそのラッパーでは、各ブロブが 16 MB を超えることは許されず、ユーザーごとおよびゲームごとに最大 256 MB のストレージ許容量となっています。
ブロブに 16 MB を超えるデータを保存する必要がある場合は、データを複数のブロブに分割し、一度に 1 つのブロブずつデータを読み書きするシーケンシャル読み取り/書き込み関数を実装する必要があります。
ラッパー関数はブロッキング
ISteamRemoteStorage インターフェイスは、読み取り/書き込み関数の 2 つのバージョンを提供しています: FileRead/FileWrite と FileReadAsync/FileWriteAsync です。後者は、ファイルの読み取り/書き込みが完了した時点でコールバックする非同期関数です。シンプル化された XGameSave ラッパー関数は、FileRead/FileWrite に相当する非同期バージョンを提供していません。ただし、Provider::Load と Provider::Save はどちらもブロッキングであるため、ゲーム内で使用する際にはその点に注意してください。
このため、Provider::Initialize は UI スレッドから呼び出されると例外をスローします。
初期化
他の何かを行う前に、ゲームのソリューションにラッパーのヘッダーファイルを含める必要があります。これは %GRDKLatest%\GameKit\Include\xgamesavewrappers.hpp にあります。XGameSaves ラッパーのメソッドを使用する前に、Provider クラスのインスタンスを作成する (ゲームのライフタイムを通じてそのポインターを保持する必要があります) と、Provider::Initialize メソッドを呼び出す必要があります。繰り返しになりますが、このメソッドは UI とは別のスレッドで呼び出す必要があり、UI スレッドから呼び出された場合は例外がスローされる点に注意することが重要です。ラッパープロバイダーを初期化するには、現在のユーザーの XUserHandle とゲームのサービス構成識別子 (SCID) が必要であることに注意してください。
