使用服务器回填票证

服务器托管的游戏有时需要搜索其他玩家。 大多数情况下,当游戏正在进行时,一个或多个玩家断开连接时会发生这种情况。 服务器回填票证可使游戏服务器搜索适合当前正在进行的游戏的其他玩家。

服务器回填票证在多个方面与常规匹配票证不同:

  1. 匹配
    • 回填票证不能相互匹配。
    • 在搜索过程中会为回填票证提供优先级。 这可使玩家群不那么支离破碎。
  2. 合约
    • 可使用 ServerDetails 字段创建回填票证。 这可使服务器指示匹配的玩家应如何连接到它。
    • 可使用团队分配创建回填票证。 这样具有团队的游戏可以维护其团队信息。
  3. 队列属性
  4. 所有权
    • 回填票证由游戏服务器所有,而不是用户。 用户无法以任何方式查看回填票证或与其进行交互。

创建服务器回填票证

创建回填票证以类似于创建常规匹配票证的方式开始,但使用 CreateServerBackfillTicket 调用,而不是 CreateServerMatchmakingTicket 调用。 游戏服务器必须提供其当前正在托管的游戏的所有会员信息。 执行此操作的最有效方式是存储先前匹配结果中返回的属性。 通过调用具有 ReturnMemberAttributes 标志的 GetMatch 可以检索这些属性。 或者,游戏服务器可向用户查询属性信息。

除会员外,游戏服务器还可指定其他两项信息。

ServerDetails

该结构与 GetMatch 调用中返回的结构相同,可供服务器指定连接到它所需的任何信息。 当匹配回填票证时,其 ServerDetails 结构将返回给在最终匹配上调用 GetMatch 的任何玩家。 该结构中的所有字段均为可选字段。 游戏可能只需要其中的一部分,以便为客户端提供连接到游戏服务器所需的足够信息。

注意

IPV4Address 字段未进行验证,可用于向客户端提供任意连接字符串信息。

{
  "ServerDetails": {
    "IPV4Address": "123.234.123.234",
    "Ports": [
      {
        "Port": {
          "Name": "portname",
          "Num": 12345,
          "Protocol": "UDP"
        }
      }
    ],
    "Region": "EastUS"
  }
}

团队分配

如果将回填票证提交到具有团队的队列,还可使用 TeamId 指定每个会员,从而指示他们当前所在的团队。 返回 Match 时,将保留此会员资格。 如果没有为用户指定 TeamId,可将其放在任何团队中。

{
  "Members": [
    {
      "TeamId": "red",
      "Entity": {
        "Id": "6570DE3537DC9DF6",
        "Type": "title_player_account",
        "TypeString": "title_player_account"
      },
      "Attributes": {
        "DataObject": {
          "Skill": 25
        }
      }
    }
  ]
}

与回填票证进行交互

创建后,回填票证开始搜索符合规则条件的常规匹配票证。 除使用类似的 API 外,回填票证的流程与常规匹配票证的操作方式相同。 游戏服务器通过调用 GetServerBackfillTicket 可检查其票证的状态。 也可通过调用 CancelServerBackfillTicket 取消票证。

注意

不允许客户端取消它们所在的回填票证。 假设某个客户端正在参加 4v4 比赛,对方团队的一个玩家掉线了。 该客户端可通过不断取消其所在的任何回填票证来保持其优势。 为防止这种情况,只有游戏服务器可取消回填票证。

会员资格限制以及从丢失的回填票证中恢复

与常规匹配票证类似,对于每个队列,任何时候一个用户都只能在一个回填票证中。 此限制是通过独立于客户端控制的常规票证加以跟踪的。

如果游戏服务器创建回填票证后崩溃,由于会员资格限制,无法使用另一回填票证提交丢失的回填票证中的任何用户。 游戏服务器通过接收 MatchmakingTicketMembershipLimitExceeded 错误,以及利用一个指示哪些用户在 errorDetails 正文中具有未完成回填票证的用户列表来发现这一点。

{
    "code": 400,
    "status": "BadRequest",
    "error": "MatchmakingTicketMembershipLimitExceeded",
    "errorCode": 2055,
    "errorMessage": "User is a member of too many backfill tickets.",
    "errorDetails": {
        "UsersExceedingMembershipLimit": [
            "title_player_account!562D72A5B184F612"
        ]
    }
}

游戏服务器通过调用 CancelAllServerBackfillTicketsForPlayer 移除该用户所在的所有回填票证,从而从这种情况中恢复用户。 此外还提供了 ListServerBackfillTicketsForPlayer,作为发现玩家可能位于哪些回填票证中的方法。

与区域选择规则的交互

区域选择规则通常要求票证指定对其属性的一系列延迟度量。 但回填票证代表在特定数据中心中已经在进行的游戏。 创建请求必须在 ServerDetails 结构中指定一个区域,而不是一系列延迟度量。 为使票证与回填票证相匹配,它们必须具有到达回填票证指定区域的可接受 ping 时间。

与团队票证大小相似性规则的交互

团队票证大小相似性规则强制使大型玩家组与其他大型玩家组进行匹配。 但回填票证不包含哪些玩家作为组加入了游戏的信息。 因此,在匹配回填票证时,将忽略票证大小相似性规则。