Networking 多人台球游戏物理模拟

Networking 多人台球游戏物理模拟,networking,game-physics,Networking,Game Physics,我正在构建一个在线多人台球游戏,我正在努力思考多人物理模拟的最佳方法。我已经想到了三种可能的场景,每种场景都有自己的优点和缺点,我想听听那些已经实现了类似功能或有多人在线游戏经验的人的一些看法 第一个场景:客户端的物理模拟:玩家轮流拍摄镜头,将镜头角度和功率发送到服务器,服务器用这些值更新所有客户端,以便它们可以独立模拟镜头 优点: 低服务器过热 缺点: 同步问题。客户端必须模拟精确的模拟,而不考虑其帧速率。可以用一些聪明的算法来解决,比如 作弊。玩家可以通过调整物理引擎来作弊。可以确定在投篮结

我正在构建一个在线多人台球游戏,我正在努力思考多人物理模拟的最佳方法。我已经想到了三种可能的场景,每种场景都有自己的优点和缺点,我想听听那些已经实现了类似功能或有多人在线游戏经验的人的一些看法

第一个场景:客户端的物理模拟:玩家轮流拍摄镜头,将镜头角度和功率发送到服务器,服务器用这些值更新所有客户端,以便它们可以独立模拟镜头

优点:

低服务器过热 缺点:

同步问题。客户端必须模拟精确的模拟,而不考虑其帧速率。可以用一些聪明的算法来解决,比如 作弊。玩家可以通过调整物理引擎来作弊。可以确定在投篮结束时与其他球员的球位进行比较的时间。如果桌上只有两名球员,即不是名人,那么作弊者是谁? 第二种情况:

在一个“主”客户机上进行物理模拟,例如,谁曾经拍摄过照片,然后向其他人广播每个物理步骤

优点:

同步没有问题。 缺点:

1.服务器过热。每一步,“主”客户端都会将所有球的坐标发送给服务器,服务器必须将它们广播给房间里的所有其他人。 2.被“大师”玩家欺骗仍然是可能的

第三个场景:物理将在服务器上模拟

优点:

不可能作弊,因为模拟是独立于客户端运行的。 没有同步问题,一次模拟意味着每个人都将看到相同的结果事件,如果不是因为网络延迟而在同一时间看到 缺点:

巨大的服务器过载。服务器不仅必须每秒计算物理30/60次,因为每个桌子可能同时有100张桌子,而且还必须向房间里的每个人广播所有坐标。 编辑 一些类似于我正在制作的游戏,以防有人熟悉他们如何克服这些问题:

http://apps.facebook.com/flash-pool/
http://www.thesnookerclub.com/download.php
http://gamezer.com/billiards/

我认为第三个是最好的

但是,如果您在每次碰撞和移动之前计算服务器中的所有碰撞和移动,然后将它们发送给客户端,那么您可以做得更好。。。然后客户端只需执行它们

如果你这样做,你将只发送信息一次,每一杆,这将大大减少网络问题

正如JimR所写,你应该使用速度或运动方程,而不是像龙格-库塔法那样一步一步的增量模拟

服务器发送给客户端的信息如下所示:

Blackball hit->move from x1,y1 to x2,y2 until time t1
Collision between blackball and ball 6 at time t1
Ball 6 -> move from x3,y3 to x4,y4 until time t3
Blackball -> move from x5,y5 to x6,y6 until time t4
Collision between Ball 6 and Ball 4 at time t3
and so on until nothings move anymore

此外,您可能需要一组表示不同物理方程的类,并有一种方法将它们序列化以发送给客户端Java或C可以轻松地序列化对象。

我认为第三个是最好的

但是,如果您在每次碰撞和移动之前计算服务器中的所有碰撞和移动,然后将它们发送给客户端,那么您可以做得更好。。。然后客户端只需执行它们

如果你这样做,你将只发送信息一次,每一杆,这将大大减少网络问题

正如JimR所写,你应该使用速度或运动方程,而不是像龙格-库塔法那样一步一步的增量模拟

服务器发送给客户端的信息如下所示:

Blackball hit->move from x1,y1 to x2,y2 until time t1
Collision between blackball and ball 6 at time t1
Ball 6 -> move from x3,y3 to x4,y4 until time t3
Blackball -> move from x5,y5 to x6,y6 until time t4
Collision between Ball 6 and Ball 4 at time t3
and so on until nothings move anymore

此外,您可能需要一组表示不同物理方程的类,并有一种方法将它们序列化以发送给客户端Java或C可以轻松地序列化对象。

另一种方法是传输速度/矢量,并且仅在与轨道、另一个球等发生碰撞时重新传输。。。此外,我接触过的几款在线游戏在最终位置上达成了一致,一旦运动停止,就会将所有东西扭曲到正确的位置。谢谢你的提示。从我所看到的情况来看,这种方法可以集成到场景1中,以确保两个模拟是同步的,并防止作弊。想到的另一种方法是传输速度/矢量,并且仅在与轨道、另一个球等发生碰撞时重新传输。。。此外,我接触过的几款在线游戏在最终位置上达成了一致,一旦运动停止,就会将所有东西扭曲到正确的位置。谢谢你的提示。从我所看到的,这种方法可以集成到场景1中,以确保两个模拟是同步的,并防止作弊。这是一个很好的解决方案,可以解决我的大部分问题。我唯一担心的是为了发送deta
首先将镜头的ils发送到服务器,即镜头角度和功率,并让服务器计算镜头,然后将其发送回客户端将需要一些时间,这可能会破坏游戏体验,具体取决于服务器的速度。我正在构建一个类似于的游戏,我想知道他们是如何做到的…为了避免破坏体验,你可以做的是在计算完第一个动作后立即将其发送给客户,然后在完成完整计算后发送其余的动作,或者在计算时发送。或者,进行射击的玩家可以计算并执行自己的物理。完成后,它可以获取服务器的数据,以确保球位于正确的位置。如果不是由于浮点错误,可能只是重新定位球,因为它们在服务器中。这样的话,射击运动员应该仍然有一个良好的外观和感觉。因为这是一个游戏,也许你会得到更多的信息,如果你问这是一个伟大的解决方案,这将解决我的大部分问题。我唯一担心的是,为了先将镜头的细节发送到服务器,即镜头角度和功率,并让服务器计算镜头,然后再将其发送回客户端,可能需要一些时间,这可能会破坏游戏体验,具体取决于服务器的速度。我正在构建一个类似于的游戏,我想知道他们是如何做到的…为了避免破坏体验,你可以做的是在计算完第一个动作后立即将其发送给客户,然后在完成完整计算后发送其余的动作,或者在计算时发送。或者,进行射击的玩家可以计算并执行自己的物理。完成后,它可以获取服务器的数据,以确保球位于正确的位置。如果不是由于浮点错误,可能只是重新定位球,因为它们在服务器中。这样的话,射击运动员应该仍然有一个良好的外观和感觉。因为这是一个游戏,也许你会得到更多的信息,如果你问的话