使用 SmartMatch 匹配

本主题介绍如何在多人游戏中使用 SmartMatch 匹配玩家。

流程图: SmartMatch 匹配过程
创建匹配票证会话和匹配票证
设置会话和玩家的匹配属性
进行匹配
保留匹配票证
将游戏会话重新用作匹配票证会话
删除匹配票证
通过使用 Xbox 计算为游戏执行匹配
另请参阅

流程图: SmartMatch 匹配过程

以下流程图展示了 SmartMatch 匹配过程。

显示 SmartMatch 匹配过程的匹配流程图的图像。

返回到本主题顶部。

创建匹配票证会话和匹配票证

在开始匹配之前,匹配的“侦察兵”会设置一个匹配票证会话,以代表想要一起进入匹配的一组玩家。 此组中的所有用户均使用 XblMultiplayerSessionJoin 加入会话。

创建票证会话且加入玩家后,游戏会使用 XblMatchmakingCreateMatchTicketAsync 将会话提交到匹配服务。 此方法会创建一张表示该票证会话的匹配票证,并将票证会话中的 /servers/matchmaking/properties/system/status 字段更新为 searching。 有关详细信息,请参阅多人游戏任务主题中 "创建匹配票证" 部分。

来自匹配票证创建方法的响应是一个 XblCreateMatchTicketResponse 对象。 该响应包含匹配票证 ID。 这是一个 GUID,使用它可通过删除票证来取消匹配。 响应还包含漏斗的平均等待时间,这可以用来设定玩家期待值。

返回到本主题顶部。

设置会话和玩家的匹配属性

将会话提交到匹配时,游戏可以设置匹配服务用于将此会话与其他会话归为一组的属性。 游戏可在票证级别或每个成员级别指定属性。

在匹配票证级别设置匹配属性

在票证级别下,游戏会在 XblMatchmakingCreateMatchTicketAsync 方法的 ticketAttributesJson 参数中提交属性。 在票证级别下指定的属性会替代在每个成员级别下指定的相同属性。

在每个成员级别设置匹配属性

游戏为匹配票证会话中的每个成员指定每个成员的属性。 可通过调用 XblMultiplayerSessionCurrentUserSetCustomPropertyJson 和使用属性名称 matchAttrs 来设置这些属性。 此调用会将属性置于票证会话中每个玩家的 /members/{index}/properties/custom/matchAttrs 字段中。

基于为 Xbox 服务漏斗配置中的属性指定的 flatten 方法,匹配过程将每个成员“平展”为单个票证级别属性。 这是在 合作伙伴中心 配置的。

返回到本主题顶部。

进行匹配

设置好票证会话和匹配票证后,匹配服务会将表示的票证会话与表示其他组的其他票证会话匹配,并创建或标识匹配目标会话。 此服务也会为目标会话中的匹配玩家创建预留,然后将票证会话标记为已匹配。 多人游戏会话目录 (MPSD) 将通知游戏此次对票证会话的更改。

然后,游戏必须逐步初始化目标会话以确认存在足够多的玩家。 游戏会执行服务质量 (QoS) 检查,以确保玩家之间可以成功连接。 如果初始化或 QoS 失败,游戏会标记票证会话用来重新提交到匹配,以便可以找到其他组。 有关详细信息,请参阅目标会话初始化和 QoS

在匹配活动期间,会话中的 JSON 对象进行了如下更改。

  • /servers/matchmaking/properties/system/status 字段已设置为 found

  • /servers/matchmaking/properties/system/targetSessionRef 字段已设置为目标会话

  • 复制到 /members/{index}/constants/custom/matchmakingResult/playerAttrs 字段的每个票证会话的 /members/{index}/properties/custom/matchAttrs 字段

  • 对于每个玩家,票证属性已从匹配票证中的 ticketAttributes 字段复制到 /members/{index}/constants/custom/matchmakingResult/ticketAttrs 字段

返回到本主题顶部。

保留匹配票证

创建会话的匹配票证时,匹配服务会使用票证会话快照。 因此,如果任何玩家加入或离开票证会话,则游戏必须使用匹配服务来删除并重新创建匹配票证。

