联网技术中的帧同步了解一下

众所周知 ,解决网络延迟问题,目前主要有 帧同步和状态同步(又称为CS同步)两种网络同步解决方案。

1、状态同步:每个客户端发送各自操作到服务器,服务器统一计算后将状态结果同步给各个客户端,客户端根据状态显示内容。

2、帧同步:一般流程是客户端上传操作到服务器,服务器收到后并不计算游戏行为, 而是转发到所有客户端,客户端接受到操作以后,通过运算可以达到一致的状态,这样的情况下就算单位再多,他的同步量也不会随之增加。

对于使用状态同步的游戏而言,不同玩家屏幕上的表现一致性并不是重要指标, 只要每次操作的结果相同即可。(所以大家会发现国产RPG游戏的动画特效一般比较华丽, 攻击的时候给人感觉是击中了,且放技能之前一般也有一个动画前摇。这实际上就是使用了状态同步,玩家将攻击请求提交给服务器。等服务器结果返回时,动画也播放完毕了,之后就是统一的伤害效果和结算。


今天我们主要讲后者,即帧同步

在说到帧率前,首先要了解一个叫帧率的概念。根据百度词条的解释:帧率就是每秒的帧数(fps)或者说帧率表示图形处理器处理场时每秒钟能够更新的次数。正常情况下,帧率>30 画面就能保持基本流畅,理论上来说,越高的帧率可以得到更流畅、更逼真的动画。

至于帧同步则是从帧率上衍生出的概念。游戏里同步的是玩家的操作指令,一般的流程是客户端上传操作指令到服务器, 服务器收到后并不计算游戏行为, 而将数据转发(帧同步不同步状态,只同步玩家的操作指令,所以这里的数据其实是指令)给各个客户端,各客户端立即根据当前自己所掌握的游戏数据,模拟出一个游戏进行状态,不需要等到服务器的返回消息。

或者具体我们可以这样理解同步帧:我们可以把游戏的前进分为一帧帧(这里的帧和游戏的渲染帧率并不是一个,只是借鉴了帧的概念,一个自定义的帧。),相当于每一帧是服务器集齐了所有玩家操作指令,才进行计算并进入下一步广播给所有的玩家。否则就要等待最慢的玩家,从而保证帧一致。因此这意味者如果有人延迟比较高,其他玩家必须等待该玩家跟上之后再继续计算。

以上说的是标准的帧同步(又称锁定帧同步),实际上还存在另一种帧同步方式,即乐观锁。

联网引擎工具 Matchvs采用的便是乐观锁的方式, 无论是否收集到客户端的信息,都将目前为止收集到的指令封装为帧并下发,客户端发现自己的指令丢失之后应该将指令重传。这样所有客户端不会因为某个客户端的卡顿而卡。

可以说,乐观锁的方式除了保证游戏实时对战的流畅性优势外,还使得网速慢的玩家不会卡到快的玩家,只会感觉自己操作延迟而已。

当然,帧同步也并非完美,比如由于逻辑在客户端,因此无法避免开图挂,反外挂成本压力大。另外调试也比较麻烦,需要添加很多的log,来判断具体是那一帧开始不同步,才能找出不同步的原因等。

猜你喜欢

转载自blog.csdn.net/matchvs/article/details/80010555