

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 利用 FlexMatch 回填现有游戏
<a name="match-backfill"></a>

匹配回填使用 FlexMatch 机制为现有的已匹配游戏会话寻找新玩家。尽管您可以始终向任何游戏添加玩家（请参阅[将玩家加入游戏会话](https://docs.aws.amazon.com/gamelift/latest/developerguide/gamelift-sdk-client-api.html#gamelift-sdk-client-api-join))，但是对战回填可确保新玩家满足与当前玩家相同的匹配条件。此外，对战回填会将新玩家分配到团队，管理玩家接受，并将更新的对战信息发送到游戏服务器。在[FlexMatch 对战过程](gamelift-match-howitworks.md)中了解有关对战回填的更多信息。

**注意**  
FlexMatch 回填当前对使用 Amazon GameLift Servers Realtime 的游戏不可用。

回填机制有两种类型：
+ 启用自动回填，以填充以少于允许的最大玩家数开始的游戏会话。自动回填不会回填加入游戏然后退出的玩家。
+ 设置手动回填机制，替换退出正在进行的游戏会话的玩家。此机制必须能够检测到空缺席位，并生成回填请求以填充该席位。

# 打开自动回填
<a name="match-backfill-auto"></a>

使用自动匹配回填时，每当游戏会话开始时有一个或多个玩家槽位未满，Amazon GameLift Servers 都将自动触发回填请求。此功能允许游戏在找到最少匹配玩家数量后立即开始，并在匹配到其他玩家后填充剩余槽位。您可以随时选择停止自动回填。

举个例子，假设有一款可以承载六到十名玩家的游戏。FlexMatch 最初会找到六名玩家，组成对战，然后开始新的游戏会话。使用自动回填时，新游戏会话可以立即要求增加四名玩家。根据游戏的性质，我们可能希望允许新玩家在游戏会话期间随时加入。或者，我们可能希望在初始设置阶段之后、游戏开始之前停止自动回填。

要向您的游戏添加自动回填，请对您的游戏进行以下更新。

1. **启用自动回填。**自动回填在对战配置中管理。启用后，它将用于使用该对战构建器创建的所有匹配的游戏会话。当游戏会话在游戏服务器上启动时，Amazon GameLift Servers 便会开始为未满游戏会话生成回填请求。

   要打开自动回填，请打开对战配置并将回填模式设置为“AUTOMATIC”(自动)。有关更多详细信息，请参阅 [创建对战配置](match-create-configuration.md)

1. **开启回填优先级**。自定义您的对战流程，以便在创建新匹配项之前优先填写回填请求。在对战规则集中，添加算法组件并将回填优先级设置为“高”。有关更多详细信息，请参阅[自定义匹配算法](match-rulesets-components-algorithm.md)。

1. **使用新对战构建器数据更新游戏会话。**Amazon GameLift Servers 使用服务器开发工具包回调函数 `onUpdateGameSession` 通过对战信息更新游戏服务器（请参阅[初始化服务器进程](https://docs.aws.amazon.com/gamelift/latest/developerguide/gamelift-sdk-server-api.html#gamelift-sdk-server-initialize)）。将代码添加到游戏服务器，在回填活动后处理更新的游戏会话对象。参阅[在游戏服务器上更新对战数据](match-backfill-server-data.md)了解更多信息。

1. **关闭游戏会话的自动回填。**您可以选择在单个游戏会话的任一时刻停止自动回填。要停止自动回填，请向游戏客户端或游戏服务器添加代码以进行 Amazon GameLift Servers API 调用[StopMatchmaking](https://docs.aws.amazon.com/gamelift/latest/apireference/API_StopMatchmaking.html)。此调用需要票证 ID。使用最新回填请求中的回填票证 ID。您可以从游戏会话对战数据中获取此信息，这些数据会按上一步中所述进行更新。

# 从游戏服务器生成手动回填请求
<a name="match-backfill-server"></a>

您可以从托管游戏会话的游戏服务器进程手动发出对战回填请求。服务器进程包含 up-to-date有关连接到游戏的玩家以及空置玩家插槽状态的最多信息。

本主题假定您已构建必需的 FlexMatch 组件并已将对战过程成功地添加到您的游戏服务器和客户端游戏服务。有关设置 FlexMatch 的详细信息，请参阅 [路线图：在 Amazon GameLift Servers 托管解决方案中添加对战](match-tasks.md)。

要为您的游戏启用对战回填，请添加以下功能：
+ 将对战回填请求发送到对战构建器并跟踪请求的状态。
+ 更新游戏会话的对战信息。请参阅[在游戏服务器上更新对战数据](match-backfill-server-data.md)。

与其他服务器功能一样，游戏服务器使用 Amazon GameLift Servers 服务器软件开发工具包。此软件开发工具包在 C\$1\$1 和 C\$1 中可用。

要从您的游戏服务器提出对战回填请求，请完成以下任务。

1. **触发对战回填请求。**通常，每当已对战的游戏具有一个或多个空余玩家位置时，您就会想要发出回填请求。您可能希望将回填请求绑定到特定情况，例如填充关键人物角色或平衡团队。您还有可能想要基于游戏会话的时长限制回填活动。

1. **创建回填请求。**添加代码以创建对战回填请求并将其发送到 FlexMatch 对战构建器。回填请求使用以下服务器 APIs处理：
   + [ StartMatchBackfill()](https://docs.aws.amazon.com/gamelift/latest/developerguide/integration-server-sdk-cpp-ref-actions.html#integration-server-sdk-cpp-ref-startmatchbackfill)
   + [ StopMatchBackfill()](https://docs.aws.amazon.com/gamelift/latest/developerguide/integration-server-sdk-cpp-ref-actions.html#integration-server-sdk-cpp-ref-stopmatchbackfill)

   要创建回填请求，请使用以下信息调用 `StartMatchBackfill`。要取消回填请求，请使用回填请求的票证 ID 调用 `StopMatchBackfill`。
   + **票证 ID** – 提供对战票证 ID（或者选择自动生成该 ID）。您可以使用相同的机制为配对请求和回填请求分配票证 IDs 。以相同方式处理对战和回填的票证。
   + **对战构建器** – 确定要用于回填请求的对战构建器。通常，您想要使用与用于创建原始对战的对战构建器相同的构建器。此请求需要对战配置 ARN。此信息存储在游戏会话对象 ([GameSession](https://docs.aws.amazon.com/gamelift/latest/apireference/API_GameSession.html)) 中，该对象是在激活游戏会话Amazon GameLift Servers时提供给服务器进程的。对战配置 ARN 包含在 `MatchmakerData` 属性中。
   + **游戏会话 ARN** – 确定要回填的游戏会话。你可以通过调用服务器 API [ GetGameSessionId()](https://docs.aws.amazon.com/gamelift/latest/developerguide/integration-server-sdk-cpp-ref-actions.html#integration-server-sdk-cpp-ref-getgamesessionid) 来获取游戏会话 ARN。对战过程期间，新请求的票证不具有游戏会话 ID，而回填请求的票证则具有。提供游戏会话 ID 是用于区分新对战票证和回填票证的一种方式。
   + **玩家数据** – 包含您正在回填的游戏会话中所有当前玩家 ([Player](https://docs.aws.amazon.com/gamelift/latest/apireference/API_Player.html)) 的玩家信息。此信息让对战构建器能够为当前游戏会话中的玩家找到可能的最佳玩家匹配。您必须包括每位玩家的团队成员资格。如果您不使用回填，请不要指定团队。如果您的游戏服务器已准确报告玩家连接状态，则您应能够获取此数据，如下所示：

     1. 托管游戏会话的服务器进程应包含最多的玩家当前连接到游戏会话 up-to-date的信息。

     1. 要获取玩家 IDs、属性和队伍分配，请从游戏会话对象 ([GameSession](https://docs.aws.amazon.com/gamelift/latest/apireference/API_GameSession.html))、`MatchmakerData`属性中提取玩家数据（参见[关于对战构建器数据](match-server.md#match-server-data)）。对战构建器数据包含已与游戏会话匹配的所有玩家，因此您将需要提取仅当前连接的玩家的玩家数据。

     1. 对于玩家延迟，如果对战构建器调用延迟数据，则从所有当前玩家中收集新的延迟值并将其包含在每个 `Player` 对象中。如果忽略延迟数据而且对战构建器具有延迟规则，则该请求将不会匹配成功。回填请求仅需要游戏会话当前所在的区域的延迟数据。您可以从 `GameSession` 对象的 `GameSessionId` 属性中获取游戏会话的区域；此值是一个 ARN，其中包含了区域。

1. **跟踪回填请求的状态。**Amazon GameLift Servers 使用服务器开发工具包回调函数 `onUpdateGameSession` 针对回填请求的状态更新您的游戏服务器（请参阅[初始化服务器进程](https://docs.aws.amazon.com/gamelift/latest/developerguide/gamelift-sdk-server-api.html#gamelift-sdk-server-initialize)）。添加代码以在[在游戏服务器上更新对战数据](match-backfill-server-data.md)中处理状态消息（以及由于回填请求成功更新的游戏会话对象）。

   对战构建器在一个游戏会话中一次只能处理一个对战回填请求。如果您需要取消请求，请致电 [ StopMatchBackfill()](https://docs.aws.amazon.com/gamelift/latest/developerguide/integration-server-sdk-cpp-ref-actions.html#integration-server-sdk-cpp-ref-stopmatchbackfill)。如果您需要更改请求，请调用 `StopMatchBackfill`，然后提交更新的请求。

# 从后端服务生成手动回填请求
<a name="match-backfill-client"></a>

作为从游戏服务器发送回填请求的替代方案，您可能希望从客户端游戏服务发送这些请求。要使用此选项，客户端服务必须有权访问有关游戏会话活动和玩家连接的最新数据；如果您的游戏使用会话目录服务，这可能是很好的选择。

本主题假定您已构建必需的 FlexMatch 组件并已将对战过程成功地添加到您的游戏服务器和客户端游戏服务。有关设置 FlexMatch 的详细信息，请参阅 [路线图：在 Amazon GameLift Servers 托管解决方案中添加对战](match-tasks.md)。

要为您的游戏启用对战回填，请添加以下功能：
+ 将对战回填请求发送到对战构建器并跟踪请求的状态。
+ 更新游戏会话的对战信息。请参阅 [在游戏服务器上更新对战数据](match-backfill-server-data.md)。

与其他客户端功能一样，客户端游戏服务使用带有 Amazon GameLift Servers API 的 AWS SDK。C\$1\$1、C\$1 和许多其他语言都提供此软件开发工具包。有关客户端的一般描述 APIs，请参阅 Amazon GameLift Servers API 参考，其中描述了用于Amazon GameLift Servers操作的服务 API 以及特定语言的参考指南的链接。

要设置客户端游戏服务以回填对战的游戏，请完成以下任务。

1. **触发回填请求。**通常，每当已对战的游戏具有一个或多个空余玩家位置时游戏都会启动回填请求。您可能希望将回填请求绑定到特定情况，例如填充关键人物角色或平衡团队。您还有可能想要基于游戏会话的时长限制回填。无论您对触发器使用什么，至少您将需要以下信息。您可以通过使用游戏会话 ID 进行调用，从游戏会话[DescribeGameSessions](https://docs.aws.amazon.com/gamelift/latest/apireference/API_DescribeMatchmaking.html)对象 ([GameSession](https://docs.aws.amazon.com/gamelift/latest/apireference/API_GameSession.html)) 中获取此信息。
   + *当前空余玩家位置的数量*。此值可通过游戏会话的最大玩家限制和当前玩家数量计算得出。当前玩家数量会在您的游戏服务器每次连接 Amazon GameLift Servers 服务时进行更新以验证新的玩家连接或报告断开连接的玩家。
   + *创建策略*。此设置指示游戏会话当前是否接受新玩家。

    游戏会话对象包含其他可能有用的信息，包括游戏会话开始时间、自定义游戏属性和对战构建器数据。

1. **创建回填请求。**添加代码以创建对战回填请求并将其发送到 FlexMatch 对战构建器。回填请求使用以下客户端 APIs处理：
   + [StartMatchBackfill](https://docs.aws.amazon.com/gamelift/latest/apireference/API_StartMatchBackfill.html)
   + [StopMatchmaking](https://docs.aws.amazon.com/gamelift/latest/apireference/API_StopMatchmaking.html)

   要创建回填请求，请使用以下信息调用 `StartMatchBackfill`。回填请求类似于对战请求 (请参阅[请求玩家对战](match-client-start.md))，但还识别现有游戏会话。要取消回填请求，请使用回填请求的票证 ID 调用 `StopMatchmaking`。
   + **票证 ID** – 提供对战票证 ID（或者选择自动生成该 ID）。您可以使用相同的机制为配对请求和回填请求分配票证 IDs 。以相同方式处理对战和回填的票证。
   + **对战构建器** – 识别要使用的对战配置的名称。通常，您想要使用与用于创建原始对战的回填的对战构建器相同的构建器。此信息位于配对配置 ARN 下的游戏会话对象 ([GameSession](https://docs.aws.amazon.com/gamelift/latest/apireference/API_GameSession.html)) `MatchmakerData` 属性中。名称值是紧接在“matchmakingconfiguration/”之后的字符串。(例如，在 ARN 值“arn:aws:gamelift:us-west-2:111122223333:matchmakingconfiguration/MM-4v4”中，对战配置名称为“MM-4v4”。) 
   + **游戏会话 ARN** – 指定要回填的游戏会话。使用游戏会话对象中的 `GameSessionId` 属性；此 ID 使用您所需的 ARN 值。回填请求的配对门票 ([MatchmakingTicket](https://docs.aws.amazon.com/gamelift/latest/apireference/API_MatchmakingTicket.html)) 在处理时具有游戏会话 ID；新配对请求的门票在配对结束之前不会获得游戏会话 ID；游戏会话 ID 的存在是分辨新比赛门票和补填门票之间区别的一种方式。
   + **玩家数据** – 包含您正在回填的游戏会话中所有当前玩家 ([Player](https://docs.aws.amazon.com/gamelift/latest/apireference/API_Player.html)) 的玩家信息。此信息让对战构建器能够为当前游戏会话中的玩家找到可能的最佳玩家匹配。您必须包括每位玩家的团队成员资格。如果您不使用回填，请不要指定团队。如果您的游戏服务器已准确报告玩家连接状态，则您应能够获取此数据，如下所示：

     1. 使用游戏会话 ID 调用 [DescribePlayerSessions()](https://docs.aws.amazon.com/gamelift/latest/apireference/API_DescribePlayerSessions.html) 以发现当前已连接到游戏会话的所有玩家。每个玩家会话包括一个玩家 ID。您可以添加状态筛选器以仅检索活动的玩家会话。

     1. 从游戏会话对象 ([GameSession](https://docs.aws.amazon.com/gamelift/latest/apireference/API_GameSession.html))、`MatchmakerData`属性中提取玩家数据（请参阅[关于对战构建器数据](match-server.md#match-server-data)。使用在上一步中 IDs获取的玩家仅获取当前连接的玩家的数据。由于玩家退出时不会更新对战构建器数据，因此您仅需要提取当前玩家的数据。

     1. 对于玩家延迟，如果对战构建器调用延迟数据，请从所有当前玩家中收集新的延迟值并将其包含在 `Player` 对象中。如果忽略延迟数据而且对战构建器具有延迟规则，则该请求将不会匹配成功。回填请求仅需要游戏会话当前所在的区域的延迟数据。您可以从 `GameSession` 对象的 `GameSessionId` 属性中获取游戏会话的区域；此值是一个 ARN，其中包含了区域。

1. **跟踪回填请求的状态。**添加代码以侦听对战票证状态更新。您可以使用设置的机制利用事件通知 (首选) 或轮询跟踪新对战请求的票证 (请参阅[对战事件](match-client-track.md))。尽管您无需使用回填请求触发玩家接受活动，而且玩家信息已在游戏服务器上更新，但仍需要监控票证状态以处理请求失败和重新提交。

   对战构建器在一个游戏会话中一次只能处理一个对战回填请求。如果您需要取消请求，请调用 [StopMatchmaking](https://docs.aws.amazon.com/gamelift/latest/apireference/API_StopMatchmaking.html)。如果您需要更改请求，请调用 `StopMatchmaking`，然后提交更新的请求。

   在对战回填请求成功后，您的游戏服务器会收到更新的 `GameSession` 对象并处理将新玩家加入游戏会话中所需的任务。请在[在游戏服务器上更新对战数据](match-backfill-server-data.md)上查看更多信息。

# 在游戏服务器上更新对战数据
<a name="match-backfill-server-data"></a>

无论在您的游戏中如何启动对战回填请求，您的游戏服务器都必须能够处理由于对战回填请求而导致 Amazon GameLift Servers 提供的游戏会话更新。

当 Amazon GameLift Servers 完成匹配回填请求时（无论成功与否），它将使用回调函数 `onUpdateGameSession` 调用您的游戏服务器。此调用有三个输入参数：比赛回填票证 ID、状态消息以及包含最多的 up-to-date配对数据（包括玩家信息）的 GameSession 对象。您需要将以下代码添加到游戏服务器以作为您的游戏服务器集成的一部分：

1. 实现 `onUpdateGameSession` 函数。此函数必须能够处理以下状态消息 (`updateReason`)：
   + MATCHMAKING\$1DATA\$1UPDATED – 新玩家已与游戏会话成功匹配。`GameSession` 对象包含更新的对战构建器数据，包括有关现有玩家和新匹配的玩家的玩家数据。
   + BACKFILL\$1FAILED – 对战回填尝试由于内部错误而失败。`GameSession` 对象保持不变。
   + BACKFILL\$1TIMED\$1OUT – 对战构建器未能在时间限制内找到回填对战。`GameSession` 对象保持不变。
   + BACKFILL\$1CANCELLED — 通过调用 StopMatchmaking （客户端）或 StopMatchBackfill （服务器）取消了匹配回填请求。`GameSession` 对象保持不变。

1. 对于成功的回填对战，请使用更新的对战构建器数据来在新玩家连接到游戏会话时进行处理。至少，您将需要使用新玩家的团队任务以及要让玩家在游戏中开始所需的其他玩家属性。

1. 在游戏服务器调用 Server SDK 操作 [ ProcessReady()](https://docs.aws.amazon.com/gamelift/latest/developerguide/integration-server-sdk-cpp-ref-actions.html#integration-server-sdk-cpp-ref-processready) 时，将`onUpdateGameSession`回调方法名称添加为流程参数。