笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:《手把手教你架构3D游戏引擎》电子工业出版社和《Unity3D实战核心技术详解》电子工业出版社等。
CSDN视频网址:http://edu.csdn.net/lecturer/144
在玩网络游戏的时候,多人在线,多人组队,多对多PK等等,这些我们经常可以互相看到对方在移动,我们通常称这个为实时同步,有时,我们会看到对方忽然有被拉回的感觉,这个称谓延时操作,就是说客户端和服务器端时间不一致或者是网络不顺畅造成的,接下来我给大家介绍一下在客户端如何实现实时同步。
首先我们要知道玩家周围的其他玩家或者怪物,NPC是如何刷出来的,在这里涉及到服务器的实现,服务器会模拟客户端的场景,也在服务器的GameServer里面生成一个跟客户端同样大小的地图,它里面有个九屏的概念,什么是九屏,九屏是服务器已玩家为中心生成的九个格子,每个格子都有一定的大小,凡是位于玩家的九屏之内的对象都会被服务器刷出来,如图所示:
服务其中的九屏如上图所示,每个玩家都有自己的九屏,这个九屏是随着玩家移动的,在九屏之外就不会被刷出,玩家是看不到的,这也是为什么有时在客户端把可视距离设大了还是看不到,就是这个道理。还是以服务器的为准。所以我们在客户端实现的时候就分如下几步:
第一步是刷玩家自己
第二步是刷玩家九屏的对象
第三步是要随时刷走进玩家九屏或者远离玩家九屏的对象
实现代码如下:
玩家九屏之内的对象刷出来之后,我们接下来就要实现实时同步,实时同步有好多方式,我给大家介绍的方式是目前比较流行的,就是根据玩家的状态进行同步,那状态是什么意思?举个例子,就是玩家从站状态到走状态,状态发生改变要告诉服务器,而服务器会把这个状态改变告诉在玩家九屏之内的对象,玩家开始走了,如果玩家一直走,客户端与服务器是不同信的,而客户端是在一定的时间间隔内存到堆栈里,同时可以发送给服务器,但是服务器是不转发的,他只是在服务器里模拟。一旦状态发生改变立刻取出发给服务器,服务器再群发九屏消息,为了使玩家出现的不突兀,客户端会采用差值的方式,差值是根据时间进行的,这个时间的计算就包括客户端发送给服务器的,以及服务器返回的时间,以及在客户端行走的时间都需要计算的。代码如下:
以上是状态改变的时候发送消息,状态不改变的处理方式如下:
在这里还有一个问题,不知道大家注意了没?就是说如果遇到碰撞体该如何解决?
在这里我们也要做特殊处理,就是说如果碰到阻挡物的话,我们也认为其状态发生了改变,需要发送消息,代码如下:
最后注意一下,客户端为了跟服务器时间上能同步,需要客户端不定时的Ping一下服务器,根据Ping的时间差决定差值。代码如下:
以上整个客户端实时同步就完成了。