游戏开发论坛

 找回密码
 立即注册
搜索
查看: 7724|回复: 12

关于网游的移动同步,请求指教!

[复制链接]

2

主题

7

帖子

9

积分

新手上路

Rank: 1

积分
9
发表于 2010-11-6 00:26:00 | 显示全部楼层 |阅读模式
遇到一些问题想的不是很明白,特向各位求援。
由于网络延迟都不一样且不稳定,不想用校对时间的办法
为了使用帧数同步,我的逻辑循环大致如下

const int FPS = 20; // 每秒钟20逻辑帧
const float LOGIC_INTERVAL = 1000.0f / FPS; // 应该每过50毫秒执行一个逻辑帧

const Time start;
Time current; // 精度 毫秒
uint32 clientLogicCnt = 0;

while ( 1 )
{
   NetUpdate(); // 解析收到的网络消息;网络IO在另一个线程做
  
   current.Now();// 获取当前时间
   uint32 elapsed = current ? start;
   if ( elapsed > clientLogicCnt * LOGIC_INTERVAL)
   {
      LogicUpdate();// 更新逻辑,与时间差无关,物体移动距离是个定值
      ++ clientLogicCnt;
   }
   else
   {
      //…. So on
      Sleep(1);
   }
}
想象到一种问题,如图。


玩家登陆后,发起向上走的指令,于是服务器也更新玩家坐标向上走;
第一个逻辑帧过后,二者一致,到了第二个点。
此时玩家又点击了自己的左侧,开始向左走,并且由于网络延迟,服务器收到的时候,已经走到了红色坐标。
若此时服务器向左走,就遇到了阻挡。
需要回滚服务器的操作。

30

主题

422

帖子

433

积分

中级会员

Rank: 3Rank: 3

积分
433
发表于 2010-11-6 08:28:00 | 显示全部楼层

Re:关于网游的移动同步,请求指教!

既然有逻辑帧,那么可以让消息都带上逻辑帧号作为动作发生的时间戳。被动方依靠时间戳来驱动逻辑帧向前运算。让整个运算过程都滞后,逻辑上就可以完全同步了(当然时间上不同步了,自己取舍吧)

34

主题

844

帖子

1755

积分

金牌会员

Rank: 6Rank: 6

积分
1755
发表于 2010-11-6 09:16:00 | 显示全部楼层

Re:关于网游的移动同步,请求指教!

移动,需要同步吗?
《魔兽世界》里的移动,是同步的吗?
《魔兽世界》战场,大家都对着门跑。门一开,跑在最前面的人永远都是我。可我还是玩得挺开心啊。

移动,需要同步吗?
哎呀~差不多就行了,干嘛非要完美同步呢。

4

主题

129

帖子

423

积分

中级会员

Rank: 3Rank: 3

积分
423
发表于 2010-11-6 09:45:00 | 显示全部楼层

Re:关于网游的移动同步,请求指教!

一般情况:
Client->Server :REQ_MOVE
Server->Client :ANS_MOVE
对于广播消息ANS_MOVE,一般有2种处理方式:
1:发送REQ_MOVE消息的客户端也会收到ANS_MOVE消息,同时客户端会同步一下坐标,如果有延迟,客户端就会“弹回”原来的位置;
2:发送REQ_MOVE消息的客户端不会收到ANS_MOVE消息,即客户端不会同步服务器上的坐标,如果有延迟,客户端依然走到哪是哪,此时,客户端就会发生“瞬移”的情况

2

主题

7

帖子

9

积分

新手上路

Rank: 1

积分
9
 楼主| 发表于 2010-11-6 14:44:00 | 显示全部楼层

Re:关于网游的移动同步,请求指教!

谢谢各位指教。
我帖子没写完居然就发出去了。

主角客户端与服务器的交互,还好理解。
如果有个其他玩家客户端B
当我最开始向上走,然后向左走,
B收到我向左走的消息时,他的屏幕上看到的"我"已经向上走"过"了几帧。
请问怎样纠正?瞬移是最差策略,避免回走。

3

主题

21

帖子

25

积分

注册会员

Rank: 2

积分
25
发表于 2010-11-7 12:10:00 | 显示全部楼层

Re:关于网游的移动同步,请求指教!

无完美解决之法,只能期待网速快些再快些

0

主题

18

帖子

18

积分

新手上路

Rank: 1

积分
18
发表于 2010-11-23 17:19:00 | 显示全部楼层

Re:关于网游的移动同步,请求指教!

同步 意味着放弃很多东西

21

主题

158

帖子

174

积分

注册会员

Rank: 2

积分
174
发表于 2010-12-16 21:39:00 | 显示全部楼层

Re:关于网游的移动同步,请求指教!

我的理解
楼主的思路是在网络上传输移动路线,严格控制单位的移动轨迹
我觉得这种方法在网络延迟的环境下会产生各种莫名其妙的行为

观察现有的游戏,通常都是周期性向服务器同步当前坐标
至于楼主所说的那个,第一个指令后,移动过折了

过折了就过折了吧
让本地将错就错从他那个错误的位置移向新的目标点
让服务器从所谓正确的位置移向新的目标点
你说了,那他们就不同步了,移动路线都不一样。
呵呵,它们的路线从最开始就没必要一样。

如果服务器和本地位置相差超过一定的阈值,就通过瞬移来修正本地坐标。不过这只会发生在延迟很严重的情况下。

21

主题

158

帖子

174

积分

注册会员

Rank: 2

积分
174
发表于 2010-12-16 21:41:00 | 显示全部楼层

Re:关于网游的移动同步,请求指教!

我的理解
楼主的思路是在网络上传输移动路线,严格控制单位的移动轨迹
我觉得这种方法在网络延迟的环境下会产生各种莫名其妙的行为

观察现有的游戏,通常都是周期性向服务器同步当前坐标
至于楼主所说的那个,第一个指令后,移动过折了

过折了就过折了吧
让本地将错就错从他那个错误的位置移向新的目标点
让服务器从所谓正确的位置移向新的目标点
你说了,那他们就不同步了,移动路线都不一样。
呵呵,它们的路线从最开始就没必要一样。

如果服务器和本地位置相差超过一定的阈值,就通过瞬移来修正本地坐标。不过这只会发生在延迟很严重的情况下。

58

主题

1437

帖子

2207

积分

金牌会员

Rank: 6Rank: 6

积分
2207
发表于 2010-12-30 15:23:00 | 显示全部楼层

Re:关于网游的移动同步,请求指教!

服务器内没有自动行走,以魔兽为例大致是每一步会有发送一个位置同步的数据,点击自动行走是客户端行为,客户端在自动行走过程中也会不断的发送位置同步数据到服务器,不存在楼主服务器同步的问题。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-8 05:28

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表