文档: Open MatchDocumentation | Open Match (open-match.dev) 代码: googleforgames/open-match:Flexible, extensible, and scalable video game matchmaking. (github.com) 指导 概念 Ticket 配对实体,代表参与匹配的玩家。 Assignment 游戏服务器到Ticket的映射,可以是分配的游戏服地址,也可以是虚拟竞赛ID。 Match 配对后Ticket的集合以及一些元素据。 定制组件 Match Function(MMF) 核心匹配逻辑,需要开发者根据需求定制,并作为服务公开给OpenMatch。OpenMatch调用它来生成Match列表。它以Ticket列表为输入,并返回任意数量的Match。 Director 向OpenMatch请求生成Match,然后生成Assignment并向OpenMatch请求绑定到Match。 Game Frontend 为玩家向OpenMatch请求生成Ticket,并帮其申请匹配。 匹配序列图 Game Frontend 创建票据并向OpenMatch申请匹配 等待分配Assignment Director 请求OpenMatch从指定池的Ticket生成Match 为返回的Match中的Ticket指定Assignment 服务架构 核心服务 Frontend 提供接口供Game Frontend调用,用来创建、删除Ticket等,Ticket绑定Assignment后返回给Game Frontend. Backend 提供接口供Director调用,用来创建Matches,绑定Assignment到Match的所有Ticket,绑定成功后Fronent即可返回。 Query 允许从Ticket池中查询符合条件的Ticket(当前可参与匹配的Ticket) 定制组件 Match Function(MMF) 核心匹配逻辑,需要开发者根据需求定制,并作为服务公开给OpenMatch。OpenMatch调用它来生成Match列表。它以Ticket列表为输入,并返回任意数量的Match。 Evaluator 允许OpenMatch并发执行匹配,并保证不会有重叠的Ticket出现在生成的Match中。 去重 因为匹配请求池中的Ticket可能重叠,且需要并发执行匹配函数,所以我们需要对结果进行去重,以此来保证结果不会出现Ticket在不同Match中。 Evaluator 为了允许使用重叠的票证生成提案,但仍为Director提供唯一性的匹配,我们需要解决提案的冲突。为了实现这一点,Open Match有一个Evaluator组件,它接受所有并发的匹配提案,评估它们是否存在冲突,并将不重叠的结果返回给Open Match。如果存在多个重叠匹配,Evaluator将评估它们的质量,提升最高质量的匹配为结果,并丢弃其他匹配。Evaluator的主要职责是确保返回的结果匹配中没有重叠的票证。 Synchronizer(单点) 多个并发执行的MatchFunction为了MatchProfile同时从Open Match获取票证。因此,多个MatchFunction可以看到相同的活动票证池(导致冲突)。虽然Evaluator处理消除重叠结果的冲突,但存在竞争条件。当Evaluator评估匹配提案时,如果允许执行MatchFunction,则MatchFunction可能会获取已升级为结果的票证。因此,在评估现有结果时,需要停止执行MatchFunction。这叫做同步。 Synchronzier的关键作用是保证并发MatchFunction生成的提案一起评估。此外Synchronzier需要在评估结果时停止执行MatchFunction。Open Match无法控制MatchFunction的执行时间,但是必须确保其结果与其它并行执行的MatchFunction结果一起评估,如果错过了评估时间将被丢弃。Open Match的Synchronizer为单点组件,且具有以下状态: Idle State 当没有正在执行的匹配功能时,同步器处于Idle State。 Registration Backend为每个FetchMatch请求调用MatchFunction之前向Synchronzier注册,Synchronzier在首次FetchMatch注册时进入Registration窗口(窗口时间可配置),在此窗口期注册的所有MatchFunction将一起评估。 ProposalCollection Registration窗口结束后,Synchronizer会提供一段时间来供注册函数返回,这称为ProposalCollection窗口。这样,即使是最后一次注册的FetchMatch请求也有机会在评估之前生成提案。 Evaluation 在此期间,所有注册的MatchFunction生成的所有提案都将发送给Evaluator进行评估。同步主要通过两种行为实现: 尝试在ProposalCollection或Evaluation窗口注册的任何新MatchFunction都将被阻止,直到评估完成并再次打开注册。 在ProposalCollection窗口后返回的来自MatchFunction执行的提案被丢弃(错过了评估窗口)。 代码流程序列图 说明: 发起点总共有两个:Game Frontend和Director,Game Frontend用于玩家请求参与匹配,Director用于促发生成匹配结果 GetAssignment只有在UpdateAssignments后才能返回