返回到本主题顶部。

将游戏会话重新用作匹配票证会话

重要

preserveSession设置为Always的两个会话不能相互匹配,因为它们不能组合。 游戏使用的匹配流程应该考虑到这种情况。

游戏可以将现有游戏会话重新用作匹配票证会话以查找更多玩家来加入已在进行中的游戏。 若要实现此操作,游戏需要通过调用 XblMatchmakingCreateMatchTicketAsync 并将 preserveSession 参数设置为 XblPreserveSessionMode::Always 来创建匹配票证。 然后,匹配服务可确保用于票证的现有会话在整个匹配过程中都会得到保留并成为最终的目标会话。

返回到本主题顶部。

删除匹配票证

如果要删除匹配票证,游戏会调用 XblMatchmakingDeleteMatchTicketAsync。 删除票证:

  1. 停止匹配票证会话中的玩家。

  2. 将票证会话中的 /servers/matchmaking/properties/system/status 字段更新为 canceled

返回到本主题顶部。

通过使用 Xbox 计算为游戏执行匹配

以下是将玩家匹配到基于 Xbox 计算的游戏中需要执行的高级步骤。 类似的流程应适用于第三方托管的游戏。

  1. 侦察兵创建票证会话以表示组。 此会话包含潜在的数据中心列表(位于 /constants/system/measurementServerAddresses 中的会话配置)。 如果数据中心列表为静态,则此会话配置来自会话模板,或者来自首先从 Xbox 计算获取会话配置后,在创建会话时编写会话配置的客户端。 此会话还包含对象 targetSessionConstants/custom/gameServerPlatform 中的 gsiSetIdgameVariantId、和 maxAllowedPlayers 的值。

  2. 组中的所有其他玩家加入票证会话。

  3. 所有小组成员从票证会话的 /constants/system 对象下载 measurementServerAddresses 值,使用平台 API 对这些值执行 ping 操作,并按 /members/{index}/properties/system/serverMeasurements 中所定义的将首选数据中心的已排序列表上传到会话。

    注意

    游戏可以使用 XblMultiplayerSessionConstantsSetMeasurementServerAddressesJson 方法和 XblMultiplayerSessionConstants::MeasurementServerAddressesJson从会话中设置和检索measurementServerAddresses值。

  4. 该侦查进程会调用 XblMatchmakingCreateMatchTicketAsync,并传入对票证会话的引用。

    注意

    如果票证会话对象具有不匹配的常量,则创建票证方法可能不会成功。 可通过向漏斗添加 MUST 规则来避免此情况,防止与常量不一致的玩家进行匹配。

    如果 XblMatchTictailsResponse::PreserveSession 设置为 Never,则匹配服务会将每个成员的服务器度量值复制到票证的内部表示形式中。 它将票证的成员的服务器度量值平展为票证的单个服务器度量值集合,此集合将作为 special 票证属性存储在票证的内部表示中。

    如果 XblMatchTicketDetailsResponse::PreserveSession 设置为 Always,则不会使用服务器度量值。 相反,匹配服务会将会话的 /properties/system/matchmaking/serverConnectionString 值复制到票证的内部表示 (作为大小为 1 且零延迟的 serverMeasurements 集合)。

  5. 匹配服务将票证会话与代表其他组的票证会话进行匹配,并将服务器度量值集合考虑在内。 服务会尝试将该组与其他具有相同的高度首选数据中心的组进行匹配。

  6. 一旦发现匹配的组,匹配服务将创建或标识目标会话,并添加匹配在一起的票证会话中的所有玩家。 该服务会将匹配的组的最终平展服务器度量值写入到 /properties/system/serverConnectionStringCandidates。 它会为目标会话中新添加的各成员将最初提交的服务器度量值写入到 /members/{index}/constants/system/matchmakingResult/serverMeasurements

  7. 如上所述,所有玩家会对目标会话执行初始化。 但是,由于玩家将连接到 Xbox 计算,它们不会彼此相互执行 QoS 来确认连接性。

  8. 所有玩家都玩。

返回到本主题顶部。

另请参阅

匹配概述