近期完成一个稍稍涉及网络同步的游戏,结合网络上查到的一点资料和自己的心得做个小结。 游戏描述:略形象的归纳为地图中5个玩家在5个不同位置消息,地图中有20个道具,玩家选择出发时间,出发角度和出发速度去奔向某道具。现在玩家1向server发消息,准备从当前currposition出发,对应的currtime,currangle,currspeed都确定,假定前方有prop1,现在服务器收到消息currservertime,然后广播玩家1的出发,那么玩家2,玩家3,玩家4,玩家5可能又由于网络原因接收到消息的时间是time2,time3,time4,time5。如果玩家1发出消息时开始绘图,玩家2,3,4,5接收到消息时绘图,这里就会产生一个不同步问题,玩家1和玩家2,3,4,5对应有一个time2,3,4,5-currtime的时间误差。而且中间还可能有5个玩家的本地时间并不相同的情况。 首先可以通过服务器验证群发方式解决:玩家1发出消息的时候并不进行绘图,而是挂起等待服务器接收玩家1消息,广播给5位玩家之后大家一起绘图。考虑5个玩家本地时间不同的情况和网络延时时间,我们可以在玩家开始游戏的前进行一个玩家本地时间和服务器时间的误差比较,在服务器和5个客户端记录每个玩家和服务器的时间误差motifytime1,2,3,4,5。在服务器收到出发消息时,根据motifytime1,2,3,4,5确定玩家1,2,3,4,5每个人收到玩家1出发消息的绘图时间。这个方案在网络延迟很大发出消息的玩家会感觉极其不顺。很多并不是很需要及时通信的游戏会采用这种方式。 如果玩家1在发出消息时就绘图,也可以通过motifytime方式进行同步,在服务器收到玩家1消息时,通过motifytime1计算出服务器中的玩家1出发时间,进行广播后玩家2,3,4,5根据自己的motifytime2,3,4,5判断接收到消息的时间和服务器发来的时间是否满足motifytime2,3,4,5范围,超出范围则计算出超出的时间,*speed后可以得到实际玩家1已经走到的位置positon1,当然我们可以用一个稍微快一点的speed到达position1后面的一点位置。 还有一种好像是目前主流的解决方案,笔者没有实践拷贝网络资料: 首先客户端需要在登陆世界的时候建立很多张广播列表,这些列表在客户端后台和服务器要进行不及时同步,之所以要建立多张列表,是因为要广播的类型是不止一种的,比如说有local message,有remote message,还有global message 等等,这些列表都需要在客户端登陆的时候根据服务器发过来的消息建立好。在建立列表的同时,还需要获得每个列表中广播对象的TimeModified,并且要维护一张完整的用户状态列表在后台,也是不及时的和服务器进行同步,根据本地的用户状态表,可以做到一部分决策由客户端自己来决定,当客户端发送这部分决策的时候,则直接将最终决策发送到各个广播列表里面的客户端,并对其时间进行校对,保证每个客户端在收到的消息的时间是和根据本地时间进行校对过的。那么再采用预测拉扯中提到过的计算提前量,提高速度行走过去的方法,将会使同步变得非常的smooth。该方案的优点是不通过服务器,客户端自己之间进行同步,大大的降低了由于网络延迟而带来的误差,并且由于大部分决策都可以由客户端来做,也大大的降低了服务器的资源。由此带来的弊端就是由于消息和决策权都放在客户端本地,所以给外挂提供了很大的可乘之机。 大家都知道,在网络传输的时候,延迟现象是很普遍的,而在基于Server/Client结构下的网络游戏的同步也就成了很头疼的问题,在保证客户端响应用户本地指令流畅的情况下,没法有效的保证的同步的及时性。首先,这套同步方案是基于客户端之间的同步的。下面我们先来说一些本文中将用到的名词概念:
同步是网络游戏很重要的问题,如何同步也牵扯到各个方面的问题,比如说游戏的规模,游戏的类型以及各种各样的方面,对于规模比较大的游戏,在同步方面可以下很多的工夫,把消息分得十分的细腻,对于不同的消息采用不同的同步机制,而对于规模比较小的游戏,则可以采用大体上一样的同步机制,究竟怎么样同步,没有个定式,是需要根据自己的不同情况来做出不同的同步决策的。 笔者完成的是一个休闲游戏,采用了第二种方式做预测拉扯方式完成,对玩家操作采用先绘图,其他玩家接收消息后预测拉扯。同时服务器端也建立一幅地图资源和玩家操作场景,类似服务器和客户端都是一幅地图下同样的位置更新,由服务器做定期更细玩家坐标,并在关键的获得道具等消息处理有服务器决定。
最后摘抄以为网络大虾的的一点总结:
以下六点,将助你分清楚哪些我们可以努力,哪些我们不值得努力,弄明白实时游戏中同步问题关键之所在,巧妙的化解与规避游戏,最终在适合普遍用户网络环境中(200ms),实现实时快速互动游戏: 1. 基本情况: 2. 两个基本原则: 3. 同步的十二条基本对应策略: 4. 同步问题现状: 5. 目前网游的三大技术难题: |
|