8月17日,“小程序·云开发”系列沙龙(小游戏专场)圆满落幕。本期沙龙腾讯云开发者社区携手微信 & 云开发官方团队为大家揭秘爆款微信小游戏背后的技术,全面讲解小程序·云开发、实时数据库库及小游戏联机对战引擎,助力小游戏开发。下面是张小华老师针对如何快速的构建联机对战类小游戏,调用几个API接口即实现房间管理、在线匹配、帧同步、状态同步、实时游戏server等游戏组件,快速搭建属于自己的对战服的分享。
讲师介绍:张小华,腾讯云资深产品经理。耕耘游戏行业,致力于帮助中小开发者快速构建、开发游戏,降低游戏试错成本。先后负责过游戏语音、游戏更新、游戏存储、游戏测试等产品的策划和运营。目前负责小游戏联机对战引擎的产品策划。
现在特别多的是单机小游戏,有的是从国外抄过来的,本来是联机游戏都把它做成单机游戏。联机小游戏不是特别多,因为小游戏的开发周期特别短,可能一两个星期就上线了,做联机游戏花的成本特别多,大部分开发者不愿意花这个成本去做一款联机游戏。本次分享将针对联机游戏等一系列的组件来帮助开发者在几分钟之内就把单机游戏变成联机游戏。
联机游戏种类
回合制多人游戏,比如说常见的棋牌游戏,打麻将、斗地主等,还有一些 ARPG的游戏。
实时多人游戏,这两年比较火的吃鸡游戏就是实时多人游戏,还有《王者荣耀》、MOBA、休闲对战,像《全球大作战》、《贪吃蛇》,《贪吃蛇》最开始流行起来的是单机游戏,后面也做了联机游戏。
大型多人在线游戏,这个游戏在一个持续的空间里玩的,比如说《天龙八部》、《御龙在天》,这种国战类的游戏,在小游戏上面出现的可能性比较低,主要是手游。
社交游戏,这在小游戏上面出现的就比较多了,像《海盗来了》、《猪来了》,很多年前流行的偷菜,这些都属于社交类的小游戏。
开发联机对战游戏的痛点
这些联机游戏有什么特征呢?或者有什么技术难点呢?
第一,先把玩家组织起来,因为它是联机游戏,你要在互联网上找到一个跟你一起玩的人,相当于是要有某一种组织把互联网上的人组织在一起,我们把这个组织就称为“房间”,你邀请一个好友进来,是一个房间,你可以在网上匹配一个陌生人,匹配好了也加入到一个房间,这个组织叫房间。
它有什么难处呢?做房间管理比较简单,做在线匹配,你发现当有很多人发起匹配请求的时候,一台服务器根本撑不住,你要扩容多台服务器,另外一台服务器和这台服务器是分开的,不是放在一起的。所以你想要多大容量的服务器才能做到全区全服,这是一个技术难点。另外一个很多游戏在上线初期都会遇到困难,上线初期的玩家特别少,半天都匹配不到人,这时候玩家就没有兴趣了,可能流失了。
第二,玩家和玩家之间要进行网络通信,这就涉及到很多问题,网络通信是TCP协议,还是UDP协议,亦或者是长连接,代码写起来很容易,但怎么保证这些链接是稳定的、快速的,需要采用什么技术呢?就近接入,还是有一些技术实现加速。像花叔讲到的,开发者花了半年去开发一款联机游戏,结果发现还很卡,联机游戏网络波动、抖动的时候如何让游戏呈现出平滑的效果,这里面的技术很有难度。
第三,部署和运维,对战类的游戏,尤其是房间类的游戏,它是有状态的。比如4个人加入到这个房间,这4个人会同时到一台服务器上战斗,不能分布在多台服务器战斗,如果分布在多台服务器战斗,可能会连接数据库,连接数据库的效率就不高。尤其是当很多人频繁操作数据库的时候,数据库的性能可能会出现异常。我并不知道大家是怎么做小游戏的,在移动游戏和端游的时代,整个战斗都是在同一台服务器上进行的,而且是在内存中运行计算的的,这样可以更高效的保证速度。那么这样有状态的服务给运维增加了非常多的困难。云的弹性扩缩容也好,还是负载均衡CLB也好,在这种对战场景下统统失效了,需要重新考虑如何进行有状态的扩缩容,去负载均衡。
我们的解决方案
对战类游戏并不是很好做,是很困难的,我们做的是把联机游戏涉及到的组件都抽象出来,开发者只需要调用几个接口就可以实现了。比如调用帧同步,帧同步的技术很复杂,但是开发者只需要调四个接口:开始帧同步、结束帧同步、发送帧消息、收帧消息。
状态同步,前端接口是发起状态同步请求,在服务端计算,服务端是自己的计算逻辑,像房间和匹配都是调一个接口就可以了。房间管理,你邀请好友进入到房间,也可以是在线匹配,支持1V1和多V多的匹配。
邀请加入房间,除了邀请好友,还有一个是在线匹配,你自己在线匹配要很长一段时间,但是通过我们这个组件,如果你是随机匹配的话,不需要配置任何东西,直接调用一个接口就可以随机匹配了,匹配了我们就把结果反馈给你。如果你想有一些更灵活的表现,就可以通过我们的模版进行配置。
第一,1V1的场景,一个人和另一个人对战,模版非常简单,你配房间的人数,配一个人,队伍的个数是两个,两个队伍,每个队伍里面最大人数和最小人数相等,两个队,每个队一个人,弄这样的模版就可以给你匹配1V1了。
当然你可能有更多的要求,通常游戏不可能都随机匹配,因为有的人的技能特别好,有的人很差,不可能把很差的人和很强的人匹配在一起,那很强的人觉得自己好衰。在匹配的时候会有一些算法,你可以自己进行匹配。像我这边的分段算法,我把什么等级的人放在一起来匹配,等级1到等级3的匹配在一起,等级4到等级10的匹配在一起,这都是自己配的,我只是举这样一个例子。任何可以转化成数字的东西都可以分段。
1、误差算法,《王者荣耀》匹配5V5,有时候邀请好友,两个人本来实力就很悬殊,这时候就不是分段算法了,而是用误差,比如说平均值,A队和B队等级相差,或者技能相差不超过2
2,通过误差算法进行配置。我配了两个属性,通过下面的规则,匹配的两个队的平均技能相差不大于2。这是一个相对强大的匹配功能,基本常用逻辑都可以通过这个匹配来实现。我们支持好友组队,现在一个人匹配陌生人,没办法和好友一起玩,你和好友组是对的,然后再与互联网上的陌生人进行匹配。
因为游戏刚开始玩家很少,匹配不到人,我们支持匹配机器人,机器人的行为是你自己定义的,但是我们可以给你匹配到机器人,在游戏初期是很有用的。
很多开发者有疑问,房间管理也好,在线匹配也好,都是调用的API。如果我有自己的逻辑,要写一些特殊的逻辑,怎么办?我们有一个房间的扩展,你每调用房间里的API,包括在线匹配,每调用一个API,我们都会触发自定义逻辑的脚本,你可以在这个脚本里面写自己的代码,现在支持nodeJS。因为小游戏大部分的前台都用JS写的,后台是支持nodeJS。这样的话,一个技术栈就可以完成前后端的能力。包括掉线,有一些玩家掉线了怎么处理,这时候都可以到自定义服务逻辑中去写,玩家掉线了,你让他立刻失败,还是把他剔除房间,这都可以在房间扩展里面去写自己的一些特殊逻辑。
刚才讲的是怎么把玩家组织起来,玩家和玩家之间怎么进行网络通信。这里有三种模式:
一、客户端直接发消息到另外一个客户端,这是最简单的模式,你想什么时候发就什么时候发,按需发。
二、帧同步,在互联网行业用的并不是很多,帧同步是《王者荣耀》带火的。
三、状态同步。
帧同步
我讲一下帧同步的原理,每个客户端都实时的把自己的操作指令,把动画也好。《王者荣耀》大家都玩过,不停的打,不停的打,客户端把你的动作指令发布给后端,每一个同步都发布到后端,但是后端不会立刻转给其他的客户端,而是按照一定的频率把所有客户端转给他的消息再同步给各个客户端,每一个客户端就有其他客户端的逻辑。所以这时候他开发起来像单机游戏一样,服务端会有一定的渲染,如果你实时的同步,客户端就会不停的在渲染。像这种定时的客户端,客户端渲染的频率也是固定的,不会很乱。我个人觉得原理简单,但是大家未必觉得原理简单,这样的话,它的开发效率很高。
帧同步的要求很高,网络卡顿的话,游戏肯定会卡顿,所以在网络上要做很多的优化。因为它的所有逻辑都在客户端,防外挂能力比较弱,容易出现外挂,断线重回的时间很长。因为它的帧同步是渲染,如果渲染断线了,会从第一帧渲到当前。如果之前游戏玩了5分钟,重新渲染也可能要5分钟,这是帧同步的缺点。因为客户端的服务器,不管是你的手机也好,你的电脑也好,里面有一个东西,叫浮点数,各个电脑产生的浮点数都是不一样的。这时候按照浮点数渲染出来的结果会导致各个客户端不一样。
在帧同步做了一些处理,如何保证网络在抖动的时候更平滑,如何断线重回时间长,怎么把断线的时间缩短,怎么做时间片段,我们做了一个后端的实时服务器,每一个帧同步的数据会同步到实时服务器,它会校验有没有外挂。现在小游戏开发者不是很关心有没有外挂,只要有流量就可以,移动游戏和PC游戏是很注重这个的。帧同步是很复杂的技术,调用我们的接口,只需要4个接口,开始帧同步、结束帧同步、发送帧的消息、接收帧的消息。
帧同步用的游戏很小,主要是小战场实时的游戏,大部分游戏用的是状态同步,状态同步的防外挂能力很强,它能胜任大事件、大战场,像吃鸡类游戏,它用的就是状态同步,断线重回的时间很短,因为每一次都保存的是一个状态,网络环境相对轻松,不像帧同步。这是状态同步的缺点,开发效率相对慢一些,因为你要在服务端写一遍,可能跟客户端差不多的逻辑。
状态同步
帧同步,服务器只是做定时转发,所有的渲染都是在客户端进行的。状态同步,客户端只发一个指令,所有的计算。比如说现在是一个棋牌游戏,我出了一张牌,这局到底有没有结束,他出了一张牌,剩下的是什么牌,他有没有赢,这就不是在客户端判断了,如果他在客户端判断,外挂想怎么写就怎么写。所以这时候你要在服务端计算,服务端能更准确的计算你是不是出了那张牌,你到底有没有赢,游戏有没有结束,它算好了之后把状态同步给客户端。
状态同步与帧同步不一样,它是对战的组件,在部署方面,现在通用的弹性伸缩都不适用了,一定是在同一个房间,同一台机器上操作的,断线之后还会重新回到这台服务器。所以它的部署是非常复杂的。
实时服务器
我们的实时服务器来自于状态同步,它需要开发者做什么?需要把所有的对战服包好了,状态同步只需要把我们的框架下载下来,在里面填自己的计算逻辑,上传上来发布就可以了。
他们刚才在问长连接的问题,我一直在那里计算,计算怎么办?我们支持长连接的,这是UDP协议的,你可以一直连到服务端,然后去计算,当你已经计算完了,已经结束的时候,这时候才去回收资源,这也非常节约资源。
小游戏联机对战引擎的东西不多,在线管理、房间管理,帧同步、状态同步,组件不多,但是每一个组件都非常有技术含量。小游戏联机对战引擎的优点:快速接入,如果用帧同步或者按需发送,几分钟就可以做完了。状态同步,下载刚才的框架去填写你的逻辑,这跟云函数有点像,不同的是云函数不支持长连接、不支持有状态的服务,小游戏联机对战专门支持有状态的服务。它的扩展性很强,自动的伸缩,不用担心现在游戏是不是爆发增长了,比如说晚上没有人玩了,这时候会自动的缩容,这个扩缩容不是按月、按天来的,而是一天都可以扩缩容好几次。
我不知道大家是不是从移动游戏和端游过来的,起码大家是玩过游戏的,你会发现游戏经常说:“要更新、要维护、要停服了(1-3点不能玩)”,因为游戏是有状态的服务,要做到更新不停服是非常困难的事情。这是小型联机对战引擎的优点,可以不停的更新服务。虽然功能不多,但是里面的技术难点比较多。
无忧定价,现在定价是免费的,可能明年会计费,计费也是按照人数,人多的时候费用高一点,人少的时候费用低一点,但是今年是免费的,大家有机会可以去试用一下。
落地实践
这是我们用帧同步做的一款游戏,刚才帧同步的游戏卡住了,大家可以扫描左边的《猪猪对战》,是用帧同步做的,这是用状态同步做的一款答题游戏。前面讲师讲到实时数据库做聊天,是500行代码,这个答题游戏总共是2000行的代码,主要的代码是在前端,总共是2000行代码,《猪猪对战》的代码更少。
这一款是QQ小游戏刚上线的,叫做《跑跑极限漂》,这也是小游戏联机对战引擎中出来的,看的效果不是很好,实际上小游戏看上去的效果很好,图画有一点失真的感觉,但是在手机上很好玩。因为我不是特别会玩游戏,玩的有点差,经常撞到。
实时对战的现场演示,那不是小游戏联机对战引擎的,小游戏联机对战引擎是8月19号-22号,8月19号是《猪猪对战》,用帧同步实现联机游戏的,8月22号晚上7点是答题游戏,用状态同步实现联机游戏。现在小游戏用联机游戏的不多,我们出了这个开发组件之后,希望更多的人可以做联机类的游戏,其实QQ平台和微信平台是比较适合做联机游戏的,我们自己的答题游戏一上线就有很多人玩,其实我们答题游戏里面题目并不多,只有5个,但是还是有很多人在玩。
接入流程,先到腾讯官网去申请,你可以收到小游戏联机对战引擎,申请开通服务,这时候就可以去体验,我们提供了一些demo,你可以去体验,可以开发自己的demo。
Q:老师您好,现在我们开发某一款小游戏,总要有一个市场的定位,比如线上和线下是怎么进行的?小游戏的定位,我要做这个东西可以满足什么样的市场需求,除了玩,线上和线下有没有可以收集到用户的反馈?
A:我本身不是做游戏开发的,只是为游戏开发者提供这种服务,如果你问到游戏策划的事,我不是很懂,但我可以发表一下自己的看法。一般你问别人喜欢玩什么游戏,你希望是什么样的游戏,别人也不知道,别人不可能说我喜欢什么样的游戏,他说了喜欢的游戏可能就已经存在了。如果他特别清楚要做什么样的游戏,他自己就是一个游戏策划。所以你要从别人口中问出什么创意的点子比较难。
我看到有些开发者的做法,把国外的游戏、APP,各国国家的都体验了一遍,从中找一些灵感,做一款差不多的游戏。我听说有一个video的平台,上面排行榜前100位的都已经被抄的差不多了。因为你自己要想一个创意,那个创意能不能成功不好说,研发成功比较高,现在市场变得越来越好,什么市场?包括云开发、百度引擎、小游戏联机对战引擎,这些组件出来之后,可以帮助开发者快速的实现游戏,你的游戏创意的试错成本比以前少了很多。其实我们中国开发者可以尝试着想一些创意,不要一味地抄。这是我个人的感受。