匹配
快速开始使用匹配,并探索各种游戏类型的示例场景。
基于对战的游戏中的匹配系统通常旨在:
找到其他玩家 基于诸如区域、延迟、技术水平或游戏参数等条件;
搜索服务器 根据可用容量[或延迟、区域、技术水平、地图、模式]加入;
启动新服务器 如果现有服务器已满或不满足玩家条件。
玩家体验至上,定义我们的核心目标:
高对局填充率和社交功能整合(与好友组队游戏),
快速匹配且控制匹配质量(低延迟、共享偏好),
可靠且可预测的匹配流程并具有全球可用性。
或者,让玩家 从列表中选择一个持久的(始终在线)服务器 带有 服务器浏览器.
跟随这段视频,开始使用我们的 Matchmaker 服务:
✔️ 准备工作
测试此服务完全免费,无需信用卡。
免费额度允许在我们的共享测试集群上每次重启后最多运行 3 小时。
本教程假定您已经:
已在 Edgegap 上发布您的服务器应用(Unreal Engine, Unity),
已从游戏客户端成功连接到您在 Edgegap 上的服务器。
匹配架构
本指南将重点介绍 匹配 API 和回填 API.

在进行匹配时,有四(4)个重要的数据流:
部署 API 部署、扩展和管理你的专用服务器。
Netcode 传输 用于游戏客户端与专用服务器之间的通信。
深入了解 替换或向正在运行的服务器添加玩家。
发布后, 你的匹配器需要 24/7 运行 以确保全球玩家都可以加入服务器。
🍀 简单示例
从一个简单示例开始,测试基本的匹配玩家流程:
1. 在免费套餐上设置
☑️ 注册你的免费 Edgegap 账户 并打开 Matchmaker 控制台页面.
☑️ 点击 创建 Matchmaker 首先,然后输入:
matchmaker 名称 - 仅供你自己参考,例如
quickstart-dev,上传我们的简单示例 JSON 配置。
🍀 简单示例(最低推荐配置):
请务必修改应用 名称 和 version 以匹配你的 应用和版本.
故障排查与常见问题:
应用配置对于配置文件 XYZ 无效。
我们找不到您的 应用和版本,请验证
应用值。
标签为 '2024.01.30-16.23.00-UTC' 的 Docker 镜像未被缓存。
🌟 升级到按需付费等级 以解锁 具有缓存的即时部署.
您仍然可以继续,但我们建议测试您的部署时间。
☑️ 如果没有出现验证错误,点击 创建并启动 并等待流程完成。这将启动一个新的免费集群,其中包含你的简单示例 Matchmaker。
✅ 现在你可以进入下一步。
2. 探索配置
随着我们发布 Matchmaker 更新,每个新版本都使用 语义化版本 通过解释格式来清晰传达变更影响 major.minor.patch:
🔥
主版本版本包含破坏性变更,需要进行集成审查,🌟
次版本版本包含大量向后兼容的改进,🩹
补丁版本版本包含错误修复和小幅改进。
检查票据 以便在开发过程中更好地理解并调试可能的匹配流程。我们建议在正式的匹配器中禁用 inspect API。
一些 部署可能会产生错误. 我们会通过最多重试部署 max_deployment_retry_count 次自动尝试来解决此问题(无需客户端确认)。
为了确保意外的客户端崩溃或被遗弃的票据不会长时间占用你的匹配器资源,未匹配的票据将在 ticket_expiration_period 之后被取消,其状态将变为 CANCELLED 然后在 ticket_removal_period .
我们匹配逻辑的核心配置在 配置文件(队列)中。每个配置文件都是一个完全隔离的匹配队列,指向 应用和版本 预定义数量的所需 CPU 和内存(RAM)资源。
规则 初始规则集中的要求必须满足,玩家才能被分到一起,每条规则由三个属性定义:
你选择的名称,例如 -
匹配大小,规则类型,也称为操作符,例如 -
player_count,以及最后的操作符属性,例如
team_count或max_team_size.
玩家数量规则
这是一条特殊规则,定义了启动分配所需匹配的玩家数量:
team_count指的是队伍数量,1 支队伍可用于合作模式或大乱斗模式,min_team_size指的是每支队伍的最少玩家数。max_team_size指的是每支队伍的最多玩家数。
我们的简单示例展示了一个 2 人合作游戏。
玩家数量规则 是必需的,并且只能定义一次 在你的初始配置规则中。
延迟规则
延迟 是一条特殊规则,用于优化玩家匹配的 ping:
通过移除延迟高(超过阈值)的区域来降低客户端-服务器延迟,
通过将延迟相近(差值低于指定值)的玩家分组来提高匹配公平性。
规则示例: 信标
信标 已配置为以下内容的规则 "difference": 100, "max_latency": 200 将匹配:
✅ Alice 和 Bob 可能匹配:
东京被丢弃(>200 毫秒),
芝加哥的延迟绝对差在 100 毫秒以内。
芝加哥
✅
75.0
12.3
87.3
洛杉矶
❌
113.2 ❌
145.6
32.4
东京
不适用
不适用
233.2 ❌
253.2 ❌
❌ Alice 和 Charlie 永远不会匹配:
没有任何信标对两位玩家都具有 < 200 毫秒的延迟,
Alice 住在北美 - 伊利诺伊州,
Charlie 住在亚洲 - 日本。
芝加哥
不适用
不适用
12.3
215.6 ❌
洛杉矶
不适用
不适用
145.6
238.3 ❌
东京
不适用
不适用
233.2 ❌
24.2
规则 延迟 是 可选,并且只能在你的初始配置中定义一次 规则。
✅ 现在你可以进入下一步。
3. 查看实例详情
☑️ 在初始化完成后,在控制台中查看你的新匹配器详情:

