背景:
之前,想做一个联机小游戏,迫于美术资源的不足,就自己临摹了一个坦克(美术真是程序员的硬伤啊)。相对来说,坦克模型比较好画一些,而且我朋友也说做个坦克大战玩玩吧。于是,就这样搞了起来。自己本身是做Java的,只是出于对游戏的爱好才和cocos结缘,也因此结识了很多业内的朋友(特别是张晓衡张哥和麒麟子大佬),非常感谢他们的帮助和支持!
因为有自己的服务器,因此刚开始是在自己的服务器做的服务端。期间,也不断的了解了很多联机游戏中用到的知识,如什么是帧同步、状态同步。他们之间又有什么区别,和各自的优缺点等。
也在论坛和网上多个地方寻找相应的资源和demo。最终,搞出来了一个初始版。主要实现了匹配,移动,射击和战斗伤害的计算,死亡倒计时重生等。按照帧同步和状态同步的概念来讲,我这一版,感觉更像是状态同步和帧同步的结合。因为,为了减少服务器压力,所有计算都放在了客户端,而服务器只是做一些数据的转发,这类似帧同步。同时,并没有像帧同步那样,通过逻辑帧来驱动逻辑层,表现层做表现处理,只是不断的向服务器发送当前的位置等信息。(这是个坑。。。)
因此,第一版做出来的之后,效果不是很理想。如上所说,客户端不断的向服务器发送信息,仅仅这一点就是个坑。之前不懂,后来经过多方面查资料才意识到的,这无疑加大了服务器的压力。
机缘巧合
后来,恰好张哥推荐腾讯的小游戏联机对战引擎(MGOBE)。这非常切合我现在的需要。因此,就研究了起来。用这个引擎框架改写了之前的代码。改为客户端用帧同步,服务器端用MGOBE框架代码,不需要写额外的代码逻辑。(改为帧同步,让我又跳入了另一个坑,如应该在什么时刻把客户端指令上送给服务器,客户端收到服务器指令又应该怎么处理,逻辑层和表现层怎么做分离等,好在最后这些问题都解决了。)
目前,改写完了匹配系统、帧同步移动及平滑处理。平滑处理,也搞了很长时间。现在1V1看起来效果还可以。其实,还有很多需要优化的地方。如,没有考虑网络状态不好的情况下,客户端就会晚收到帧消息,进而导致没有及时计算位置等信息,表现层会卡顿。(其实,也考虑到了这种情况,想用航位推算法来实现,奈何最终没成功)。因此,目前使用的是插值算法。
做帧同步,是一个不断尝试,踩坑,优化的过程。
最近在大家的鼓励下,在自己的公众号连载了系列的帧同步代码和讲解,也有游戏效果视频。
不知道,有没有小伙伴感兴趣呢?