流程图:SmartMatch 匹配流程
下面的流程图展示了 SmartMatch 匹配流程。 返回本主题顶部。创建匹配票据会话和匹配票据
在匹配流程开始之前,匹配”侦察员”会设置一个匹配票据会话,代表希望一起进入匹配的玩家群组。 该群组中的所有玩家都使用 XblMultiplayerSessionJoin 加入会话。 在票据会话创建并填充玩家后,游戏使用 XblMatchmakingCreateMatchTicketAsync 将会话提交到匹配服务。 此方法创建代表票据会话的匹配票据,然后将票据会话中的/servers/matchmaking/properties/system/status 字段更新为 searching。
有关详细信息,请参见 Multiplayer 任务主题中的创建匹配票据章节。
匹配票据创建方法返回的响应是一个 XblCreateMatchTicketResponse 对象。
该响应包含匹配票据 ID。它是一个可用于通过删除票据来取消匹配的 GUID。
响应还包含 hopper 的平均等待时间,可用于设置玩家的期望。
返回本主题顶部。
在会话和玩家上设置匹配属性
在将会话提交到匹配时,游戏可以设置匹配服务用于将该会话与其他会话分组的属性。 游戏可以在票据级别或每个成员级别指定属性。在匹配票据级别设置匹配属性
游戏在 XblMatchmakingCreateMatchTicketAsync 方法的ticketAttributesJson 参数中提交票据级别的属性。
在票据级别指定的属性会覆盖在每个成员级别指定的相同属性。
在每个成员级别设置匹配属性
游戏在匹配票据会话内的每个成员上指定每成员属性。 这些属性通过使用属性名matchAttrs 调用 XblMultiplayerSessionCurrentUserSetCustomPropertyJson 来设置。
此调用将属性放入票据会话中每个玩家的 /members/{index}/properties/custom/matchAttrs 字段。
匹配流程根据 XBOX 服务配置中为 hopper 中该属性指定的 flatten 方法,将每成员属性”扁平化”为单个票据级别的属性。
这在 Partner Center 中配置。
返回本主题顶部。
进行匹配
在票据会话和匹配票据设置好后,匹配服务将代表的票据会话与代表其他群组的其他票据会话进行匹配,然后创建或识别一个匹配目标会话。 该服务还为目标会话中匹配到的玩家创建预留,然后将票据会话标记为已匹配。 Multiplayer Session Directory (MPSD) 会通知游戏票据会话的此变更。 游戏随后必须采取步骤初始化目标会话,以确认存在足够的玩家。游戏执行服务质量 (QoS) 检查,以确保玩家可以成功相互连接。 如果初始化或 QoS 失败,游戏将标记票据会话以重新提交到匹配,以便可以找到另一群组。 有关详细信息,请参见目标会话初始化和 QoS。 在匹配活动期间,会话的 JSON 对象将发生以下更改。-
/servers/matchmaking/properties/system/status字段设置为found -
/servers/matchmaking/properties/system/targetSessionRef字段设置为目标会话 -
每个票据会话的
/members/{index}/properties/custom/matchAttrs字段复制到/members/{index}/constants/custom/matchmakingResult/playerAttrs字段 -
对于每个玩家,票据属性从匹配票据中的
ticketAttributes字段复制到/members/{index}/constants/custom/matchmakingResult/ticketAttrs字段
维护匹配票据
匹配服务使用创建票据会话的匹配票据时该会话的快照。 因此,如果任何玩家加入或离开票据会话,游戏必须使用匹配服务删除然后重新创建匹配票据。 返回本主题顶部。将游戏会话重用为匹配票据会话
两个
preserveSession 均设置为 Always 的会话无法相互匹配,因为它们无法合并。游戏使用的匹配流程应考虑到这一点。preserveSession 参数设置为 XblPreserveSessionMode::Always 来创建匹配票据。
匹配服务随后确保用于票据的现有会话在整个匹配流程中得到保留,并成为最终的目标会话。
返回本主题顶部。
删除匹配票据
要删除匹配票据,游戏调用 XblMatchmakingDeleteMatchTicketAsync。 删除票据会:- 停止对票据会话中玩家的匹配。
-
将票据会话中的
/servers/matchmaking/properties/system/status字段更新为canceled。
通过 XBOX Compute 为游戏执行匹配
以下是将玩家匹配到基于 XBOX Compute 的游戏所发生的高层步骤。 对于由第三方托管的游戏,应适用类似的流程。-
侦察员创建一个代表群组的票据会话。此会话包含一个位于会话配置的
/constants/system/measurementServerAddresses中的潜在数据中心列表。它可能来自会话模板(如果数据中心列表是静态的),也可能来自客户端在从 XBOX Compute 首次获取该列表之后在创建会话时将其写入。此会话还在targetSessionConstants/custom/gameServerPlatform对象中包含gsiSetId、gameVariantId和maxAllowedPlayers值。 - 群组中所有其他玩家加入票据会话。
-
群组的所有成员从票据会话的
/constants/system对象下载measurementServerAddresses值,使用平台 API 对其进行 ping,然后将首选数据中心的有序列表上传到会话,如/members/{index}/properties/system/serverMeasurements中所定义。[!NOTE] 游戏可以使用 XblMultiplayerSessionConstantsSetMeasurementServerAddressesJson 方法和 XblMultiplayerSessionConstants
::MeasurementServerAddressesJson从会话设置和检索measurementServerAddresses值。 -
侦察员调用 XblMatchmakingCreateMatchTicketAsync,并传入对票据会话的引用。
[!NOTE] 如果票据会话对象具有不匹配的常量,则创建票据方法可能不会成功。可通过向 hopper 添加
如果 XblMatchTicketDetailsResponseMUST规则来避免此情况,以防止与具有不匹配常量的玩家匹配。::PreserveSession设置为Never,匹配服务会将每个成员的服务器测量值复制到票据的内部表示中。 它将票据成员的服务器测量值扁平化为票据的单个服务器测量集合,作为special票据属性存储在票据的内部表示中。 如果 XblMatchTicketDetailsResponse::PreserveSession设置为Always,则不使用服务器测量值。 相反,匹配服务将会话的/properties/system/matchmaking/serverConnectionString值复制到票据的内部表示中,作为大小为 1、延迟为零的serverMeasurements集合。 - 匹配服务将票据会话与其他代表其他群组的会话进行匹配,并考虑服务器测量集合。该服务尝试将该群组与具有相同高度首选数据中心的其他群组进行匹配。
-
找到匹配的群组后,匹配服务创建或识别一个目标会话,并添加所有一起匹配的票据会话中的玩家。该服务将匹配群组的最终扁平化服务器测量值写入
/properties/system/serverConnectionStringCandidates。它将每个新添加成员最初提交的服务器测量值写入目标会话中的/members/{index}/constants/system/matchmakingResult/serverMeasurements。 - 所有玩家如前所述在目标会话上执行初始化。但是,由于玩家将连接到 XBOX Compute,因此他们不会相互执行 QoS 以确认连接性。
- 所有玩家开始游戏。
