【面经】腾讯U3d面试面经 帧同步方向 (一)帧同步如何解决不同步的问题?

解决不同步问题首先考虑什么是不同步的问题,为什么会出现不同步的情况。

那么什么是不同步的问题呢?帧同步是由客户端计算,发送命令给服务器,服务器转发命令达到两边客户端显示一致。服务器是不知道具体逻辑的,所以如果两边客户端计算的某些变量出现不一致的时候,就会出现不同步的情况,随着时间的推进,一个小小的不同步也会造成滚雪球效应,最后的结果可能就南辕北辙了。

所以为什么会出现不同步的情况,也很好解释了,两边客户端无法保证输入的一致性,计算的一致性,就无法保证唯一的输出。

首先,一个战斗系统的可玩性很大的一点是战斗的伤害具有随机性,幅度会在一定范围内随机显示,然后还有机率出现暴击;而帧同步的特性就是要消灭这样的随机性,两边客户端在同一时间计算出来的伤害一定是一个数字。那么如何控制这个随机性呢?通过服务器在帧同步开始的时候下发同一个随机数种子,通过自定义的随机数算法保证这个数字看上去是随机的,但是实际上是必然的。

其次是计算过程中的精度损失,最为关键的就是浮点数导致的精度损失,在不同的硬件环境下,相同的浮点数可能会造成不同的运算结果,虽然这个结果在这一帧内影响有限,但是由于滚雪球效应,最终的战斗结果可能就会出现非常明显的不同步问题了。对于这个问题,采用定点数去代替浮点数做计算,使用一个万分比的参数去转换定点数和浮点数,这样就能避免规避掉浮点数的问题。

然后是逻辑顺序执行不一致,这个一般是由于使用到了一些插件,而这些插件的Update并不能由帧同步去控制,导致两边客户端可能执行某个计算片段的时间并不是在同一逻辑帧,所以解决这个问题的方案就是,不要使用这些插件,尽量去使用开源插件或者自己写,保证Update函数掌控在自己的逻辑中,去避免出现不同步的问题。例如物理系统、动画系统、AI等这些插件,就尽量去使用自己写的,保证一致性。

然后是网络接收数据的先后顺序不一致的不同步问题,通常的帧同步为了保证网络的流程,会丢弃掉成熟的TCP,采用UDP去自行实现可靠的网络收发,但是如果一旦不考虑清楚网络的复杂性,就会出现网络波动的情况下,后发的消息可能会比先发的消息先发送到接收端,如果这时候接收端不进行处理的话,就会出现接收端先处理后一条消息,再处理前一条消息的情况,这样输入的顺序不一致,也是会造成最终的不同步的。解决方法也很简单,对每一个发出的消息做一个自增的编号,根据编号的连续性确定消息的顺序,就算先收到后面的消息,也可以等待前面的消息收到之后进行顺序传入游戏逻辑中。

总结来说,就是保证客户端的输入一致,计算一致,就能解决帧同步的不同步问题。

最后,一个优秀的帧同步系统,首先应该尽量去避免不同步的问题,其次就是在出现不同步问题的时候,能快速查找出问题的根源,然后去解决问题。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章