因为好奇手游的同步策略,查询的帧同步相关内容。

大意是,游戏运行时以10fps(100毫秒间隔,具体数值可根据实际情况调整)运行一个逻辑帧,逻辑帧负责物理、ai、攻击判定等等。而动画和实际位移由渲染帧负责。这样动画表现是流畅的。而客户端每逻辑帧都会与服务器进行通信同步客户端的操作,当操作同步完成客户端的逻辑帧可以继续向后模拟。比如运行第3帧要确保第一帧的数据是完整的。双方客户端接收的操作内容是一致的,初始状态是一致的,所以运行的结果也应该是一致的。随机数可以使用确定随机种子的伪随机数来解决。

所以关键问题就是要确保客户端以同样的输入可以获得同样的运行结果。 这个是理论上可行的,很多rts游戏也都是基于此原理。比如魔兽争霸3  最高指挥官2  全面战争  星际争霸 帝国时代 等等。  以最高指挥官(Super Commander)为例,其全部单位有上千个,如果要实时同步他们的状态以现在的网络条件都是很困难的,所以这些rts同步的仅仅是操作,即点击了什么位置,点击了什么按钮,选择了什么目标,按了什么按键。客户端接收到对应的操作,进行同样的模拟,达到同样的输出。从而完成网络同步。

魔兽争霸的录像机制也是基于此原理,记录操作,而不记录状态。所以几十分钟的游戏,其战报只有几百k。同样因为这个原理,所以在出bug的时候(概率不高,但是玩家多了,还是很容易碰到的)会造成录像与实际玩的时候不一致。比如玩的时候剑圣暴击杀死了对手,从而翻盘取得了经典的胜利,但是战报播放的时候却没有发生暴击,直接被对方给推了。  全面战争也是如此,所以也会出现战报跟实际游戏不一致的情况,不过概率确实不大,只有发生极限情况才可能出现这样的问题。


游戏应该优先保证正常用户的体验,所以当有玩家出现卡帧情况的时候,不应选择暂停其他玩家,而是让他慢慢的追赶上来,设计上,服务器即可以采用客户端的正常速度,按帧驱动客户端,但当网络都出现突发状况的时候,如图****9,通讯异常时,2个客户端都对帧数2缺失,如果服务器照常运行,到恢复网络状况时,会出现情况是,每个客户端都卡了几帧之后,加速拉了几帧。所以,针对这种情况,增加客户端的对帧操作,即客户端执行第1帧时,跟服务器说可以播放第二帧了,然后服务器开始驱动第二帧动作,考虑网络延迟情况,可以提前对帧第n帧的,效果如图****9,左边客户端第二个对帧操作使服务器开始推动第二帧进行,而右边客户端的第二个对帧动作其实不起任何作用

                        帧同步在竞技类网络游戏中的应用

 

                                                                     图8

                        帧同步在竞技类网络游戏中的应用


本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。

本站由 @shyiuanchen 创建,使用 Stellar 作为主题。