状态 表示服务健康状况,可能为 ONLINE、OFFLINE 或 ERROR。
标识符 如果你需要帮助排查问题,这可以帮助 Edgegap 员工快速找到你的匹配器。
启动时间 可用于追踪最近的更新时间。
规格 对应我们的某个 价格层级.
API URL 游戏客户端和游戏服务器将使用它与匹配器通信。
Swagger URL 是我们提供的一个方便的 openAPI 规范界面,用于浏览 API 架构。
Auth Token 是游戏客户端和游戏服务器用于身份验证的唯一密钥令牌。
Edgegap 员工绝不会向你索要令牌。如果你怀疑发生了安全漏洞,请重新生成令牌。
要测试你的新匹配器, 你需要 Swagger URL、API URL 和 Auth Token.
✅ 现在你可以进入下一步。
要在开发环境中更新你的匹配器规则,请编辑配置并重启它。
查看 ⏩ 滚动更新 适用于正式游戏和零停机更新。
4. 测试 Tickets API
请等待最多 5 分钟 在启动匹配器后,以便 DNS 传播完成。
☑️ 首先, 打开你的 Swagger URL 以在 swagger 界面中查看你的 openAPI 架构:

☑️ 点击 Authorize 🔒,粘贴你的 Auth Token,然后点击 Authorize.

☑️ 向下滚动到 Ticket API - POST /tickets,展开并点击 Try it out.

☑️ 预览你的请求:
请注意
player_ip设置为null- 这将导致 Matchmaker 自动使用添加到你请求中的 IP 地址(其他选项见 服务器到服务器 ),profile指的是你的 配置文件(队列),attributes包含你的匹配器规则所需的值,在本例中对应latencies规则,规则
player_count是唯一不需要在玩家票据中提供任何属性的规则。
☑️ 点击 Execute 并查看你的玩家票据请求响应:
id是你唯一的匹配票据 ID,请保存它以便稍后查看票据,profile确认选择了 配置文件(队列),group_id是分配给每个票据的唯一 组 ID,单个玩家会被表示为一个由 1 组成的组,team_id是在每位玩家进入后分配的唯一队伍 IDTEAM_FOUND状态被达到时,player_ip是玩家解析后的公网 IP 地址,不论识别方式如何,assignment被设置为null以表示票据尚未匹配或分配到服务器,created_at提供玩家票据创建时间的信息,供游戏 UI 使用,status表示票据的当前状态,所有票据都以SEARCHING.

