> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 使用 SmartMatch 匹配

> 使用 XBOX SmartMatch 匹配来创建匹配票据会话、设置玩家属性、管理 QoS，并在多人游戏中重用游戏会话。

<a id="top" />

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

[流程图：SmartMatch 匹配流程](#flow-chart-smartmatch-matchmaking-process)
[创建匹配票据会话和匹配票据](#creating-a-match-ticket-session-and-a-match-ticket)
[在会话和玩家上设置匹配属性](#setting-matchmaking-attributes-on-the-session-and-players)
[进行匹配](#making-the-match)
[维护匹配票据](#maintaining-the-match-ticket)
[将游戏会话重用为匹配票据会话](#reusing-the-game-session-as-a-match-ticket-session)
[删除匹配票据](#deleting-the-match-ticket)
[通过 XBOX Compute 为游戏执行匹配](#performing-matchmaking-for-games-using-xbox-live-compute)
[另请参见](#see-also)

<a id="flow-chart-smartmatch-matchmaking-process" />

## 流程图：SmartMatch 匹配流程

下面的流程图展示了 SmartMatch 匹配流程。

<img src="https://mintcdn.com/microsoft-4404708b/gzrdvT5kpqAXKEQt/images/gdk/services/Multiplayer_2015_SmartMatch_Matchmaking.png?fit=max&auto=format&n=gzrdvT5kpqAXKEQt&q=85&s=2754663723a8fc3a3214f997266f015c" alt="Image of a matchmaking flow chart that illustrates the SmartMatch matchmaking process" width="1133" height="1064" data-path="images/gdk/services/Multiplayer_2015_SmartMatch_Matchmaking.png" />

[返回本主题顶部。](#top)

<a id="creating-a-match-ticket-session-and-a-match-ticket" />

## 创建匹配票据会话和匹配票据

在匹配流程开始之前，匹配"侦察员"会设置一个匹配票据会话，代表希望一起进入匹配的玩家群组。
该群组中的所有玩家都使用 [XblMultiplayerSessionJoin](/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayersessionjoin) 加入会话。

在票据会话创建并填充玩家后，游戏使用 [XblMatchmakingCreateMatchTicketAsync](/reference/live/xsapi-c/matchmaking_c/functions/xblmatchmakingcreatematchticketasync) 将会话提交到匹配服务。
此方法创建代表票据会话的匹配票据，然后将票据会话中的 `/servers/matchmaking/properties/system/status` 字段更新为 `searching`。
有关详细信息，请参见 Multiplayer 任务主题中的[创建匹配票据](/services/xbox-services/multiplayer/mpsd/how-to/live-mpsd-how-tos#camt)章节。

匹配票据创建方法返回的响应是一个 [XblCreateMatchTicketResponse](/reference/live/xsapi-c/matchmaking_c/structs/xblcreatematchticketresponse) 对象。
该响应包含匹配票据 ID。它是一个可用于通过删除票据来取消匹配的 GUID。
响应还包含 hopper 的平均等待时间，可用于设置玩家的期望。

[返回本主题顶部。](#top)

<a id="setting-matchmaking-attributes-on-the-session-and-players" />

## 在会话和玩家上设置匹配属性

在将会话提交到匹配时，游戏可以设置匹配服务用于将该会话与其他会话分组的属性。
游戏可以在票据级别或每个成员级别指定属性。

### 在匹配票据级别设置匹配属性

游戏在 [XblMatchmakingCreateMatchTicketAsync](/reference/live/xsapi-c/matchmaking_c/functions/xblmatchmakingcreatematchticketasync) 方法的 `ticketAttributesJson` 参数中提交票据级别的属性。
在票据级别指定的属性会覆盖在每个成员级别指定的相同属性。

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

游戏在匹配票据会话内的每个成员上指定每成员属性。
这些属性通过使用属性名 `matchAttrs` 调用 [XblMultiplayerSessionCurrentUserSetCustomPropertyJson](/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayersessioncurrentusersetcustompropertyjson) 来设置。
此调用将属性放入票据会话中每个玩家的 `/members/{index}/properties/custom/matchAttrs` 字段。

匹配流程根据 XBOX 服务配置中为 hopper 中该属性指定的 `flatten` 方法，将每成员属性"扁平化"为单个票据级别的属性。
这在 [Partner Center](https://partner.microsoft.com/dashboard) 中配置。

[返回本主题顶部。](#top)

<a id="making-the-match" />

## 进行匹配

在票据会话和匹配票据设置好后，匹配服务将代表的票据会话与代表其他群组的其他票据会话进行匹配，然后创建或识别一个匹配目标会话。
该服务还为目标会话中匹配到的玩家创建预留，然后将票据会话标记为已匹配。
Multiplayer Session Directory (MPSD) 会通知游戏票据会话的此变更。

游戏随后必须采取步骤初始化目标会话，以确认存在足够的玩家。游戏执行服务质量 (QoS) 检查，以确保玩家可以成功相互连接。
如果初始化或 QoS 失败，游戏将标记票据会话以重新提交到匹配，以便可以找到另一群组。
有关详细信息，请参见[目标会话初始化和 QoS](/services/xbox-services/multiplayer/matchmaking/concepts/live-matchmaking-target-session)。

在匹配活动期间，会话的 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` 字段

[返回本主题顶部。](#top)

<a id="maintaining-the-match-ticket" />

## 维护匹配票据

匹配服务使用创建票据会话的匹配票据时该会话的快照。
因此，如果任何玩家加入或离开票据会话，游戏必须使用匹配服务删除然后重新创建匹配票据。

[返回本主题顶部。](#top)

<a id="reusing-the-game-session-as-a-match-ticket-session" />

## 将游戏会话重用为匹配票据会话

<Info>两个 `preserveSession` 均设置为 `Always` 的会话无法相互匹配，因为它们无法合并。游戏使用的匹配流程应考虑到这一点。</Info>

游戏可以将现有游戏会话重用为匹配票据会话，以查找更多玩家加入已进行中的游戏。
要启用此功能，游戏必须通过调用 [XblMatchmakingCreateMatchTicketAsync](/reference/live/xsapi-c/matchmaking_c/functions/xblmatchmakingcreatematchticketasync) 并将 `preserveSession` 参数设置为 [XblPreserveSessionMode](/reference/live/xsapi-c/matchmaking_c/enums/xblpreservesessionmode)`::Always` 来创建匹配票据。
匹配服务随后确保用于票据的现有会话在整个匹配流程中得到保留，并成为最终的目标会话。

[返回本主题顶部。](#top)

<a id="deleting-the-match-ticket" />

## 删除匹配票据

要删除匹配票据，游戏调用 [XblMatchmakingDeleteMatchTicketAsync](/reference/live/xsapi-c/matchmaking_c/functions/xblmatchmakingdeletematchticketasync)。
删除票据会：

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

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

[返回本主题顶部。](#top)

<a id="performing-matchmaking-for-games-using-xbox-live-compute" />

## 通过 XBOX Compute 为游戏执行匹配

以下是将玩家匹配到基于 XBOX Compute 的游戏所发生的高层步骤。
对于由第三方托管的游戏，应适用类似的流程。

1. 侦察员创建一个代表群组的票据会话。此会话包含一个位于会话配置的 `/constants/system/measurementServerAddresses` 中的潜在数据中心列表。它可能来自会话模板（如果数据中心列表是静态的），也可能来自客户端在从 XBOX Compute 首次获取该列表之后在创建会话时将其写入。此会话还在 `targetSessionConstants/custom/gameServerPlatform` 对象中包含 `gsiSetId`、`gameVariantId` 和 `maxAllowedPlayers` 值。

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

3. 群组的所有成员从票据会话的 `/constants/system` 对象下载 `measurementServerAddresses` 值，使用平台 API 对其进行 ping，然后将首选数据中心的有序列表上传到会话，如 `/members/{index}/properties/system/serverMeasurements` 中所定义。

   > \[!NOTE]
   > 游戏可以使用 [XblMultiplayerSessionConstantsSetMeasurementServerAddressesJson](/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayersessionconstantssetmeasurementserveraddressesjson) 方法和 [XblMultiplayerSessionConstants](/reference/live/xsapi-c/multiplayer_c/structs/xblmultiplayersessionconstants)`::MeasurementServerAddressesJson` 从会话设置和检索 `measurementServerAddresses` 值。

4. 侦察员调用 [XblMatchmakingCreateMatchTicketAsync](/reference/live/xsapi-c/matchmaking_c/functions/xblmatchmakingcreatematchticketasync)，并传入对票据会话的引用。

   > \[!NOTE]
   > 如果票据会话对象具有不匹配的常量，则创建票据方法可能不会成功。可通过向 hopper 添加 `MUST` 规则来避免此情况，以防止与具有不匹配常量的玩家匹配。

   如果 [XblMatchTicketDetailsResponse](/reference/live/xsapi-c/matchmaking_c/structs/xblmatchticketdetailsresponse)`::PreserveSession` 设置为 `Never`，匹配服务会将每个成员的服务器测量值复制到票据的内部表示中。
   它将票据成员的服务器测量值扁平化为票据的单个服务器测量集合，作为 `special` 票据属性存储在票据的内部表示中。

   如果 [XblMatchTicketDetailsResponse](/reference/live/xsapi-c/matchmaking_c/structs/xblmatchticketdetailsresponse)`::PreserveSession` 设置为 `Always`，则不使用服务器测量值。
   相反，匹配服务将会话的 `/properties/system/matchmaking/serverConnectionString` 值复制到票据的内部表示中，作为大小为 1、延迟为零的 `serverMeasurements` 集合。

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

6. 找到匹配的群组后，匹配服务创建或识别一个目标会话，并添加所有一起匹配的票据会话中的玩家。该服务将匹配群组的最终扁平化服务器测量值写入 `/properties/system/serverConnectionStringCandidates`。它将每个新添加成员最初提交的服务器测量值写入目标会话中的 `/members/{index}/constants/system/matchmakingResult/serverMeasurements`。

7. 所有玩家如前所述在目标会话上执行初始化。但是，由于玩家将连接到 XBOX Compute，因此他们不会相互执行 QoS 以确认连接性。

8. 所有玩家开始游戏。

[返回本主题顶部。](#top)

<a id="see-also" />

## 另请参见

[匹配概述](/services/xbox-services/multiplayer/matchmaking/live-matchmaking-overview)


## Related topics

- [SmartMatch 匹配](/zh-CN/services/xbox-services/multiplayer/matchmaking/live-matchmaking-nav.md)
- [使用 SmartMatch 匹配玩游戏(流程图)](/zh-CN/services/xbox-services/multiplayer/mpm/concepts/flowcharts/live-mpm-play-with-smartmatch-matchmaking.md)
- [使用 SmartMatch 和 MPM 进行多人游戏匹配](/zh-CN/services/xbox-services/multiplayer/mpm/how-to/live-play-multiplayer-with-matchmaking.md)
- [匹配概念](/zh-CN/services/xbox-services/multiplayer/matchmaking/concepts/live-matchmaking-concepts-nav.md)
- [概念](/zh-CN/services/xbox-services/multiplayer/matchmaking/concepts/index.md)
