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

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

用回填现有游戏 FlexMatch

匹配回填使用 FlexMatch 机制为现有的已匹配游戏会话寻找新玩家。尽管您可以随时向任何游戏添加玩家(参见加入玩家游戏会话),但比赛回填可确保新玩家符合与当前玩家相同的匹配标准。此外,对战回填会将新玩家分配到团队,管理玩家接受,并将更新的对战信息发送到游戏服务器。在FlexMatch配对过程中了解有关对战回填的更多信息。

注意

FlexMatch回填目前不适用于使用实时服务器的游戏。

回填机制有两种类型:

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

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

开启自动回填

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

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

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

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

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

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

  3. 使用新的媒人数据更新游戏会话. 亚马逊使用服务器 SDK 回调函数使用比赛信息GameLift更新您的游戏服务器onUpdateGameSession(请参阅初始化服务器进程)。将代码添加到游戏服务器,在回填活动后处理更新的游戏会话对象。在 更新游戏服务器上的比赛数据 中了解更多信息。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  3. 跟踪回填请求的状态。亚马逊使用服务器 SDK 回调函数向您的游戏服务器GameLift更新回填请求的状态onUpdateGameSession(参见初始化服务器进程)。添加代码以处理状态消息,以及因成功的回填请求而更新的游戏会话对象,位于。更新游戏服务器上的比赛数据

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

发送回填请求(来自客户服务)

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

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

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

与其他客户端功能一样,客户端游戏服务使用带有 Amazon GameLift API 的 Amazon SDK。C++、C# 和许多其他语言都提供此软件开发工具包。有关客户端 API 的一般描述,请参阅亚马逊GameLift服务 API 参考,其中描述了亚马逊GameLift相关操作的低级服务 API,并包含特定语言参考指南的链接。

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

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

    • 当前空余玩家位置的数量。此值可通过游戏会话的最大玩家限制和当前玩家数量计算得出。每当您的游戏服务器联系亚马逊GameLift服务以验证新的玩家连接或报告掉线的玩家时,当前玩家人数就会更新。

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

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

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

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

    • 门票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 的存在是区分新比赛门票和回填门票的一种方法。

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

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

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

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

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

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

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

更新游戏服务器上的比赛数据

无论您在游戏中如何发起比赛回填请求,您的游戏服务器都必须能够处理亚马逊因比赛回填请求而GameLift提供的游戏会话更新。

当亚马逊GameLift完成比赛回填请求时(无论成功与否),它都会使用回调函数调用您的游戏服务器。onUpdateGameSession此通话有三个输入参数:比赛回填票 ID、状态消息和包含包括玩家信息在内的up-to-date配对数据最多的GameSession对象。您需要将以下代码添加到游戏服务器以作为您的游戏服务器集成的一部分:

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

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

    • BACKFILL_FAILED — 由于内部错误,比赛回填尝试失败。GameSession 对象保持不变。

    • BACKFILL_TIMED_OUT — 媒人未能在时限内找到回填匹配项。GameSession 对象保持不变。

    • BACKFILL_CANCELLED — 调用StopMatchmaking(客户端)或StopMatchBackfill(服务器)取消了比赛回填请求。GameSession 对象保持不变。

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

  3. 在游戏服务器对服务器 SDK 操作 ProcessReady() 的调用中,将onUpdateGameSession回调方法名称添加为进程参数。