导语 |近日,云+社区开发者大会(苏州站)圆满落幕。本次开发者邀请了腾讯内部及业内行业大咖就物联网、小程序、微服务等当前互联网领域的热点技术的落地实践问题进行了深度探讨。本文是林洁文老师的分享,关于如何利用小游戏联机对战引擎快速构建一款联机游戏,为游戏提供房间管理、在线匹配、帧同步、状态同步等网络通信服务,帮助开发者快速搭建多人交互游戏。
本文概要:
联机游戏开发新模式
游戏联机对战引擎介绍
快速构建联机游戏
案例分享
一、联机游戏开发新模式
什么是联机游戏?一个概念是联机游戏是通过一部分或者大部分都是通过户互联网或者其他电脑网络进行的游戏,通常有两种,一种是终端的直联,还有服务器的中转,其实终端直联也是选一个终端做服务器对数据进行中转,按平台分为PC/网页/手游/小游戏,还有主游戏常见玩法有多人游戏比如说现在很很多FPS、 moba、还有休闲的IO类游戏,还有回合制多人游戏多个玩家轮流发出指令如棋牌策略,还有大型多人游戏,现在市场上游戏很多联机游戏也很多,如moba类,《王者荣耀》还有吃鸡类的游戏,所以市场上是百花争艳的,老板要求你做一个联机游戏,你要怎么做呢?
首先对这些功能需求进行分解,然后进行设计开发。第一步要让游戏可以玩起来,要解决两个问题,游戏怎么玩?还有解决数据问题数据同步,还有要把玩家组织进行游戏,要做一些房间管理模块,在线匹配的功能,随着需求的丰富,要有一些通讯,或者登录的需求,我们就要做一些聊天系统,大厅服等,整个游戏上线后慢慢再扩大,要对这些系统进行维护和运营,要构建一些监控系统,数据系统,随着慢慢往后走可能有其他需求支撑游戏场景。
下面是一些运营支撑类需要做的事情,初期的话有游戏设计出来,开发出来要怎么跑起来?咱们就需要服务器、需要网络,还有数据库,第二阶段为了更灵活管理游戏,还有一些稳定性的考虑,有一些接入网关,还有调度路由;第三个要有一些系统要做比如说扩缩容的来支持运营部署,到后期可能成本有点高要考虑成本优化,有没有跟监控联动起来等等。
所以完全构建联机游戏后方系统是有很多工作去做,那么这些工作需要多少人力?多少时间?包括多少经费来做这些事情呢? 大概需要三个以上经验,比较资深的工程师,花费大概有1000+进行研发才能把这一套系统做好,除此以外,系统上线以后还至少 需要 一1名研发人员和一名运维工程师持续维护。这样大家可以想象,包括你的老板可以根据自己公司的情况来估算,这么多人用这么多时间进行研发,还有这么多长期投入的成本,这需要花多少钱?
所以我们一直在思考, 能不能为开发者节省一些成本, 去帮助开发者更快速完成游戏的研发, 去帮开发者减少各种烦锁的运维事情, 让联机游戏的研发更简单。于是, 我们推出了小游戏联机对战引擎解决方案, 把联机游戏的后端 的通用能力以服务的方式提供给开发者,开发者只要直接使用就可以了。
二、游戏联机对战引擎介绍
通过对战引擎将给联机对战后端的研发带来一个新的开发模式。可以看到上面的图,左边是刚才有介绍在旧的模式下需要做的很大一堆的事情,在新模式下就变得只有几个框框,当然在新的模式下,游戏玩法设计,还有游戏业务代码开发,还是需要开发者自己完成,这个谁都帮助不了,除此以外开发者都可以通过使用我们SDK,调用一些简单的API可以实现左边灰色部分的能力,通过云开发能力可以很简单实现登录、存档等大厅服的能力。甚至有一些功能我们不需要写一行代码,只需要写一些简单配置,在控制台提交生效就可以实现一些后端能力,,还有可以通过dashboard看一些日志、监控与运营数据, 如DAU、CCU等。
接下来我们介绍一下游戏联机引擎,游戏联机引擎是基于云原生技术 构建的,支持wss 、TCP 、可靠UDP,为什么第一个是wss,因为小游戏今年比较火,在很多小游戏平台,包括微信也好,一开始是不支持其他协议,必须要通过wss,所以我们对这个做了支持。
第三个可靠的udp,我知道tcp的可靠性比较好,但是本身的协议特点可能会导致游戏卡顿、不顺畅,所以我们以对可靠的udp的支持来解决这个问题。使用protocl buffer协议编解码, 多地域部署,给开发者提供了房间管理,在线匹配,消息发送,数据同步等等游戏后端的一些能力,还有开发者看不到的一些后端自动化行为的能力。
但是刚才所说的这些,其实开发者是不需感知,我们提供给开发者两个,两套SDK,一个是客户端SDK,还有服务框架的SDK,刚才说到可能不需要怎么关心后端开发,但为什么又说有一个服务框架的SDK,因为我们知道数据同步有两种,一种是帧同步,游戏是在客户端进行,正常来说不需要服务器,状态同步不一样,状态同步它的计算逻辑都是在后端游戏服务器,所以它需要把游戏的服务器,所以引入服务器框架的SDK,帮助开发者更加简便的把游戏服务端开发出来。开发者只需要同步SDK,用几个简单的API就可以拥有后面灰掉的这些能力,所以不需要为这些能力去做太多的工作,真正帮助开发者把这些时间放在游戏设计和游戏开发上。
这是引擎的业务架构,咱们可以看到后端第一点,是一个高防服务,我们给每个游戏都会提供一个基本的防护保障,匹配服务负责在线匹配的计算、规则管理等等,房间服务提供了创房、加房、退房、踢人、信息更新、房间属性管理等API。
大厅服通过云开发, 让开发者很简便的使用云函数、云存储、云数据库和ai等能力, 轻松实现登录 、排行、存档、游戏逻辑计算等等需求。
自定义服务逻辑集群是用来部署和管理战斗服, 基于k8s进行集群管理。但由于原生 的k8s不支持有状态的调度, 我们自研了一套基于有状态的调度、部署、运维管理系统。
同时我们整个也有考虑到开发者,可能在云上有一些业务系统,或者有一些后端能力,我们提供一个通道,可以让开发者访问到他自己的一个服务能力和云资源,只需要在我们的控制台把VPC跟我们游戏进行绑定就可以。
在线匹配,我们把整个匹配过程设计为一个API部分,还有配置部分,配置部分可能是研发不需要怎么关心,对策划也是非常好用的工具,在线匹配支持自定义的配置化,开发者可以在配置页面下根据自己需求去做各种配置,然后保存即可,支持多数匹配,还有重权,还有机器人匹配,为什么做机器人匹配?有两个场景,游戏新上线没有推广,或者是先试一下看看数据,刚上线玩家量级比较小,所以要分配一个机器人。
第二个在游戏策划合理的某个阶段,革些等级,配置的可能不太合理,在这种情况下也会经常出现不平衡,所以这个情况即使出现也是可以以机器 人来解决问题,所以看上面匹配的配置。
这主要有三部分,第一个队伍节点,队伍节点可以配置,这是一个节点里面有一个队伍,然后一个队伍里面有多少个玩家,然后第二个玩家属性的节定,玩家属性节点,是把配置他关心的维度,这里是可以配置多个,所以我们这里只配了一个。第三个是规则节点,规则节点是告诉匹配规则,匹配服务是怎么针对游戏进行匹配计算,这个整个下来的意思是这个游戏,一个里面有两个队伍,每个队伍有五个玩家,然后是根据玩家的等级来进行匹配,匹配算法通过分段式匹配,一些玩家的等级 坐落在某个区间里面就可以进行匹配成功。
帧同步,帧同步是采用非锁帧的方式,因为相比传统的锁帧方式,非锁帧会给整个游戏带来好的体验,可以看上面这个图,看红线部分,红线看得清楚吗?红线玩家A在往帧同步的时候可能是因为网络,本身他在帧同步的时候到帧同步服务器,但是到帧时间才到,如果是采用传统的可以看这上面两个线,上面有两个黑线,往两个客户端发送,这时候导致玩家受到影响,他的帧数据要等很久才到游戏客户端上,但是采取非锁帧方式,每个帧服务以每一个固定周期都往客户端发,这时候就不需要等,所以这种情况下玩家操作以后等一下动,过一会儿动,但是对玩家是很顺畅,如果这个游戏有更多玩家,玩家是完全感知不到任何卡顿不流畅的地方。
还有随机数的问题,我们知道不管是单机游戏还是联机游戏,这里面也一些技能打出多少伤害、或者爆击、或者捡道具都会使用到这样一个随机数计算,但是因为我们知道帧同步是在客户端进行计算,客户端各种各样,虽然安装是同一个客户端包,但是系统不一样,比如说安卓平台可能都是安卓系统,可能是华为、可能是小米,可能是oppo,所以里面API各方面会也所不同,通过帧数据带随机种子到客户端,所以按照相同的随机数算法可以算一个相同的随机数出来,从而保证在各端游戏数值的一致性。
还有第三是支持补帧,补帧场景,在当游戏玩家掉线,或者退出掉线的时候,这部分就要进行补帧操作,可能在PC游戏或者是网页游戏可能会少一些,手机游戏可能会相对多一些,但是小游戏场景可能会比较多,因为小游戏是里面再开出的一个进程,你在玩游戏的时候突然一个信息出来,一切换到看信息,这个程序的运行的权利被拿走,网络就断了,后台感知这个断线的情况,所以切出去再切回来的时候客户端有感应就要采取补帧,快速回到当前的游戏状态。
支持自定义帧的设计,所以方便网络开发者去设定自己的帧率,或者在某个运行情况下,有的情况我们也知道,有的时候不太清楚这些游戏可能帧率是多少,所以需要跑一段时间有一个反馈,所以通过这个配置就很方便。
接下来我们来介绍一下状态同步的流程,这个图大家看得清楚吗?有点小。我们先从右边开始看吧,其实状态同步在我们状态系统里面主要就是一个实时服务器这一方面,因为实时服务器部署和管理游戏服务的先看创建房间,在创建房间的时候实时服务器就会收到一个创建房间的一个请求回调,开发者可以在这里面处理的代码就可以,比如说一般创建房间会拉一些创建的信息,如果是一个级别创建玩家,在这里不仅仅拉一些游戏信息,还有各个玩家信息拉出来放到内存里面做准备。
还有在创建房间就需要触发一个Createroom这个API,这时候是还没有形成,但是调用这onCreateroom就是成功的,还有后面也是一样,修改房间信息或者自定义数据的改变会推送到实时服务器里面,开发者都需要在自己游戏服务器的代码里面往框架里面提供对应的行数里面填上自己的业务代码,倒数第二是网络状态也是很重要的事件推送,刚才说了在小游戏场景这是很频繁的触发,这可能是说有的游戏情况下,玩家掉线会把它标记起来,或者玩家掉线以后标记其他会有一个定服器,如果过二三十秒以后玩家没有进来就自动踢出去,其他玩家可以进来了。
我们介绍一下实时服务器集群,这个实时服务器集群,是有一个有状态调度管理的,开发者可以根据自己关心的一些系统或者业务者指标,比如说通常来说比较常用的是用对局数,房间数来进行调度,还有为了更好的游戏的体验,我们也提供了一些不停更新的能力,还有多地调度的模式,系统也支持一个弹性的扩缩容,这个在有状态情况下比较复杂,但是它确实解决两大问题,第一个是成本的问题,我们先不说游戏,可能整个互联网用户形成了习惯,应该是一天有三到四个波风的体现,其他都是平的,游戏用户也不例外,如果取中间值提供服务器资源,那用户卡顿,或者是各种玩不了,那高峰期的话会造成大量资源浪费,所以有的团队专门雇几个人人为去运维。
第二是一对一些运营活动,比如说在有一些渠道买广告推动的时候,流量方面也需要找一些人去做准备做扩容,但是有的弹性扩缩容这些都不需要操心,流量什么时候想来就来,想走就走,我们根据开发者设置的合理值调度提供资源上的使用。
流程图大概说一下,开发者在开发完游戏图之后,会把它上传,上传到游戏里面,然后会根据服务去注册服务,然后会定时上游戏的状态数据,看左手边看玩家,客户端发起匹配服务,进行匹配并且成功会到这个服务器去请求战斗服务,就是游戏服务器来进行游戏,这个时候布局模块会把这个游戏都拉扯出来,会进行适合的指标进行游戏,到我们的客户端,会开始一些游戏的战斗,但是要退出的时候游戏服务会向调度中心去做注销服务的上报,这个服务器会放销毁队列里面,因为我们知道游戏服务器有状态没有办法销毁,也是取决于游戏的策略,像《王者荣耀》这种实力相当差不多二十分钟,甚至四十分钟也有,什么时候结束也不知道,所以会放在销毁队里面,还有会检测这个点,检测什么结果?这个服务器上状态数据认为是空的状态才会把它消掉,同时扩缩容服务也周期也会扫描整个集群状态,如果发现整个集群低负载就会把它进行回收。
三、快速构建联机游戏
接下来我们分享一下怎么快速构建一个联机游戏。先看一些这里主要分享数据同步的流程,首先这是帧同步的例子,一个API就可以完成匹配,当然前面也说要匹配配置规则,三个API可以实现帧同步,上面有代码片段,是匹配API的,就是这个API只需要传入为玩家信息,玩家信息里面要带匹配的属性,匹配属性就要对应刚才前面所讲的匹配规则的例子,里面配置的有几个维度,多少点,这里要配多少点,其次这里有一个code,要告诉使用规则进行匹配,就会根据code找到最匹配的规则,接下来就开始怎么解决这个API,这是第二步sonsole有了就可以对帧同步发射器还有对数据终端进行同步。那它要做什么?就是要监控帧广播,调onrecvframe这个API,还有更新状态,这个我们没有深入太多,要根据不同游戏有不同逻辑,有的要直接计算,有的复杂游戏,还要等一会儿要再维护一个点,我说的话根据我所说的这些进行数据计算然后进行渲染。
这是一个状态同步的例子,需要4个API就可以实现。为什么是4个?比帧同步多了一个?因为跟帧同步不一样, 它有一个服务端的部分,匹配这个刚才介绍了就不说了,它也是调用一个sendToGamesvr,进行广播,再进行更新,因为它是在服务器进行计算的, 所以客户端进行渲染就可以,还有服务器首先监听然后再更新状态。
配置匹配规则、上传GS代码,还有配置客户端SDK,然后就可以开始游戏,这是到SDK里面的,还有上传包,通过这里进行上传,这里选择不停服更新也可以停服更新,完成以后有一个运行状态可以进行察看,在这里可以察看清楚服务器的信息和游戏日志。
在这里可以看一些简单的应用数据,比如说房间数,统计在线数,每天的一个日活。
四、案例分享
下面我们来看一个案例,这是一个射击类的游戏,在各个平台数据比较好,找我们后就可以快速游戏上线了,因为它完全不需要后端,把它弄到联机里面去,前端的开发,节省后端人力3名,对战逻辑由1名前端开发搞定,接口简单,在开发上面节省了50%。
作者介绍
讲师介绍:林洁文,腾讯云专家工程师。2010年加入腾讯, 参与过QQ服装店的前后台研发工作, 主导QQ情侣的前期研发, 曾在创业公司负责过游戏、社区及电商后台的研发管理, 16年加入腾讯云后负责过开发者服务、高防的研发, 现在负责泛互游戏行业的游戏服务引擎的研发管理。
好文推荐
(点击图片即可跳转)
同程艺龙小程序性能监控系统的探索与实践
关注云加社区,回复 加群 加读者群
点在看,与朋友联机