Unity 3d 帧同步

最近给两个新人解释帧同步,写了一个简单的帧同步模型,但是公司不给上网,代码上传不了,于是回家重写了一个,但是有些工具类不想写了,在网上找了一些可以用的代码凑合着用了。

帧同步的原理就是在一个回合内(一个固定的时间频率,比如100ms)客户端发服务端发送关键帧,服务端收到所有客户端广播关键帧,所有的客户端收到服务端广播的关键帧后再执行。由于所有的客户端代码都是一样的,执行的帧数也是一样的,所以每个客户端得到的结果都是一样的。

帧同步现的过程有个很重要的地方就是逻辑层和表现层一定要分开,表现层先行,逻辑层等发到服务端的指令再处理。

帧同步合做人数比较少(5到8人比较合适,多了数据包的发送量非常大,会比较卡,特别是在手机上),同步要求比较高的游戏,比如FPS游戏和格斗类游戏。

帧同步虽然同步效果好,代码也简单,但是还是有很多蛋疼的地方

(1)断线重连,帧同步的断线重连相当的蛋疼,还要服务端配合。

(2)一个客户端卡了,所有的客户端都会卡,所以有可能一个客户端掉线了,其他人都会卡住

(3)物理引擎,一旦物体处于物理引擎的控制下就不能再强制去设置它的位置,如果强制设置它位置就会出现一些不可预知的结果,所以物理引擎是一个大坑,同步的最好不要用物理引擎,自己模拟就好了

(4)UDP发送的包是不包证顺序的,而且还可能丢包,


下面会附上一个帧同步的模型

服务端:https://github.com/caolaoyao/AsycServer

客户端:https://github.com/caolaoyao/AsycClient


这个模型还有几个问题

1、服务端没有处理超时,一个客户端掉了,所有的客户端都会卡住了,服务端应该设置一个超时回调,一旦超过某个设定的时间没有收到客户端的包,就当它什么也没有做,把关键广播出去

2、服务端和客户端都没有处理收包的顺序

3、同步物体的位置信息的时候应该同步物体的状态和方向,不应该直接同步位置,不然看起来移动的时候会很不自然,虽然提高同步频率可以缓解这个问题,但这不是一种好的做法


没有更多推荐了,返回首页