使用Bullet时,物理无法通过网络正确同步


11

我正在尝试使用Bullet实现客户端/服务器物理系统,但是我在使事物同步方面遇到问题。

我实现了一个自定义运动状态,该状态可以从我的游戏对象读取和写入转换,并且可以在本地运行,但是我尝试了两种不同的网络游戏方法:

  1. 使客户端上也在服务器上的动态对象(例如,不是随机碎片和其他不重要的东西)成为运动学对象。这可以正常工作,但对象移动得不太平稳
  2. 对象在这两者上都是动态的,但是在服务器发出的每个对象移动的消息之后,我将线速度和角速度设置为服务器上的值,并使用服务器上的转换调用btRigidBody :: proceedToTransform。我也叫btCollisionObject :: activate(true); 强制更新对象。

我对方法2的意图是基本上执行方法1,但是劫持Bullet进行穷人的预测,而不是自己动手解决方法1,但这似乎行不通(原因并非100%明确我什至单步执行“项目符号”,并且有时这些对象最终会出现在不同的位置。

我朝着正确的方向前进吗?Bullet似乎内置了自己的插值代码。那可以帮助我使方法1更好地工作吗?还是我的方法2代码不起作用,因为我不小心踩了它?

编辑:我刚刚注意到的方法1的另一个问题是,碰撞响应将与非同步对象发生碰撞。动能体有时会射出无限的东西,因为它们无法被击退。


有几件事可能会帮助您得到答案:您使用的是哪种语言/引擎?什么类型的连接?与对服务器执行ping操作相比,同步缺陷有多严重?
Fibericon 2012年

2
第二个选项不起作用,因为仅在几帧后才将速度设置为服务器值,因此在每个数据包之间都有几帧可能会发生漂移的帧。我建议阅读Gaffer关于游戏物理学的所有文章,您可能应该先阅读“固定时间步长”,但这是有关网络物理学的最后一篇文章gafferongames.com/game-physics/networked-physics
Roy T.

我正在使用C ++自行开发的引擎。但是,我非常确定同步缺陷并没有那么糟,如果我不得不猜测的话,可能比ping高1帧,但我仍主要在进行仅LAN测试。我将检查这些文章,是的,您认为速度不正确是正确的。然而事情的方式了,像箱子是整个地图。不应该显式设置转换使事物最终最终一致吗?(即使还不是很漂亮,也要摇晃,等等)
卢卡斯(Lucas

我读了Gaffer的文章,内容丰富,但似乎主要涉及玩家的动作,这是我已经在进行的工作。我一直在阅读,似乎我的方法2代码实际上与虚幻引擎中使用的方法相同。他们没有提供很多细节,但是让我怀疑这个主意是否合理,但是我对Bullet的使用只是不正确的。
卢卡斯2012年

有趣的读物,部分与您的主题有关:gamasutra.com/view/feature/3094/…。它与rts有关,与物理无关,但是它们到了必须在服务器和客户端上同步模拟的地步。他们的方式呢?他们在客户端和服务器上都运行独立的模拟,但是服务器发送发送包,以确保客户端模拟不会发散并得到纠正(如果发生的话)...
tom van green

Answers:


4

您需要适当的客户端预测

您应该真正详细阅读Roy T.在他的评论中为您提供的链接。它描述了如何处理玩家输入和角色物理,但是对于“服务器驱动的物理”,其原理保持不变。

对于需要同步的游戏对象来说,这并不是一件容易的事,但可以简单地说:

  • 在服务器和客户端上运行物理过程;
  • 服务器定期发送更新;
  • 客户不断地,平稳地将其物理世界重新调整为服务器值。

因此,是的,您的方法2正朝着正确的方向发展。尽管仅覆盖值还不够,但是您会在客户端上遇到麻烦,您需要做的是平滑且连续地插值到服务器值。

对于您的实际错误,我对Bullet不熟悉,但是您可能会缺少一些值,例如,您已经设置了线性和角速度,但是您设置了加速度吗?


谢谢!这使我在正确的道路上感觉更好。我现在用细齿梳仔细检查代码。也许某些通知没有被触发,或者您说我丢失了一个值,因为方法2应该(平稳地)工作。
卢卡斯2012年

3

我个人要做的就是托管游戏的人创建虚拟世界并与客户端同步对象。即使是p2p网络方案,我仍然将物理引擎基于播放器客户端之一。

我使用的其他纯粹物理学的物理学甚至不需要同步。

在前一阵子我制作了一个名为“ boilerzerker”的原型中,我在主机上运行了物理,粒子效果(也使用物理)没有在网络上同步,而是对每个客户端都是独立的,因为它们很吸引人。


谢谢,是的,这是解决问题的一种方法。但是,它不会在客户端上对客户端所做的事情产生很好的碰撞响应,而且令人眼前一亮的东西也无法始终正确交互,因为它无法推迟服务器上的事情(至少在该时间段内)。我觉得这一定是有可能的,因为虚幻引擎和Source之类的引擎似乎做到了。
卢卡斯2012年

眼睛糖果不需要同步,可以根据每个客户端进行计算。客户端的响应是在服务器上计算的,客户端的坐标只是计算并发送回去的,您不会向客户端发送回叫它发生冲突的回调,这可能看起来很可怕。
tsturzl 2012年

2

实现网络同步物理世界是不可能的。步骤N的微小差异当然会在步骤N + 1的较大差异中施加更大的力或冲动,以使其保持同步并看起来逼真。

解决方案:-

  1. 您可以考虑仅同步几个对象,例如角色或赛车,特别是如果它们是运动学的。但是,世界上大部分地区看起来并不现实。

  2. 您可以在服务器上拥有一个物理世界,并向客户端广播对象的位置和速度。


您可以尝试通过物理学玩一些网络游戏,以查看世界不同步。例如《极品飞车世界》是免费的,具有多人游戏和基本物理技能。(道路,破坏物体放在盒)
最大

我不确定我是否会完全跟随您。我很确定这是可能的,因为许多游戏都允许玩家扔箱子(例如)。看来您的选项2与我的选项2类似,但我无法让Bullet将对象干净地捕捉到它们的服务器位置。也许那是我的根本问题?
卢卡斯2012年

1
不。通常是同步的幻觉。如果比较屏幕,则会看到当您在框中弹跳时,框会朝不同的方向飞行。或盒子根本不是物理学(纯动画)。盒子数量不同。当我说动画时,我的意思是动作背后没有物理动画。他们没有各种技巧使图片看起来有些同步,但这不是同步物理世界。您应该查看并比较它们在不同游戏中的移动方式。
2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.