对局形成概览
当你向队列提交工单时,匹配服务会将其与其他等待的工单放在一起。服务会持续运行一个匹配循环,尝试将兼容的工单组合到对局中。以下是每一步中发生的情况:- 移除过期工单。 超过其
GiveUpAfterSeconds超时的工单将被取消。 - 按等待时间对工单排序:等待时间最长的工单将成为潜在对局的种子或起点。
- 候选者按兼容性排名:每张剩余工单根据队列规则,根据其属性与种子工单的匹配程度获得一个距离得分。
- **贪婪地构建一组:**从最接近的候选者开始,每次一张地将工单添加到组中,直到达到
MaxMatchSize。 - **每次添加均经验证:**添加工单时,每条规则都会检查该候选者是否仍与当前组兼容。如果任何规则拒绝,则跳过该候选者。
- **完整组经验证:**当组达到至少
MinMatchSize时,最终验证阶段会确认该组满足所有规则。如果通过,则创建对局。 - **回溯:**如果无法形成有效的组,服务会移除最后添加的工单,并尝试下一个候选者。此过程会在放弃当前种子之前探索其他分组方式。
该算法优先处理等待时间最长的工单。此优先级确保等待时间最长的玩家最先获得对局。
规则如何影响匹配
规则在对局形成过程中有两个用途:过滤和排序。过滤
规则可以阻止工单加入某个组。例如,应用于游戏 build 版本的StringEqualityRule 会拒绝任何 build 与该组的 build 不匹配的工单。匹配服务在每次考虑候选者时都会检查过滤,而不仅是开始时的一次性检查。
排序(距离)
规则还会贡献一个距离得分,决定哪些候选者先被尝试。距离越小,兼容性越高。- 属性值完全相同的工单通常得到距离 0。
- 处于规则允许范围边缘的工单得到距离接近 1。
- 超出允许范围的工单会被过滤掉(实际上距离为无穷大)。
验证
某些约束只能在完整组形成之后才能检查。例如,团队平衡规则(TeamDifferenceRule、TeamSizeBalanceRule)需要看到完整的组才能评估团队是否平衡。这些规则作为最终验证步骤运行。
扩展与放宽
当工单等待时,规则会放宽其约束以扩大搜索范围。有两种机制控制此过程:- 扩展:规则会随时间逐步调整其阈值。例如,技能阈值为 0.2 的
DifferenceRule可能每 5 秒扩展 0.1,最终允许 0.5 的差距。 - Seconds until optional:在配置的时长之后,规则完全停止过滤。规则仍然对排序(距离)有贡献,但不再阻止对局。
放宽并不意味着忽视对局质量。即使规则变得可选,它仍会对排序步骤贡献距离。满足规则的候选者仍会优先于不满足的候选者被尝试。
扩容与分区
当队列接收到大量工单时,服务会将工单分区为多个独立评估的组。分区使用能自然将人群分割的规则属性。例如,应用于游戏模式的StringEqualityRule 可创建清晰的分区边界。
随着负载降低,分区会重新合并。此过程为服务提供更大的候选池并提高对局质量。
有关设计可良好扩展的队列的更多详细信息,请参阅匹配扩容。
