开发动机

学习Golang语言以来,先后实现了个人博客,生活美食推荐系统,以及一些如日志收集工具等开发能用到的小工具,但还没写过游戏。前不久,利用闲暇时间,写了套简易的分布式游戏框架,心想写好了不投入实践使用,不能看到效果啊,所以决定写一个小游戏案例来玩一玩!

技术支持

服务器框架只实现了简单的服务间通信,中心管理,游戏配置,网络传输层,db等功能,传输协议使用TCP + Protobuf 3,服务器通信采用 RPC + HTTP ,DB采用 Mysql + Redis 持久+缓存。

客户端前后比较了多款主流引擎,由于我有JS基础,且考虑到没打算深钻引擎,所以选了 Laya 引擎的 JS 版,有基础就容易上手,看了一个下午的视频教程就算是入了门了,且 Laya 官网有完整的API文档和一些小案例,对新手而言很友好。

技术难点

1、时延性

球球大作战是一款休闲类的实时对战游戏,对于实时对战游戏而言,如果时延高的话,玩起来体验感就特别差了, 所以第一难点就在于如何做到无时延或低时延,这里我采用的游戏同步方式是状态同步,客户端的移动操作在每帧效果内进行体现, 同时将移动操作发送给服务器,服务器有一个tick循环,将模拟每50/100ms向房间内的玩家推送同步数据,这里看了下球球大作战技术人官宣的方案, 他们也是如此设计的,客户端和服务器间发送的帧数越频繁,时延就会越低。

2、网络IO

上面这样的同步方案解决了时延性的问题,但这样会存在另一个问题,就是网络IO开销会比较高,第一是消息频繁,第二是消息体比较大 ,因为房间内会存在多个玩家和成百上千的小球球,同时玩家和玩家之间,玩家和小球球之间又会有碰撞效果,会不断生成新的小球,所以如果是 每一个同步消息内发送所有的球球的话,那么这个包应该是不小的,为了解决这个问题,我想了个方法,就是服务器每个同步帧内记录下新生成球球和死亡的 球球, 在发送同步帧时,只推送这些球球的数据,而且死亡的球球只要球球ID就行了,对于没有发生变化的球球,不需要进行推送。这样试了下,确实网络包大小降低了很多,而且效果也很好, 在网络较差的地铁上都能顺畅玩下去。

游戏展示

简单截了下图,图中有2个玩家,102和 105,蓝色球球代表自己,右下角黑色圆形的是方向控制器,点击屏幕并滑动来控制方向移动,右上角这里设计了个自杀器,玩家碰撞后会死亡,其他较小的就是生成的小球球。

第一次打开时加载可能会比较慢,因为我的服务器是最低的学生配置机,如果加载失败了,刷新一下就行,哈哈哈,主要是穷。

这demo大概只花了半个月的时间,所以还有很多bug和不完善的地方,后面会再持续跟进完善,希望能做出一点可玩性的东西。