OpenMatch学习
  KVuvef86CScd 2023年11月02日 87 0

文档:

​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,并帮其申请匹配。


匹配序列图

OpenMatch学习_Cloud Native

Game Frontend

  • 创建票据并向OpenMatch申请匹配
  • 等待分配Assignment

Director

  • 请求OpenMatch从指定池的Ticket生成Match
  • 为返回的Match中的Ticket指定Assignment


服务架构

OpenMatch学习_游戏_02

核心服务


  • 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执行的提案被丢弃(错过了评估窗口)。


代码流程序列图

OpenMatch学习_Cloud Native_03


OpenMatch学习_匹配_04


说明:

  1. 发起点总共有两个:Game Frontend和Director,Game Frontend用于玩家请求参与匹配,Director用于促发生成匹配结果
  2. GetAssignment只有在UpdateAssignments后才能返回




【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论