利用 FlexMatch 回填现有游戏 - Amazon GameLift
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

利用 FlexMatch 回填现有游戏

匹配回填使用 机制为现有的已匹配游戏会话寻找新玩家。尽管您可以始终向任何游戏添加玩家(请参阅将玩家加入游戏会话),但是对战回填可确保新玩家满足与当前玩家相同的匹配条件。此外,对战回填会将新玩家分配到团队,管理玩家接受,并将更新的对战信息发送到游戏服务器。在FlexMatch 对战流程中了解有关对战回填的更多信息。

注意

FlexMatch 回填当前不能使用实时服务器用于游戏。

回填机制有两种类型:

  • 要填充以少于允许的最大玩家数开始的游戏会话,请启用自动回填。

  • 要取代正在进行的游戏会话中退出的玩家,请向游戏服务器添加功能以发送回填请求。

打开自动回填

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

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

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

  1. 启用自动回填。自动回填在对战配置中管理。启用后,它将用于使用该对战构建器创建的所有匹配游戏会话。游戏服务器上启动游戏会话后,Amazon GameLift 就会开始为非完整游戏会话生成回填请求。

    要打开自动回填,请打开对战配置并将回填模式设置为“AUTOMATIC”(自动)。有关更多详细信息,请参阅 创建对战配置

  2. 开启回填优先级。自定义您的对战流程,以便在创建新匹配项之前优先填写回填请求。在对战规则集中,添加算法组件并将回填优先级设置为“高”。有关更多信息,请参阅自定义匹配算法

  3. 使用新的对战数据更新现有游戏会话。Amazon GameLift 使用服务器软件开发工具包回调函数 onUpdateGameSession 使用对战信息更新您的游戏服务器(参阅初始化服务器进程)。将代码添加到游戏服务器,在回填活动后处理更新的游戏会话对象。在 在游戏服务器上更新对战数据 中了解更多信息。

  4. 关闭游戏会话的自动回填。您可以选择在单个游戏会话的任一时刻停止自动回填。要停止自动回填,请将代码添加到您的游戏客户端或游戏服务器来发起 Amazon GameLift API 调用 StopMatchmaking。此调用需要票证 ID。使用最新回填请求中的回填票证 ID。您可以从游戏会话对战数据中获取此信息,这些数据会按上一步中所述进行更新。

发送回填请求(从游戏服务器)

您可以直接从托管游戏会话的游戏服务器进程发出对战回填请求。该服务器进程具有有关已连接到游戏的当前玩家及空余玩家位置状态的最新信息。

本主题假定您已构建必需的 FlexMatch 组件并已将对战过程成功地添加到您的游戏服务器和客户端游戏服务。有关设置 FlexMatch 的更多详细信息,请参阅FlexMatch 与 Amazon GameLift 托管集成

要为您的游戏启用对战回填,请添加以下功能:

与其他服务器功能一样,游戏服务器使用 Amazon GameLift 服务器软件开发工具包。此软件开发工具包在 C++ 和 C# 中可用。

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

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

  2. 创建回填请求。添加代码以创建对战回填请求并将其发送到 FlexMatch 对战构建器。回填请求是使用以下服务器 API 处理的:

    • StartMatchBackfill()

    • StopMatchBackfill()

    要创建回填请求,请使用以下信息调用 StartMatchBackfill。要取消回填请求,请使用回填请求的票证 ID 调用 StopMatchBackfill

    • 票证 ID – 提供对战票证 ID(或者选择自动生成该 ID)。您可以使用相同的机制来将票证 ID 分配到对战请求和回填请求。以相同方式处理对战和回填的票证。

    • 对战构建器 – 确定要用于回填请求的对战构建器。通常,您想要使用与用于创建原始对战的对战构建器相同的构建器。此请求需要对战配置 ARN。此信息存储在游戏会话对象 (GameSession) 中,该对象在激活游戏会话时由 Amazon GameLift 提供给服务器进程。对战配置 ARN 包含在 MatchmakerData 属性中。

    • 游戏会话 ARN – 确定要回填的游戏会话。您可以通过调用服务器 API GetGameSessionId() 来获取游戏会话 ARN。对战过程期间,新请求的票证不具有游戏会话 ID,而回填请求的票证则具有。提供游戏会话 ID 是用于区分新对战票证和回填票证的一种方式。

    • 玩家数据 – 包含您正在回填的游戏会话中所有当前玩家 (Player) 的玩家信息。此信息让对战构建器能够为当前游戏会话中的玩家找到可能的最佳玩家匹配。您必须包括每位玩家的团队成员资格。如果您不使用回填,请不要指定团队。如果您的游戏服务器已准确报告玩家连接状态,则您应能够获取此数据,如下所示:

      1. 托管游戏会话的服务器进程应具有玩家当前已连接到游戏会话的最新信息。

      2. 要获取玩家 ID、属性和团队任务,请从游戏会话对象 (GameSession)、MatchmakerData 属性中提取玩家数据(请参阅使用对战构建器数据)。对战构建器数据包含已与游戏会话匹配的所有玩家,因此您将需要提取仅当前连接的玩家的玩家数据。

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

  3. 跟踪回填请求的状态。Amazon GameLift 使用服务器软件开发工具包回调函数 onUpdateGameSession 针对回填请求的状态更新您的游戏服务器(请参阅初始化服务器进程)。添加代码以在在游戏服务器上更新对战数据中处理状态消息(以及由于回填请求成功更新的游戏会话对象)。

    对战构建器在一个游戏会话中一次只能处理一个对战回填请求。如果您需要取消请求,请调用 StopMatchBackfill()。如果您需要更改请求,请调用 StopMatchBackfill,然后提交更新的请求。

发送回填请求(从客户端服务)

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

