常见游戏存档错误场景
服务配置标识符配置错误
如果在调用 XGameSaveFilesGetFolderWithUiAsync 时出现错误 0x80830002 (E_GS_NO_ACCESS),则可能是源代码中的服务配置标识符 (SCID) 不正确。请确保 SCID 与 Microsoft 合作伙伴中心中显示的一致。可能会显示以下系统错误消息。游戏绑定的影响
如果你的标题使用游戏绑定,之后又添加了 PC 版 Microsoft Game Development Kit (GDK),则必须使用主产品的 Microsoft 帐户 (MSA) AppID (MSAppID)。使用次产品的 MSAAppID 会导致 0x80830002 错误。合作伙伴中心设置错误
合作伙伴中心设置错误可能是游戏存档错误的常见原因。要使用户游戏存档能够同步到云端和从云端同步,请在合作伙伴中心的游戏玩法设置 > 标题存储中选择 Connected Storage 选项。下图显示了确保游戏存档能够正确地同步到云端和从云端同步所需的合作伙伴中心 Connected Storage 配置设置。句柄清理
游戏存档同步到云端和从云端同步是通过多个句柄管理的。如果这些句柄的生命周期未得到正确管理,则可能在同步到云端和从云端同步时导致未定义行为。XGameSaveFiles:
- 当标题启动和恢复时调用 XGameSaveFilesGetFolderWithUiAsync。此调用会隐式创建一个游戏存档提供程序句柄。当标题挂起或终止时,操作系统会释放它。
XGameSave:
- 在 XGameSaveSubmitUpdate 调用之后删除
XGameSaveUpdateHandle,无论更新成功还是失败。 - 当标题挂起或终止时删除
XGameSaveContainerHandle。 - 当标题挂起或终止时删除
XGameSaveProviderHandle。
确认游戏存档
要确认你的游戏存档正在上传到云端,标题需要开始释放对标题的锁的过程,然后开始上传数据。你可以通过 Fiddler 检查游戏存档网络流量来查看此流量。 有关游戏存档同步流程的更多信息,请参阅理解游戏存档同步流程。常见错误
如果同步尝试被拒绝,请再次调用
XGameSaveFilesGetFolderWithUI,以便文件路径写入本地。此调用返回 S_OK。
在使用过期的提供程序调用 XGameSaveFilesGetFolderWithUIResult 时也会发生此错误。当游戏运行时服务 (GRTS) 在挂起标题或发生其他系统管理事件时取消初始化游戏存档提供程序时,也会发生此错误。当标题恢复时,调用 XGameSaveFilesGetFolderWithUiAsync 以重新初始化提供程序并确保保存的数据是最新的。如果标题在未进行此调用的情况下恢复,则提供程序仍处于未初始化状态。游戏存档操作会失败。| | 0x8007000E | E_OUTOFMEMORY | 剩余内存不足以处理你的请求。 | 此错误通常由多种原因引起。你可以使用 PIX 捕获内存分配并检查内存泄漏。请注意以下几点:
1. 句柄是引用计数的。检查句柄泄漏。在成功或失败的更新之后关闭已更新的句柄。避免有大量待处理的更新。
2. 使用
XMemTransferMemory 作为解决方法,将某些内存转移到系统分区。3. 严重的内存碎片。 | | 0x80070057 | E_INVALIDARG | 提供的参数无效。参数不正确。 | 如果在 PC 上
XGameSaveFilesGetFolderWithUI 中使用的 SCID 不是有效的 GUID,则可能会发生此错误。 | | --- | --- | XGameSaveFilesGetFolderWithUI 无限期挂起或偶发失败。 | 请确保你正在运行的机器上没有打开的 GameSave 系统对话框,或者其他控制台上没有针对该用户显示的对话框。忽略打开的登录或同步对话框会导致未定义行为。 | 0x80830006 | E_QUOTA_EXCEEDED | 游戏超出了游戏的每用户配额。默认情况下,此配额为 256 MB。 | 使用以下游戏存档数据管理最佳实践。1. 不要跨容器存储相关数据。
2. 减少容器中的 blob 数量以提高性能。
有关更多信息,请参阅存储系统限制和配额 | | 0x80830005 | E_GS_UPDATE_TOO_BIG | 保存更新的大小过大。 |
XGameSave 更新的总大小必须小于 GS_MAX_BLOB_SIZE (16 MB),无论更新上下文中的 blob 总数如何。 | | 0x8924010c | E_GAMERUNTIME_INVALID_HANDLE | 此句柄值不再有效。 | 当尝试重用来自先前用户的未关闭句柄时,会发生此错误。请关闭不再使用的句柄。 | | 0x80830001 | E_GS_INVALID_CONTAINER_NAME | 容器的名称无效。 | 路径部分(直至并包括最后一个斜杠)的有效字符包括大写字母 (A-Z)、小写字母 (a-z)、数字 (0-9)、下划线 (_) 和正斜杠 (/)。路径部分可以为空。文件名部分(最后一个斜杠之后的所有内容)的有效字符包括大写字母 (A-Z)、小写字母 (a-z)、数字 (0-9)、下划线 (_)、句点 (.) 和连字符 (-)。文件名不能为空、以句点结尾或包含两个连续的句点。 | | 0x80830003 | E_GS_OUT_OF_LOCAL_STORAGE | 设备没有足够的存储容量来保存游戏。 | 用户必须在设备上腾出可用的游戏存档存储空间。即使每用户配额未超出,也可能发生此错误。
有关更多信息,请参阅通过设备管理游戏存档。 | | 0x80830007 | E_GS_PROVIDED_BUFFER_TOO_SMALL | 提供给 API 的缓冲区太小。 | 如果调用方向游戏存档 API 传入的缓冲区小于读取的 blob 数据大小,则会发生此错误。如果使用
Async 调用,请调用 XAsyncGetResultSize 以确保使用正确的缓冲区大小。 | | 0x80830008 | E_GS_BLOB_NOT_FOUND | 找不到指定的 blob。 | 要确认某个 blob 是否存在,可以使用 xbstorage 或 gamesaveutil 工具下载该 blob。在标题释放锁后(挂起或终止时)执行此步骤以防止未定义行为。有关更多信息,请参阅游戏存档工具。 | | 0x80830009 | E_GS_NO_SERVICE_CONFIGURATION | 标题未正确配置以进行 Connected Storage。 | 当 SCID 不正确或者标题未在合作伙伴中心中正确配置时,会发生此错误。
有关更多信息,请参阅合作伙伴中心配置。 | | 0x8083000A | E_GS_CONTAINER_NOT_IN_SYNC | 容器尚未同步。 | 请确保在向 XGameSave 容器提交更新之前,该容器已同步。 | | 0x8083000B | E_GS_CONTAINER_SYNC_FAILED | 容器同步失败。 | 请确认从云端同步数据时互联网连接稳定。 | | 0x8083000C | E_GS_USER_NOT_REGISTERED_IN_SERVICE | 表示用户的 MSA 还不是 XBOX services 帐户。 | 请确认你正在使用的用户在合作伙伴中心中已正确注册。 | | 0x8083000D | E_GS_HANDLE_EXPIRED | 函数使用的句柄已过期,必须重新获取。 | 在提交之后或标题挂起时,
XGameSaveUpdateHandle 不能被重用 | | 0x8083000E | E_GS_ASYNC_FUNCTION_REQUIRED | 该函数正在时间敏感的线程上被调用,有死锁风险。 | 请改用异步实现。 | | 0x8083000F | E_GS_PROVIDER_MISMATCH | 游戏混用了 XGameSave 和 XGameSaveFiles 调用,这不受支持。 | 一次只能在一个标题中初始化一种类型的游戏存档 API。此外,一个标题应使用一种游戏存档 API。在你处理多个标题的情况下,有方法可以在不同 API 之间进行互操作。有关更多信息,请参阅 XGameSave 和 XGamesaveFiles 之间的互操作 | | 0x80831001 | E_GS_TERMINATEDTITLE_STALE_DATA
或
TerminateApplicationAfterSuspend| 此信息不通过面向用户的 API 公开。此行为是预期的。当进程生命周期管理 (PLM) 检测到过期数据并且设备重新连接到互联网时,它会停止标题。在挂起事件之后,应用程序会关闭。 | 此调试输出不是 bug。当游戏因在初始化时(例如离线播放或冲突对话框选择期间)缺少游戏存档锁而终止时,操作系统会在挂起时终止游戏以确保下次启动时状态干净。 |
Win32 NTSTATUS 代码
使用XGameSaveFiles 时,可能会出现以下状态代码。
