帧同步实践-联机坦克大战

背景
之前,想做一个联机小游戏,迫于美术资源的不足,就自己临摹了一个坦克(美术真是程序员的硬伤啊)。相对来说,坦克模型比较好画一些,而且我朋友也说做个坦克大战玩玩吧。于是,就这样搞了起来。自己本身是做Java的,只是出于对游戏的爱好才和cocos结缘,也因此结识了很多业内的朋友(特别是张晓衡张哥和麒麟子大佬),非常感谢他们的帮助和支持!

因为有自己的服务器,因此刚开始是在自己的服务器做的服务端。期间,也不断的了解了很多联机游戏中用到的知识,如什么是帧同步、状态同步。他们之间又有什么区别,和各自的优缺点等。

也在论坛和网上多个地方寻找相应的资源和demo。最终,搞出来了一个初始版。主要实现了匹配,移动,射击和战斗伤害的计算,死亡倒计时重生等。按照帧同步和状态同步的概念来讲,我这一版,感觉更像是状态同步和帧同步的结合。因为,为了减少服务器压力,所有计算都放在了客户端,而服务器只是做一些数据的转发,这类似帧同步。同时,并没有像帧同步那样,通过逻辑帧来驱动逻辑层,表现层做表现处理,只是不断的向服务器发送当前的位置等信息。(这是个坑。。。)

因此,第一版做出来的之后,效果不是很理想。如上所说,客户端不断的向服务器发送信息,仅仅这一点就是个坑。之前不懂,后来经过多方面查资料才意识到的,这无疑加大了服务器的压力。

机缘巧合
后来,恰好张哥推荐腾讯的小游戏联机对战引擎(MGOBE)。这非常切合我现在的需要。因此,就研究了起来。用这个引擎框架改写了之前的代码。改为客户端用帧同步,服务器端用MGOBE框架代码,不需要写额外的代码逻辑。(改为帧同步,让我又跳入了另一个坑,如应该在什么时刻把客户端指令上送给服务器,客户端收到服务器指令又应该怎么处理,逻辑层和表现层怎么做分离等,好在最后这些问题都解决了。)

目前,改写完了匹配系统、帧同步移动及平滑处理。平滑处理,也搞了很长时间。现在1V1看起来效果还可以。其实,还有很多需要优化的地方。如,没有考虑网络状态不好的情况下,客户端就会晚收到帧消息,进而导致没有及时计算位置等信息,表现层会卡顿。(其实,也考虑到了这种情况,想用航位推算法来实现,奈何最终没成功)。因此,目前使用的是插值算法。

做帧同步,是一个不断尝试,踩坑,优化的过程。

最近在大家的鼓励下,在自己的公众号连载了系列的帧同步代码和讲解,也有游戏效果视频。

不知道,有没有小伙伴感兴趣呢?

3赞

66666 坚持研究一年 你就是针同步大神

收藏了,期待大佬后续教程!

:heart_eyes: 大佬强呀

哈哈,向麒麟子大佬看齐

支持楼主,期待后续精彩内容:blush:

以马克鼓励

为啥不把公众号贴出来呢?

公众号:「如若清风」,欢迎关注,一起交流学习~ 目前正在连载中…

航位推算 比 插值 或者 简单预测的效果要好一些

大佬,能给一个航位推算的算法吗,我自己找了一个,但是还是有些问题,不确定是算法问题还是其他。预测,我用的是匀速预测,感觉这个跟正常的用update的dt计算没啥区别啊。

mark

http://www.zhust.com/index.php/2014/02/网络游戏的移动同步(二)状态更新及航位预测法/

航位推算不是为了解决网络延迟等问题导致的表现层卡顿现象吗,你这怎么是为了发包?

最开始我用的是影子跟随的插值平滑
后来我改成了插值加部分预测
但发现都会有那么一瞬间的停顿感

mark

我用了你这个平滑插值试了下,还是有抖动,特别是X轴移动的时候,Y轴就没有

ECS模式是不是在这种类型的游戏中好用点,最近想用ECS做一个游戏demo,有点不得要领

抖动应该是网络原因。。目前这种方式处理,还没办法覆盖到网络抖动。就是,当前逻辑帧到下一逻辑帧的时候中间的平滑处理,还需要继续优化

对了,js浮点数咋整。乘以1000么