您的位置:首页 > 移动开发 > Unity3D

Unity 3d 帧同步

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

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

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

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

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

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

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

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

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

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

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

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

这个模型还有几个问题

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

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

3、同步物体的位置信息的时候应该同步物体的状态和方向,不应该直接同步位置,不然看起来移动的时候会很不自然,虽然提高同步频率可以缓解这个问题,但这不是一种好的做法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: