金庆的专栏

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  418 随笔 :: 0 文章 :: 454 评论 :: 0 Trackbacks
利用惯性和加速度进行网游位置同步

带宽限制下的视觉实体属性传播
(Propagation of Visual Entity Properties Under Bandwidth Constraints)
(http://blog.csdn.net/lfhfut/archive/2008/03/02/2138512.aspx)
一文中使用滞后补偿时间(LCT, Lag Compensation Time)来平滑客户端的显示.

在此方法下, 客户端主角显示在未来位置, 超前于服务器时间,
而同伴显示过去的位置, 滞后于服务器时间.
所以两个人一齐跑时, 总是会发现同伴落后于自己.

为了减弱同伴落后问题, LCT应该用于远方物体的位置同步, 越远LCT可以越大.
就像我们观察星星, 我们看到是其实是几万年前星星的样子, 因为星星距离我们有几万光年.
对于周围近距离的物体, LCT应该尽量小, 接近0.

所以上文并没有解决客户端的平滑问题.

文中所述的导航预测算法(DR, Dead Reckoning)并不应该放弃.
导航预测算法的原理是推算出未来的位置,LCT是将过去的位置作为现在位置来处理.
对于邻近物体, 应该显示未来的位置.
因为出于操作感的考虑, 主角的位置是超前于服务器的, 不可能等服务器确认后再移动.
所以周围同伴的位置也应该是超前的, 这样才不会有同伴总是落后于自己的现象.

导航预测算法不适用的主要原因是, 网游人物的移动是高度随机的, 状态更新太频繁.
这其实不是问题, 因为有预测肯定比没有预测要好.
在预测范围内, 就不必发位置更新.
最差情况下, 每个预测结果都是错误的, 必须修正为实际的位置,
这就退化成为没有预测的简单的位置更新方法.

但是如果网络延时50ms, 这50ms的预测是必须的.
因为客户端表现的是超前服务器50ms前的景象.

这就存在同伴掉下悬崖的现象, 因为同伴在悬崖边上的停止的消息要在50ms后才到.
这种问题在预测法中是无法解决的, 除非添加行为预测.

但是可以添加一个加速度来减少这种预测错误.
导航预测算法适用于飞机飞行模拟这类具有很大惯性的移动.
网游中的移动问题根源就是惯性不足, 有了惯性, 角色将无法任意更改移动状态,
从而大大减少预测错误.

人物在悬崖边上停止的动作必须有个减速的过程, 只要在50ms之前减速,
就会正确计算出停止点, 避免了坠崖. 开始移动时也是有个加速过程.

并且, 客户端主角的惯性可以大于服务器端, 而周围物体的惯性可以小于服务器端.
产生的效果是, 主角的动作变迟钝, 减少超前时间.
而周围物体稍稍灵活, 增加了超前时间.

或许我们所处的世界也是虚拟的, 创世者为了位置同步而给我们这个世界加上了惯性和加速度的规则.

(转载请注明来源于金庆的专栏)


posted on 2009-10-30 15:54 金庆 阅读(2497) 评论(5)  编辑 收藏 引用 所属分类: 2. 网游开发

评论

# re: 利用惯性和加速度进行网游位置同步 2009-10-30 23:36 陈昱(CY)
学习了,目前在尝试休闲的小游戏,按文章所说的用LCT,但仍然不时会小小延迟,于是也加了点惯性,这样一来游戏是平滑了,但是操作反应和手感.....  回复  更多评论
  

# re: 利用惯性和加速度进行网游位置同步 2009-11-02 10:17 heweitykc
经典!!  回复  更多评论
  

# re: 利用惯性和加速度进行网游位置同步 2010-07-27 02:01 yisa
目前 WOW仍然没有使用航位推演, 而很可能是鉴于"LCT"的复原;
但是 除了WOW 别的游戏(可以算上tianxia2, 剑w三)的同步实在不敢恭维,
不知道 KOK3用了什么, 结果怎么样  回复  更多评论
  

# re: 利用惯性和加速度进行网游位置同步 2010-07-27 10:13 金庆
@yisa
kok3中有导航预测,也有滞后补偿时间,所以有同伴落后问题。网络卡时,会有人物被拉回的现象。这一部份一直在改进,现在已经很不错了,正常情况下感觉真实性很好。  回复  更多评论
  

# re: 利用惯性和加速度进行网游位置同步 2010-08-03 17:14 yisa
@金庆
今天让策划打开了两个KOK3(第一次看KOK3)的客户端
感觉移动速度比较慢
人物一直按住向前走(W按键),
外地客户端表现上: 中间会出现突然一停, 然后继续走
是不是 因为心跳包的缘故.
"同伴落后问题", 只要是本地先移动 都这样.
KOK3的移动操作在外地客户端的执行跟本地客户端之间的时差很小,
感觉不到0.5s.

其他感受:
上台阶的时候的跳跃: 如果人物在空中, 因为前方地表突然变高, 人物在空中的高度突然被台高了, 感觉不舒服(这个问题和同步无关)

下落着地的时候, 似乎没有对如果在继续移动还是停止移动没有分开处理, 感觉不好. 人物表现稍微死板了点.

移动中, 起跳, 然后释放移动按键, 突然在空中把水平移动速度变成0(但是: 原地起跳, 在空中按下移动键没有任何移动), 操作上, 前者感觉太突然.

可能因为2D的移动操作, 单纯在位移同步上感觉比天下二和剑三要好, 但是移动操作的本地感觉没有后两者舒服.

点击移动的指示效果, 怎么马上消失掉了, 狂点击, 指示效果一连片哈.(怪怪)

怪物的追击感觉没有.(可以参考Mangos)

移动能取消太多的行为了: 自动攻击, NPC对话...(不知道是不是被策划束缚了)



  回复  更多评论
  


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理