狀態機的運作方式
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 回呼只會在兩個非同步作業期間觸發:註冊回呼
在呼叫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
處理程序內與處理程序外 (系統 UI)
Game Saves 的執行位置取決於平台,這會影響 UI 事件的處理方式:- 處理程序外 (XBOX 和 Windows):在 XBOX 和 Windows 上,Game Saves 一律以處理程序外方式執行。平台 (Connected Storage / GRTS) 會執行同步,並針對同步失敗、衝突、作用中裝置爭用和儲存空間不足提供內建的系統 UI 對話方塊。玩家直接與這些對話方塊互動,平台會將結果轉譯回您的遊戲在處理程序內收到的相同非同步完成碼。您仍可註冊回呼來取代內建 UI。
- 處理程序內 (其他平台,例如 Steam Deck):在無法使用平台服務的情況下,您的遊戲會裝載 Game Saves 同步引擎,並透過上述回呼處理 UI 事件。您的遊戲會使用回應 API 完全驅動狀態機。
取消一律是可能的結果
無論採用哪種路徑,每個 UI 流程都可能以使用者退出且未成功同步作為結束,因此您的遊戲必須一律處理最終的取消:
唯一仍允許玩家繼續的「退出」動作是同步失敗提示中的 Use Offline (成功的結果)。其他所有 Cancel 都是最終結果,且不會留下存檔資料夾。請將其視為不允許遊玩。請參閱 Game Saves 離線模式。
在內建 (處理程序外) 系統 UI 中,這些選項會以平台的用語顯示。例如,同步失敗對話方塊提供 “Try again” / “Play offline”,而爭用對話方塊提供 “Stop sync & continue” / “Quit game”。“Play offline” 對應至離線模式 (
S_OK,未連線);“Quit game” 對應至 E_PF_GAMESAVE_USER_CANCELLED。
在兩種路徑上,取消衝突提示都是最終結果。它會以 E_PF_GAMESAVE_USER_CANCELLED 完成,且不會連帶出現同步失敗提示。
若要使用自訂的跨平台 UI (例如,與您的 Steam Deck 實作一致),請在所有平台上註冊回呼,並在目標硬體上驗證處理程序外流程。無論採用哪種路徑,都請依完成結果決定是否允許遊玩:S_OK + 已連線 → 線上遊玩;S_OK + 未連線 → 離線遊玩 (警告玩家);取消/失敗且沒有資料夾 → 封鎖遊玩。
平台需求
如需 Steam Deck 實作的詳細資訊,請參閱 Steam Deck 實作指南。
