比賽組成概觀
當您將票證提交至佇列時,配對服務會將其與其他等候中的票證放在一起。服務會持續執行配對迴圈,嘗試將相容的票證組成比賽。以下是每個步驟發生的情況:- 移除過期的票證。 超過其
GiveUpAfterSeconds逾時的票證會被取消。 - 依等候時間排序票證: 等候最久的票證會成為可能比賽的種子,也就是起點。
- 依相容性為候選票證排名: 其餘每張票證都會根據佇列的規則,依其屬性與種子票證的吻合程度獲得距離分數。
- 以貪婪方式建立群組: 從最接近的候選票證開始,一次將一張票證加入群組,最多達到
MaxMatchSize。 - 驗證每次新增: 新增票證時,每個規則都會檢查候選票證是否仍與目前的群組相容。如果有任何規則拒絕,就會略過該候選票證。
- 驗證完整的群組: 一旦群組達到至少
MinMatchSize,最後的驗證階段會確認群組符合所有規則。如果通過,就會建立比賽。 - 回溯: 如果無法組成有效的群組,服務會移除最後新增的票證,並嘗試下一個候選票證。此程序會在放棄目前的種子之前探索其他的分組方式。
此演算法會優先處理等候最久的票證。此優先順序可確保等候最久的玩家最先獲得比賽。
規則如何影響配對
在比賽組成期間,規則有兩個用途:篩選和排序。篩選
規則可以阻止票證加入群組。例如,針對遊戲組建版本的StringEqualityRule 會拒絕任何組建與群組組建不符的票證。配對服務每次考慮候選票證時都會檢查篩選條件,而不只是在開始時檢查一次。
排序 (距離)
規則也會提供距離分數,決定先嘗試哪些候選票證。距離越低表示相容性越高。- 屬性值完全相同的票證,距離分數通常為 0。
- 位於規則允許範圍邊緣的票證,距離分數接近 1。
- 超出允許範圍的票證會被篩除 (實際上為無限距離)。
驗證
有些限制只能在組成完整群組後才能檢查。例如,隊伍平衡規則 (TeamDifferenceRule、TeamSizeBalanceRule) 需要看到完整的群組,才能評估隊伍是否平衡。這些規則會作為最後的驗證步驟執行。
擴充與放寬
當票證等候時,規則會放寬其限制以擴大搜尋範圍。有兩種機制可控制此程序:- 擴充:規則會隨時間逐步調整其閾值。例如,技能閾值為 0.2 的
DifferenceRule可能每 5 秒擴充 0.1,最終允許 0.5 的差異。 - 變成選用前的秒數:經過設定的時間後,規則會完全停止篩選。規則仍會參與排序 (距離),但不再阻止比賽。
放寬並不表示忽略比賽品質。即使規則變成選用,它仍會在排序步驟中提供距離。符合規則的候選票證會比不符合的候選票證先被嘗試。
調整規模與分割
當佇列收到大量票證時,服務會將票證分割成可獨立評估的群組。分割會使用自然區分群體的規則屬性。例如,針對遊戲模式的StringEqualityRule 會建立清楚的分割界限。
隨著負載降低,分割區會重新合併。此程序可讓服務擁有更大的候選票證池,並改善比賽品質。
如需設計能良好調整規模之佇列的詳細資訊,請參閱配對規模調整。