☑️ 通过再次点击 Execute 创建第二个票据,这样我们的两个玩家就能匹配并启动服务器。
☑️ 折叠 POST /tickets 并打开 GET /tickets/{ticketId},然后点击 Try it out.
☑️ 输入上一步响应中的票据 ID,然后点击 Execute.

☑️ 查看你的玩家票据更新后的分配信息:
状态变为
MATCH_FOUND首先,同时保留assignment设置为null以表示玩家已匹配并正在分配服务器,

☑️ 点击 Execute 再次检查你的票据,并查看更新后的分配信息:
状态变为
HOST_ASSIGNED配合assignment其中包含已分配服务器的详细信息。

故障排查与常见问题
我的票据卡在 SEARCHING .
请确认你已根据配置创建了足够多、条件重叠的票据。
我的票据在 MATCH_FOUND 和 TEAM_FOUND 之间反复切换。
免费套餐账户一次仅限 1 个部署。请考虑升级,或停止当前部署以启动新的部署。
我的票据直接变为 CANCELLED.
你的票据已过期。请重新创建新票据,或者在配置中增加过期时间以便测试。
我在检查票据时收到 HTTP 404 Not Found。
你的票据已被删除,可能是通过 DELETE 请求删除,或者到达了其删除周期(在票据过期后开始,且在你的配置中定义)。请重新创建新票据,或者在配置中增加过期/删除周期以便测试。
☑️ 在控制台中查看你的新部署:
注意每个部署都带有所有票据 ID 和配置文件,以增强可追溯性。

