帧同步小记
刚问了公司另一个写服务器的大牛,赶紧记录下。
首先我们的游戏是强联网的格斗游戏。网络同步采用是帧同步技术。
帧同步的背景介绍:就是一个对于一个f(x) 函数,对于同一输入,输出结果一定相同。
拿格斗游戏举例,a挥刀,b下蹲作为输入的参数,x1,x2 ,函数f(x1,x2) 输出固定的一个结果(相对俩个对战玩家来说,叫同一个输出结果这样才比较好理解吧)
原来经常说的30帧意思就是,一秒30帧,拿1000ms /30 = 33ms 作为区间计算。
依然接上个例子,服务器从某0时刻算起,到33ms 算第一帧 ,这个区间中间a玩家上传的挥刀 ,b玩家上传下蹲,服务器收到之后,在33ms这个点上就同步信息给玩家(这里所谓的同步具体代码层度上就是广播信息给玩家啦),若是在这个区间a没有上传值,则服务器会取默认值下发同步,即俩者都不发也会取默认值同步。
这里就有个问题,比如某个人不发了,是不是算他掉线了,所以就牵扯到一个功能区分粒度的问题了。也就是说一般合格的程序员都应该把控的问题,某个函数是做什么的,功能只是做这个。上面说的这些就是帧同步核心的思想玩法,听完也没那么神秘的。回到这里的问题,就是指这个模块(或者说是函数),只负责这个帧同步消息的操作。至于我说的比如玩家socket断线什么的,可以是另外的一个模块(函数)负责的,包括玩家实例的回收,生命周期什么的,这样分开管理好处应该很容易想到,分工明确,作为他人也比较容易看懂,有条理,好找bug(这点很重要,不然像我自己之前做的一个分的细度不明确,后面代码量多了后,出bug自己都看的蛋疼)。 而且这也是一个有经验,专业的程序员和那些在学校没有啥项目经验的学生区别吧。
另外还有延迟的考虑,就是客户端一般收到的帧会有俩帧的延迟,作为服务器是收集输入信息到点就下发同步的。但是事情情况来讲,比如你在广州,我在深圳,那网络中间路由传输就有70ms的时间,所以作为客户端来说,在当前时刻上报的输入帧,会等到俩帧之后才收到结果(这个就是所说的俩帧延迟,我一开始还理解成服务器延迟俩帧下),不过在服务器有考虑过延迟几帧再下方的操作,是因为考虑了网络波动,这样客户端就能多缓存几帧的内容,不过后来实际效果不好,被pass了,听了这么多,我才算理解了,为啥我们那游戏在国外的玩家打斗操作动作那么卡啦,这不就是下发的帧延迟太久导致的嘛。
好了,刚刚想到问的这些,也是提醒自己,遇到第一次听到的,以前没见过,听过的东西,一定要记录下来,不要相信自己当时脑子的记忆。