loop_in_codes

低调做技术__欢迎移步我的独立博客 codemaro.com 微博 kevinlynx

网游中的玩家移动

Kevin Lynx 6.22.2010

MMORPG中,玩家的移动主要逻辑都放在客户端进行,包括自动寻路和响应玩家的操作,服务
器在这里担当一个被动角色。但是服务器端的玩家数据却是真正的被其他逻辑模块参考的数
据。

在这样一种C/S主从关系中,如何保证C/S两者各自维护的玩家坐标数据的一致性?为了保证
数据的一致性,我们需要进行数据的同步。而导致数据不同步(不相同),也就是C/S之间
玩家的坐标不一样,主要来源于两大原因:C->S数据的网络延迟、S->C数据的网络延迟。考
虑到这两个重要的因素,首先需要尽量减少C/S之间数据的交互。

在一般的逻辑模块中,客户端发送一个请求到服务器,服务器作了验证后返回验证结果,客
户端接收验证结果继续之前的逻辑。这对于MMO中诸如物品操作而言是足够的,但无法应用
于玩家移动。

这里的做法是:客户端每走一步,都发消息(网络封包)给服务器,服务器做验证;客户端
停止走动后,通知服务器,服务器返回自己保存的坐标,客户端在这个时候才使用服务器端
的数据同步一次本地坐标。其操作序列如下图:

-----------------------------------------------------------------
Client                                            Server
移动、本地坐标改变    ---->            验证C/S之间的坐标是否差距过大,
                                    验证失败通知客户端停止移动
停止移动              ---->            验证同上
同步本地坐标为服务器坐标   <---
-----------------------------------------------------------------

此外,客户端保存一个请求计数,每一次发送一个移动请求时,递增该计数;服务器收到该
请求后,验证成功,返回一个消息,客户端收到此回应消息后递减该计数。当该计数超过某
个配置数值后,客户端将忽略玩家的移动操作。客户端还可以将玩家的多个移动操作合并为
一个,即,只在角色到达玩家最后一次点击的坐标时,才发送停止移动消息给服务器。

配合请求计数机制,当C->S的消息出现延迟太久时,此时也意味着请求计数过大,客户端会
强迫玩家等待;服务器终于收到消息后,逐个处理,直到处理完后,客户端的请求计数恢复
时,玩家才可继续移动。同样,当S->C的消息(只考虑停止移动的消息回应)出现延迟时,
这个时候客户端很可能在本地做了另一次移动操作,在终于接收到上一次移动操作的服务器
端回应时,因为这个时候客户端毫无条件地将本地数据同步为服务器端发过来的数据,那么
,出现这种情况后,客户端角色就会出现拉回去的现象。这里的一次移动,可能是多个地图
格子的移动,一般为角色当前坐标到玩家点击的目标坐标。

posted on 2010-06-22 21:27 Kevin Lynx 阅读(4714) 评论(8)  编辑 收藏 引用 所属分类: game develop

评论

# re: 网游中的玩家移动 2010-06-22 21:34 小时候可靓了

抢沙发!  回复  更多评论   

# re: 网游中的玩家移动 2010-06-22 21:39 小时候可靓了

客户端每走一步,都发消息(网络封包)给服务器,服务器做验证;客户端
停止走动后,通知服务器,服务器返回自己保存的坐标,客户端在这个时候才使用服务器端
的数据同步一次本地坐标。

这样会不会导致本地角色看到其它玩家的移动不自然呢?  回复  更多评论   

# re: 网游中的玩家移动 2010-06-22 22:34 evoup

每一步,不至于吧,应该是a点到b点间一定时间内修正客户端的位移吧,该时间内按照玩家点击的位置客户端自己位移才是吧,真的实时怎么吃得消。  回复  更多评论   

# re: 网游中的玩家移动 2010-06-23 08:52 Kevin Lynx

@evoup
话说你没有看清楚我说的内容。每一步发的消息仅用于服务器的验证,不同步客户端数据。
@小时候可靓了
这个属于另一个话题了,客户端会粗略估算其他角色的移动情况,如取得方向模拟其行走,以达到自然的效果,改天细谈下。  回复  更多评论   

# re: 网游中的玩家移动 2010-06-23 09:35 keror

“考虑到这两个重要的因素,首先需要尽量减少C/S之间数据的交互。“
“服务器收到该请求后,验证成功,返回一个消息”

这个有减少数据交互么?  回复  更多评论   

# re: 网游中的玩家移动 2010-06-23 09:39 Kevin Lynx

@keror
这里返回的消息,客户端仅用于递减请求计数。不会立即影响客户端的移动效果。  回复  更多评论   

# re: 网游中的玩家移动 2010-06-24 22:29 evoup

呵呵有道理  回复  更多评论   

# re: 网游中的玩家移动 2010-07-08 15:21

这个是谁啊、、、我晕的。。。我是goole来的。。。  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理