状态机的工作原理
游戏存档使用内部状态机来协调 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
有关离线模式行为的更多详细信息,请参阅游戏存档离线模式。
活动设备争用
在PFGameSaveFilesAddUserWithUiAsync 期间,当另一台设备已经是该用户的活动设备时触发。回调接收本地和远程存档数据的 PFGameSaveDescriptor 结构,其中包括可以显示以帮助用户做出决定的设备名称、时间戳和存档大小。
回调:PFGameSaveFilesUiActiveDeviceContentionCallback
响应 API:PFGameSaveFilesSetUiActiveDeviceContentionResponse
有关活动设备行为的更多详细信息,请参阅游戏存档活动设备变更。
冲突
在PFGameSaveFilesAddUserWithUiAsync 期间,当本地和云端存档数据发生分歧时触发。回调接收本地和远程存档数据的 PFGameSaveDescriptor 结构。
回调:PFGameSaveFilesUiConflictCallback
响应 API:PFGameSaveFilesSetUiConflictResponse
冲突解决适用于整个存档,而非单个文件或文件夹。有关如何在原子单元级别检测冲突并在全局范围内解决的详细信息,请参阅游戏存档冲突。
存储空间不足
在PFGameSaveFilesAddUserWithUiAsync 期间,当本地设备没有足够的磁盘空间从云端下载存档数据时触发。回调接收 requiredBytes,指示所需的空间量。
回调:PFGameSaveFilesUiOutOfStorageCallback
响应 API:PFGameSaveFilesSetUiOutOfStorageResponse
平台要求
有关 Steam Deck 实现的详细信息,请参阅 Steam Deck 实现指南。
