- 修订摘要
- 简介
- 本文档中使用的术语
- 多人游戏会话目录
- MPSD 会话
- 会话模板属性
- 协定架构更新
- 会话文档中的成员初始化
- 匹配票证会话
- 服务质量 (QoS) 模板
- QoS 阶段和会话初始化详细信息
- XBOX 云计算会话
- 原始会话和自定义游戏属性
- 活动成员衰减
- 常见问题和故障排除
修订摘要
客户端 XBOX Services API (XSAPI) 库当前在与 MPSD 服务通信时使用协定版本 104。 本文档的这个版本将会话模板架构更新至协定版本 107,这是 MPSD 服务支持的最新协定版本。 版本 104 和 107 之间的更改在下面的协定架构更新一节中进行了总结。 请注意,为协定版本 104 编写的模板如果作为 107 重新发布,则需要更新。 但是,这些服务是向后兼容的,因此你可以继续使用当前的库,这些库将在未来的版本中更新。 本文档的上一个修订版更新了有关服务器会话的信息,并增加了关于 XSAPI 和 RESTful 服务调用的新章节。 此外,“查询会话状态信息”一节中的表已更新,并且”服务质量 (QoS) 模板”一节也已修订。简介
多人游戏会话是位于多人游戏会话目录 (MPSD) 上的云中的安全文档,此文档表示一组玩游戏的人。 具体而言,多人游戏会话具有以下特性:- 每个会话都有一个唯一的 URI。
- 会话文档包含当前成员、游戏设置、引导数据和游戏服务器信息。
- 游戏创建并管理自己的会话。
- 会话支持其成员之间的连接。
本文档中使用的术语
多人游戏会话目录
MPSD 有助于在在线玩家之间协调会话信息。 可以创建不同类型的会话来完成多人游戏的不同任务。 下表列出了在 XBOX 360 上完成此类任务与在 XBOX One 或更高版本(包括 PC)上完成的方式之间的差异。会话模式
-
游戏会话
- 包含玩家的 XUID、安全设备地址数据和属性状态的会话。这被视为实际的游戏玩法会话。
- 可以是对等、点对主机、点对服务器或混合。
-
匹配票证会话
- 提交给对战匹配以找到其他玩家共同游戏的会话。请注意,如果游戏在寻找更多玩家,游戏会话也可以是票证会话。
-
服务器会话
- 通过 XBOX Compute 处理创建和使用的游戏会话。
MPSD 会话
会话维护两个相关实体列表:- 已加入或被邀请加入会话的成员(用户)。
- 已加入会话的服务器(云服务器或专用服务器)。
- 创建时设置的常量值。
- 可变属性。
- 只读元数据。
XSAPI 和 RESTful 服务调用
有两种方式与 XBOX services Sessions 和 Matchmaking 服务连接。- 标准 HTTPS 调用
- XSAPI 包装器
使用对 RESTful 服务的标准 HTTPS 调用
对于 XBOX One 及更高版本,与 XBOX services Sessions 和 Matchmaking 服务连接的第一种方式是对 RESTful XBOX services URI 使用标准 HTTPS 调用。 这为游戏调用和连接这些服务提供了灵活性,具体取决于其服务器和游戏配置。 有关这些 URI 的列表,请参阅 XBOX services RESTful 参考。使用 RESTful 服务的 XSAPI 包装器
与 Sessions 和 Matchmaking 服务连接的第二种方式是使用充当 RESTful 服务 URI 包装器的 XSAPI。 这些允许在代码中使用 API 的更传统方法,而无需为每次调用处理 HTTPS 流量。 有关 XSAPI 的更多信息,请参阅 xbox-live-api GitHub 页面。 该参考文档包括:- JSON 分析 API 参考 - JSON 分析 API 的参考资料。
- Windows.Web 命名空间 - Windows.Web 命名空间成员。
- XBOX Compute SDK 参考 - 用于为 XBOX Compute 创建游戏服务器实例的 API。
MPSD 会话和模板
MPSD 会话是使用通过 Partner Center 引入的模板创建的。 模板是定义所创建会话框架的 JSON 文档。 模板为新会话提供常量。 以下摘录是模板配置示例。
检查为 SCID 配置的模板
会话模板
可以从 MPSD 检索 SCID 中存在的会话模板列表,以及特定会话模板的详细信息:查询会话状态信息
可以在服务配置和会话模板级别查询会话:
结果是会话引用的 JSON 数组。
一些会话数据以内联方式包含在内。
注意 每个查询必须包含关键字筛选器、XUID 筛选器或两者。
将 private(返回私有会话)或 reservations(返回用户尚未加入的会话)设置为 true 需要调用方具有对会话的服务器级访问权限,或者调用方的 XUID 声明与 URI 中的 XUID 筛选器匹配。
否则,将返回 403 Forbidden(无论此类会话是否实际存在)。
以下代码摘录显示了查询响应的示例。
会话模板属性
协定架构更新
如本文档开头所述,最新的会话模板协定版本为 107,它对之前版本 104 的架构进行了一些更改。 为协定版本 104 编写的模板如果作为 107 重新发布,则需要更新。 以下是这些更改的摘要。-
/constants/system/managedInitialization 已重命名为 /constants/system/memberInitialization。
- autoEvaluate 字段已重命名为 externalEvaluation,其极性发生变化,但 false 仍为默认值。
- membersNeededToStart 的默认值从 2 变为 1。
- joinTimeout 的默认值从 5 秒变为 10 秒。
- measurementTimeout 的默认值从 5 秒变为 30 秒。
-
/constants/system/timeouts 已删除,超时被重命名并重新定位到 /constants/system 下。
- reserved 超时变为 reservedRemovalTimeout。
- inactive 超时变为 inactiveRemovalTimeout,其新默认值为 0 而非 2 小时。
- ready 超时变为 readyRemovalTimeout。
- sessionEmpty 超时变为 sessionEmptyTimeout。
- /constants/system/capabilities/gameplay 必须在表示实际游戏玩法的会话(而不是辅助会话,如匹配和大厅会话)上指定为 true,以启用最近玩家和信誉报告。
系统对象
会话文档中的每个系统对象都有一个由 MPSD 强制执行和解释的固定架构。 在 PUT 请求的正文中,系统对象像自定义对象一样进行验证和合并。 但与自定义对象不同,合并后系统对象会根据这些架构进一步验证并执行操作。 /constants/system超时
会话可以由计时器和其他外部事件更改。 MPSD 中的 Timeouts 对象提供了一种管理会话生命周期和成员的基本机制。 会话的 nextTimer 字段给出下一个计时器的时间。 客户端可以使用此信息为下一次轮询选择良好的间隔。 此值也会在 Expires HTTP 标头中返回。 超时以毫秒为单位指定。 允许零,表示应立即超时。 如果未指定给定的超时,则将其视为无限。 因为超时具有默认值,所以会话模板应显式指定”null”表示无限超时。SessionEmptyTimeout
/constants/system/sessionEmptyTimeout 值配置会话变为空后被删除之前的毫秒数。 默认值为零,表示将立即删除会话。 如果未指定该值,则空会话将无限期存在。成员超时
/constants/system 中的另外三个超时控制成员在特定状态下可以保持的时间量:-
reservedRemovalTimeout
- 超时到期时删除保留。默认值为 30 秒。
-
inactiveRemovalTimeout
- 非活动成员在默认情况下 2 小时后从会话中删除。
-
readyRemovalTimeout
- 处于”就绪”状态的成员默认在 3 分钟后恢复为非活动状态。
会话文档中的成员初始化
成员初始化
memberInitialization 对象控制会话创建后和/或新成员加入会话时的初始化阶段。 会话会自动跟踪超时和初始化阶段,如果设置了任何指标,还包括 QoS 测量。 对于设置了 initializationEpisode 属性的成员,这些超时会覆盖会话的保留和就绪超时。 示例:
-
joiningTimeout
- 用户加入会话所需的时间(以毫秒为单位)。未能加入的成员的保留将被删除。
-
measuringTimeout
- 成员必须上传其测量结果的时间量。未能上传测量结果的成员将标记为 failureReason 为 “timeout”。
-
evaluationTimeout
- 成员做出并上传评估决定的时间量。如果没有收到决定,则被视为失败。
- MPSD 可以基于会话模板中提供的要求进行自动 QoS 评估。当 externalEvaluation 设置为 false 时执行评估。当设置 evaluationTimeout 时,externalEvaluation 需要为 true。如果有两个对等或点对主机要求,你仍然应将 externalEvaluation 设置为 false,以便让会话自动完成初始化。
- 这是需要存在并通过 QoS 才能使自动评估成功的成员保留的最小数量,这些保留具有 “initialize”:“true”。
初始化情节
设置 memberInitialization 对象时,MPSD 将按情节推进初始化阶段。 第一个情节在创建会话时启动,将包括模板中定义的所有阶段。 在情节已在运行时被邀请或加入的任何新成员将被标记用于下一个情节。 一般而言,情节或 memberInitialization 的状态可以从会话的 initializing 对象中检索。 注意 请注意,此对象在初始化完成后会被删除。 示例:匹配票证会话
当 MPSD 会话用作匹配票证会话时,将使用一些特殊的会话属性和常量。 /members//constants/system服务质量 (QoS) 模板
对于游戏会话模板,可以添加告知 MPSD 与网络层和主机社交功能协调的值。 这种协调的目的是在创建会话之前以及在告知用户游戏已准备好加入之前验证连接状态的质量。 以下代码摘录是带有 QoS 的点对主机游戏会话模板的示例:QoS 会话模板属性
如果设置了 memberInitialization 对象,则会话期望客户端系统或游戏在会话创建后和/或新成员加入会话时执行初始化。 会话会自动跟踪超时和初始化阶段,如果设置了任何指标,还包括 QoS 测量。 对于设置了 initializationEpisode 属性的成员,这些超时会覆盖会话的保留和就绪超时。QoS 阶段和会话初始化详细信息
模板完成成员初始化后,MPSD 将跟踪并报告游戏创建的 QoS 结果。 此操作的进度将由会话文档中的 initializing 对象表示,如上文成员初始化一节所述。 initializing 对象具有 stage 属性,表示初始化的当前阶段。 阶段从 joining 进展到 measuring 再到 evaluating。- 如果初始化情节 #1 失败,则将阶段设置为 failed,无法初始化会话。否则,当初始化情节完成时,将删除 “initializing” 对象。如果 externalEvaluation 设置为 false,则跳过评估阶段。如果既未设置 metrics 也未设置 measurementServerAddresses,则跳过测量阶段。
- 主机候选者是按优先级顺序列出的设备令牌。如果设置了 peerToHostRequirements 且未设置 /properties/system/host,则在初始化情节 #1 的 measuring 阶段之后设置它们。它们在设置 /properties/system/host 对象后被清除。
- gamertag 属性仅在成员已接受且找到该成员的玩家代号声明时才会设置。
- deviceToken 属性在成员上传安全设备地址时设置。它是一个不区分大小写的字符串,可用于相等性比较。
- reserved 值在用户对会话文档执行第一个 PUT 请求后被删除。当玩家被保留时,这意味着他们已被邀请加入游戏会话,但既未接受,其连接也未被评估。
- 如果成员处于活动状态,activeTitleId 是成员活跃的游戏,以十进制表示。
- 此属性指的是用户加入会话的时间。如果 reserved 为 true,则 joinTime 将是保留的时间。
- 如果此成员在 properties/system/turn 数组中则存在,否则不存在。
- 如果成员未成功通过阶段,则在退出加入或测量阶段时,在成员对象上设置 initializationFailure 属性。按优先级顺序,可以将其设置为 timeout、latency、bandwidthdown、bandwidthup、network、group 或 episode。 network 值表示网络配置和/或条件(如冲突的网络地址转换 [NAT])阻止了 QoS 指标的测量。在加入结束时唯一可能的值是 group。(在加入超时时,保留将被删除。)episode 值在评估阶段失败后,在初始化情节中没有在加入或测量期间失败的所有成员上设置。
- 如果设置了 memberInitialization 并且成员是使用 “initialize”: true 添加的,则将其设置为成员将参与的初始化情节。对于创建时添加到新会话的成员,使用值 1。初始化情节结束时删除。
- next 属性表示会话中下一个成员的索引值。如果没有更多成员要添加,它将与下面 membersInfo 对象中的 next 属性具有相同的值。
XBOX 云计算会话(已弃用)
XBOX 云计算会话包含会话可用于连接到游戏服务器的不区分大小写连接字符串的有序列表。 通常,游戏应使用列表中的第一个字符串,但复杂的游戏可能使用自定义机制来选择其他字符串之一(例如,基于负载)。原始会话和自定义游戏属性
会话可用于存储多人游戏的自定义管理信息(元数据)。 游戏数据或保存的信息应存储在 TMS++ 中。属性包
上述每个标记为属性包的对象由两个可选的内部对象组成:system 和 custom。 自定义对象可以包含任何 JSON。活动成员衰减
当 MPSD 检测到用户不再参与游戏时,活动成员会自动标记为非活动。 例如,如果 Presence 使用户记录超时,则可能会发生这种情况。 此机制只是后备;也就是说,游戏仍然需要在成员离开或切换离开游戏、注销或以其他方式变得不参与时,主动将成员标记为非活动(或将其从会话中删除)。常见问题和故障排除
如何调用 MPSD?
使用证书身份验证:client-sessiondirectory.xboxlive.com 示例:如何找出要使用的 SCID、会话模板和沙盒?
此信息可以在 Partner Center 上你的游戏页面找到。 如果你尚未获得 Partner Center 的访问权限,请联系你的开发人员帐户经理,他可以协助你获取信息。是否有可以与我自己的请求正文进行比较的示例?
调用 MPSD 时收到 404 错误。
收集 Fiddler 跟踪以获取更多信息,然后执行以下操作:-
检查作为 HttpResponse 正文一部分返回的消息,查找常见的 404 消息:
- The requested service config is either invalid or not configured for sessions。验证正在使用的 SCID 是否正确。
- The requested session wasn’t found。在检索之前,验证会话已创建且会话模板正确。你可以使用 PUT 调用创建会话。
- 检查你正在使用的 URI。
- 重新启动主机和/或尝试使用新用户。
调用 MPSD 时收到 403 错误。
这通常是权限或范围问题。 收集 Fiddler 跟踪以获取更多信息,然后执行以下操作:- 检查作为 HttpResponse 正文一部分返回的消息,查找常见的 403 消息:
-
The requested service config cannot be accessed.
- 验证你使用的是有权访问该沙盒的帐户。
- 验证你处于正确的沙盒中。
- 如果你正在使用证书身份验证并收到此错误,请联系你的 DAM。
-
The requested session cannot be accessed. Private Sessions can only be read by members of the session.
- 你正在尝试访问可见性为 “private” 的会话。只有会话中的成员才能读取会话文档。
-
The request body can’t contain existing member references unless the authentication principal includes a server.
- 你不能代表用户将另一个用户加入会话。你只能邀请。将索引设置为 “reserve_<number>” 以邀请玩家。