在找到匹配后几秒钟,匹配过程会继续到 如果玩家已被匹配并分配到游戏服务器,他们的票据会被自动删除。在 表示你的 部署现在已就绪并且你的游戏服务器正在初始化.
每个玩家读取他们的 ticket_id 和 assignment 并使用以下方式尝试连接 FQDN (部署 URL) 和 外部端口。此时你的游戏服务器可能仍在初始化,因此 玩家必须多次重试连接,直到超过你通常的服务器初始化时间:
要 从 PIE(编辑器)连接 在开发和测试期间,按下波浪号键 ~ 并输入 open {URL}:{port} 并等待你的编辑器加载地图。
要 从游戏客户端构建连接 (以及在生产线上)尝试
虚幻引擎 ⚡ 集成工具包:
从 Fab 市场 安装 (个人使用免费),
导入简单示例蓝图 并根据您的需求进行自定义。
如果连接失败或出现黑屏,请查阅我们的 故障排除指南.
要 将你的 Unity 编辑器连接 注入的变量(Injected Variables) 游戏客户端 到你的云部署,输入:
部署 URL 指向服务器的 IP,通常在
NetworkManager组件中。外部端口 映射到 服务器的内部监听端口,通常在传输组件中。
如果出现连接超时或其他问题,请查阅我们的 故障排除指南.
我们不要求玩家确认匹配,因为我们的目标是提供尽可能短的游戏开始时间、高匹配填充率,并尽量减少排队弃赛和匹配取消。
玩家应当 在游戏重启之间持久保存他们的分配 ID,以便在游戏客户端崩溃的情况下他们可以检索连接详情并尝试重新连接。
参见 匹配 以及我们带有自动重连功能等更多功能的 SDK。
☑️ 尝试从你的游戏客户端连接到分配的服务器。
如果你遇到较高延迟,你的 netcode 集成可能被配置为模拟网络延迟。 测试时请关闭 VPN 以获得更真实的条件,并收到一个 低延迟部署.
☑️ 一旦你确认可以无问题地连接到你的部署并完成测试, 停止你的部署 以便为你的下一个构建释放账户容量。
✅ 现在你可以进入下一步。
可在以下位置找到用于测试的 openAPI 规范 {matchmaker-url}/swagger/v1/swagger.json.
5. 游戏集成
Matchmaker 可与以下组件集成:
游戏客户端,用于 管理组、成员关系、分配和票据,
专用服务器,用于 深入了解 在玩家离开后。
☑️ 在 游戏客户端中,我们建议通过游戏内 UI 向玩家提供票据状态更新,以获得最佳玩家体验。请参阅:
虚幻引擎 开发者工具:
阅读文档 由 Betide Studios,
从 Fab Marketplace 安装 (个人使用免费),
导入简单示例蓝图 (匹配)并根据你的需要进行自定义。
☑️ 在 游戏客户端,请确保你正在处理可重试的 429 Too Many Requests 错误,并使用指数退避和重试,让匹配器在突发流量期间有时间恢复。
☑️ 在 游戏客户端,请确保你正在处理不可重试的错误:
404 Not Found- 票据已被删除,500 Internal Server Error- 临时服务中断。
☑️ 在 游戏服务器,读取玩家偏好和初始服务器上下文:
注入变量(Matchmaker) 以获取初始玩家的匹配数据。
注入变量(应用版本) 用于版本参数、设置和密钥。
注入变量(部署) 用于部署信息、IP、位置等...
一旦就绪,部署会被分配一个 URL( 服务器状态可能会丢失 注入的变量(Injected Variables) 游戏服务器通常需要额外信息,例如服务器 IP、内部端口值等。注入只读环境变量是传递参数的一种可靠且与云无关的方式。 获取变量值。
☑️ 一旦玩家连接, 游戏服务器和游戏客户端 启动加载场景——3D 场景、类似大厅的社交 UI,或带进度条的加载界面,以表明初始化正在进行。
☑️ 确保你的 部署会被停止 在比赛结束后正确执行。
🙌 恭喜,你已完成匹配集成!想了解更多,请继续阅读。
🏁 高级示例
一个完整的配置,利用所有匹配功能,包括 配置文件(队列), 规则,以及 深入了解 可能如下所示:
🥛 回填演示
可选地,某些游戏可能有特殊的匹配需求,例如:
允许新玩家加入进行中的比赛(好友或“随机玩家”),
在服务器启动后替换弃赛的玩家(离开者),以避免重启比赛,
允许观众加入并观看锦标赛或好友比赛(电子竞技),
将玩家集中到更大的服务器以提供更多社交互动(大型多人在线游戏)。
回填是一个 由服务器持有的票据,代表当前连接到服务器的玩家。 这可确保新加入的玩家在与当前玩家匹配时会遵守你的匹配规则。
深入了解 以替代 Seat/Match 会话。Matchmaker 仅支持默认会话。

回填忽略 player_count 规则,并且始终精确匹配一个组. backfill_group_size 使用轮询策略控制队伍容量,以受控方式均匀填充队伍。
完成成功回填的步骤如下:
游戏客户端创建新的票据(成员资格)并包含
backfill_group_size值:"1"如果玩家是单独进行匹配。"2"如果玩家是总共 2 人匹配组的一部分.“new”如果玩家启用了在加入进行中比赛之外也能开启新游戏。
游戏客户端继续 深入了解 并将玩家与匹配的回填配对。
如果回填的组没有完全填满队伍,服务器可以使用新回填玩家的票据重复此过程,以添加更多玩家并达到期望的队伍规模。
要创建仅回填的配置文件,请将 min_team_size 设置为 999,999 并禁用票据 + 票据匹配。
参见 镜像座位管理 和 FishNet 座位管理 用于 玩家连接监控.
⚔️ 竞技游戏
竞技游戏的重点是玩家之间相互竞争以取得胜利,无论是个人(大乱斗)还是团队。通过将技能水平相近的玩家或队伍配对,确保比赛公平和平衡,并通过快速找到公平对手来保持游戏节奏。
你可以 定义多个队伍,每个队伍 1 名或更多玩家,例如:
5v5 FPS
2
5
10
5v5 MOBA
2
5
10
20x3 大逃杀
20
3
60
10 人自由混战
1
10
10
定义多个 配置文件(队列) 用于游戏模式特定的规则和设置,并且 根据需要扩展.
对于休闲比赛:
省略段位限制,以最大化匹配速度和匹配填充率,
让玩家提供地图偏好,以找到适合所有人的地图,
指定回填组大小,以在不超过队伍大小的情况下替换离开的玩家,
移除延迟限制,以保证在 3 分钟(180 秒)排队时间后完成匹配。
对于竞技比赛:
限制段位,仅允许与自己技能水平相近的对手,
使用升段或降段段位来匹配联赛段位极端的玩家。
对于技能最高的前 1% 对局(挑战者):
使用数值化技能评级(ELO)来精细控制对局中的技能分布,
由于玩家数量较少,在放宽延迟要求前等待更久。
使用多个配置文件来 区分休闲游戏模式、竞技游戏模式以及顶级挑战者 玩家可让你为每类玩家分别定制规则和扩展。
🤝 合作游戏
合作游戏要求玩家作为团队共同朝着一个共同目标或 AI 对手协作。将偏好和游戏习惯相似的玩家进行匹配。替换离开的玩家,并提升 Ping 信标 以提供响应迅速的玩家体验。
在队伍数量为 1、每队最大人数为 4 时, 每场对局最多需要 4 名玩家.
定义多个 配置文件(队列) 适用于游戏模式的特定规则和设置:
以至少 4 名玩家开始,以保持玩家在队列中并最大化对局填充率,
限制 匹配延迟 以避免与距离过远的玩家匹配,
让玩家选择特定的游戏难度,以适合每个人的技能水平,
让玩家提供地图偏好,以找到适合所有人的地图,
限制玩家等级差异,以要求相近的游戏进度,
指定回填组大小,以在不超过服务器容量的情况下替换离开的玩家,
使用审核标记将低信誉玩家和作弊者与普通玩家区分开来,
深入了解 用于预组队伍以及在不超过服务器容量的情况下补足队伍,
使用不同的方式分配更多 CPU 或内存 应用和版本 用于其他配置文件。
从理想条件开始,然后 放宽限制 以确保快速匹配:
随着时间推移放宽延迟限制,以找到更多玩家,
增加允许的玩家等级差异,以找到更多玩家,
降低最小队伍人数要求,以减少所需玩家并更快开始游戏,
服务器可以用 AI 队友填补空位,
或 深入了解 以便稍后加入玩家,
将最小队伍人数设为 1,以在排队 150 秒后单人启动游戏
🎈 社交游戏
社交游戏侧重于通过协作、沟通和共同体验来建立玩家之间的联系和关系。支持大量玩家,最大化对局填充率,并协调玩家偏好和游戏习惯。替换离开的玩家,并确保高 Ping 信标 以提供响应迅速的玩家体验。
在队伍数量为 1(大乱斗)且每队最大人数为 50 时, 每场对局最多需要 50 名玩家.
定义 配置文件(队列) 适用于游戏模式的特定规则和设置:
限制 匹配延迟 以避免与距离过远的玩家匹配,
让玩家提供他们的游戏模式偏好,并找到适合所有人的模式,
指定回填组大小,以在不超过服务器容量的情况下替换离开的玩家,
使用审核标记将低信誉玩家和作弊者与普通玩家区分开来,
深入了解 用于预先组好的大厅,或在不超过服务器容量的情况下补足队伍,
使用不同的方式分配更多 CPU 或内存 应用和版本 用于其他配置文件。
从理想条件开始,然后 放宽限制 以确保快速匹配:
随着时间推移放宽延迟限制,以找到更多玩家,
逐步降低最小队伍人数要求,以减少所需玩家并更快开始游戏,
服务器可以用 AI 玩家填补空位,
或 深入了解 以便稍后加入玩家,
将最小队伍人数设为 1,以在排队 150 秒后单人启动游戏。
最后更新于
这有帮助吗?