本主题假定您已构建必需的 FlexMatch 组件并已将对战过程成功地添加到您的游戏服务器和客户端游戏服务。有关设置 FlexMatch 的更多详细信息,请参阅FlexMatch 与 Amazon GameLift 托管集成

要为您的游戏启用对战回填,请添加以下功能:

与其他客户端功能一样,客户端游戏服务将结合使用 Amazon 软件开发工具包与 Amazon GameLift API。C++、C# 和许多其他语言都提供此软件开发工具包。有关客户端 API 的常规说明,请参阅 Amazon GameLift 服务 API 参考,其中介绍了 Amazon GameLift 相关操作的低级别服务 API,并提供特定于语言的参考指南链接。

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

  1. 触发回填请求。通常,每当已对战的游戏具有一个或多个空余玩家位置时游戏都会启动回填请求。您可能希望将回填请求绑定到特定情况,例如填充关键人物角色或平衡团队。您还有可能想要基于游戏会话的时长限制回填。无论您对触发器使用什么,至少您将需要以下信息。您可以通过使用游戏会话 ID 调用 DescribeGameSessions 来从游戏会话对象 (GameSession) 中获取此信息。

    • 当前空余玩家位置的数量。此值可通过游戏会话的最大玩家限制和当前玩家数量计算得出。当前玩家数量会在您的游戏服务器每次连接 服务时进行更新以验证新的玩家连接或报告断开连接的玩家。

    • 创建策略。此设置指示游戏会话当前是否接受新玩家。

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

  2. 创建回填请求。添加代码以创建对战回填请求并将其发送到 FlexMatch 对战构建器。使用这些客户端 API 处理回填请求:

    要创建回填请求,请使用以下信息调用 StartMatchBackfill。回填请求类似于对战请求 (请参阅请求玩家对战),但还识别现有游戏会话。要取消回填请求,请使用回填请求的票证 ID 调用 StopMatchmaking

    • 票证 ID – 提供对战票证 ID(或者选择自动生成该 ID)。您可以使用相同的机制来将票证 ID 分配到对战请求和回填请求。以相同方式处理对战和回填的票证。

    • 对战构建器 – 识别要使用的对战配置的名称。通常,您想要使用与用于创建原始对战的回填的对战构建器相同的构建器。此信息位于对战配置 ARN 下的游戏会话对象 (GameSession), MatchmakerData 属性中。名称值是紧接在“matchmakingconfiguration/”之后的字符串。(例如,在 ARN 值“arn:aws:gamelift:us-west-2:111122223333:matchmakingconfiguration/MM-4v4”中,对战配置名称为“MM-4v4”。)

    • 游戏会话 ARN – 指定要回填的游戏会话。使用游戏会话对象中的 GameSessionId 属性;此 ID 使用您所需的 ARN 值。回填请求的对战票证 (MatchmakingTicket) 在进行处理时具有游戏会话 ID;在放置对战之前,新对战请求的票证不会获取游戏会话 ID;提供游戏会话 ID 是用于区分新对战票证和回填票证的一种方式。

    • 玩家数据 – 包含您正在回填的游戏会话中所有当前玩家 (Player) 的玩家信息。此信息让对战构建器能够为当前游戏会话中的玩家找到可能的最佳玩家匹配。您必须包括每位玩家的团队成员资格。如果您不使用回填,请不要指定团队。如果您的游戏服务器已准确报告玩家连接状态,则您应能够获取此数据,如下所示:

      1. 使用游戏会话 ID 调用 DescribePlayerSessions() 来发现当前已连接到游戏会话的所有玩家。每个玩家会话包括一个玩家 ID。您可以添加状态筛选器以仅检索活动的玩家会话。

      2. 从游戏会话对象 (GameSession)、MatchmakerData 属性中提取玩家数据 (请参阅使用对战构建器数据)。使用在上一步中获取的玩家 ID 来仅获取当前已连接玩家的数据。由于玩家退出时不会更新对战构建器数据,因此您仅需要提取当前玩家的数据。

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

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

    对战构建器在一个游戏会话中一次只能处理一个对战回填请求。如果您需要取消请求,请调用 StopMatchmaking。如果您需要更改请求,请调用 StopMatchmaking,然后提交更新的请求。

    在对战回填请求成功后,您的游戏服务器会收到更新的 GameSession 对象并处理将新玩家加入游戏会话中所需的任务。请在在游戏服务器上更新对战数据上查看更多信息。

在游戏服务器上更新对战数据

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

当 Amazon GameLift 完成匹配回填请求时(成功与否),它将使用回调函数 onUpdateGameSession 调用您的游戏服务器。此调用具有三个输入参数:对战回填票证 ID、状态消息和包含最新对战数据 (包括玩家信息) 的 GameSession 对象。您需要将以下代码添加到游戏服务器以作为您的游戏服务器集成的一部分:

  1. 实现 onUpdateGameSession 函数。此函数必须能够处理以下状态消息 (updateReason):

    • MATCHMAKING_DATA_UPDATED – 新玩家已与游戏会话成功匹配。GameSession 对象包含更新的对战构建器数据,包括有关现有玩家和新匹配的玩家的玩家数据。

    • BACKFILL_FAILED – 对战回填尝试由于内部错误而失败。GameSession 对象保持不变。

    • BACKFILL_TIMED_OUT – 对战构建器未能在时间限制内找到回填对战。GameSession 对象保持不变。

    • BACKFILL_CANCELLED – 对战回填请求已通过调用 StopMatchmaking(客户端)或 StopMatchBackfill(服务器)而被取消。GameSession 对象保持不变。

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

  3. 在您的游戏服务器对服务器软件开发工具包操作 ProcessReady()的调用中,添加 onUpdateGameSession 回调方法名称作为过程参数。