状態マシンの動作
Game Saves は、UI コールバックを非同期操作のライフサイクルと調整するために内部の状態マシンを使用します。UI コールバックが発生すると、非同期操作は一時停止します。コールバックが解決されるまでXAsyncBlock コールバックは発生しません。ゲームが対応する応答 API を呼び出すか、非同期操作がキャンセルされるまで、状態マシンは進行しません。
つまり:
- 各コールバックタイプには対応する応答 API があります。応答 API を呼び出して、システムに次に何をすべきかを伝えます。
- 応答 API は、コールバック関数の内側または外側から呼び出すことができます。
- 応答アクションが
Retryの場合、操作は再試行され、同じコールバックが再度発生する可能性があります。 XAsyncBlockコールバックは、操作が終端状態 (成功、キャンセル、またはオフラインフォールバック) に達したときにのみ発生します。
- エラーとともに
PFGameSaveFilesUiSyncFailedCallbackが発生します。 XAsyncBlockコールバックはまだ発生しません。状態マシンは応答を待機します。- ユーザーが
Retryを選択して再試行も失敗した場合、同期失敗コールバックが再度発生します。 - ユーザーが
Cancelを選択すると、XAsyncBlockコールバックがE_PF_GAMESAVE_USER_CANCELLEDで発生します。 - 再試行が成功すると、
XAsyncBlockコールバックがS_OKで発生します。
コールバックがトリガーされるタイミング
UI コールバックは、次の 2 つの非同期操作中にのみ発生します:コールバックの登録
PFGameSaveFilesAddUserWithUiAsync または PFGameSaveFilesUploadWithUiAsync を呼び出す前に、すべてのコールバックを登録します:
コールバックリファレンス
進行状況
アップロードまたはダウンロードの進行状況を報告します。コールバック内でPFGameSaveFilesUiProgressGetProgress を使用して、現在の PFGameSaveFilesSyncState、完了したバイト数、および合計バイト数を取得します。
コールバック: PFGameSaveFilesUiProgressCallback
応答 API: PFGameSaveFilesSetUiProgressResponse
進行状況コールバックは、続行するために応答を必要としません。操作は独自に進行し続けます。ユーザーがキャンセルしたい場合にのみ応答 API を呼び出してください。
同期状態
PFGameSaveFilesSyncState 列挙型は、操作がどのフェーズにあるかを示します:
同期失敗
たとえばネットワークの問題やレート制限などが原因で同期操作が失敗したときに発生します。 コールバック:PFGameSaveFilesUiSyncFailedCallback
パラメーター: PFGameSaveFilesSyncState (失敗したフェーズ) と HRESULT (エラーコード) を受け取ります。
応答 API: PFGameSaveFilesSetUiSyncFailedResponse
オフラインモード動作の詳細については、Game Saves オフラインモード を参照してください。
アクティブデバイスの競合
別のデバイスがこのユーザーの既にアクティブデバイスになっている場合、PFGameSaveFilesAddUserWithUiAsync 中に発生します。コールバックは、ローカルとリモート両方の保存データの PFGameSaveDescriptor 構造体を受け取ります。これには、ユーザーが決定するのに役立つように表示できるデバイス名、タイムスタンプ、保存サイズが含まれます。
コールバック: PFGameSaveFilesUiActiveDeviceContentionCallback
応答 API: PFGameSaveFilesSetUiActiveDeviceContentionResponse
アクティブデバイスの動作の詳細については、Game Saves のアクティブデバイスの変更 を参照してください。
競合
ローカルとクラウドの保存データが分岐したときに、PFGameSaveFilesAddUserWithUiAsync 中に発生します。コールバックは、ローカルとリモート両方の保存データの PFGameSaveDescriptor 構造体を受け取ります。
コールバック: PFGameSaveFilesUiConflictCallback
応答 API: PFGameSaveFilesSetUiConflictResponse
競合の解決は、個々のファイルやフォルダーではなく、保存全体に適用されます。競合がアトミック単位レベルでどのように検出され、グローバルに解決されるかの詳細については、Game Saves の競合 を参照してください。
ストレージ不足
ローカルデバイスにクラウドから保存データをダウンロードするための十分なディスク容量がない場合、PFGameSaveFilesAddUserWithUiAsync 中に発生します。コールバックは、必要な容量を示す requiredBytes を受け取ります。
コールバック: PFGameSaveFilesUiOutOfStorageCallback
応答 API: PFGameSaveFilesSetUiOutOfStorageResponse
プラットフォーム要件
Steam Deck 実装の詳細については、Steam Deck 実装ガイド を参照してください。
