2012-04-01 83 views
2

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

1号方案:在客户端上物理模拟:在打开播放器采取了一枪发射击和服务器电源的角度,以及服务器更新所有的客户提供这些价值,使他们能够模拟射击独立。

优点:

  1. 低服务器过热

缺点:与同步

  1. 问题。无论客户的帧频如何,客户都必须模拟精确的模拟。 (可能用一个像描述的一些巧妙的算法来解决here
  2. 作弊。玩家可以通过调整物理引擎来作弊。 (可以确定使得在拍摄与其他球员的球位置结束的比较时,如果只有两名球员都在表(即不spectaculars)的骗子是那么谁?)

第二个场景:

对一个(即“主”)客户端(例如,谁拍摄过的人)进行物理模拟,然后将每个物理步骤广播给其他人。

优点:

  1. 没有问题同步。

缺点:

1.Server过热。每个时间步骤,“主”客户端将把所有球的坐标发送到服务器,服务器将不得不将它们广播给房间中的其他人。 2.“主人”玩家的作弊仍然有可能。

3rd场景:物理将在服务器上模拟。

优势:

  1. 没有可能作为模拟运行独立客户端的欺骗。
  2. 不同步的问题,一个模拟意味着每个人都将看到同样的结果(事件如果不是因为在网络滞后的同时)

缺点:

  1. 巨大的服务器超载。不仅服务器必须每秒钟为每个桌子计算30/60次物理(可能同时有100个桌子),而且还必须将所有坐标广播到房间中的每个人。

编辑 一些类似的游戏一个我做,万一有人熟悉他们是如何克服这些问题:

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

想到的另一种方法是传输速度/矢量,并且仅在与铁轨,另一个球等发生碰撞时重新传输......另外,我已经接触到的几个在线游戏在最终达成一致一旦运动停止,将所有的东西都放到正确的位置。 – JimR 2012-04-01 17:58:27

+0

感谢您的提示。从我所看到的情况来看,这种方法可以集成到方案1中,以确保两种模拟是同步的并防止作弊。 – Alex 2012-04-01 18:32:14

回答

0

我认为,第三一个是最好。

但是,如果您在将服务器发送给客户端(每次碰撞和移动等)之前计算服务器中的所有冲突和移动,那么您可以做得更好,那么客户端必须“执行”它们。

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

而作为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#可以很容易地将对象序列化)。

+0

这是一个很好的解决方案,它可以解决我的大部分问题。我唯一担心的是,为了将镜头的细节首先发送到服务器(即镜头和电源的角度),并且有服务器来计算镜头,然后将其发送回客户端需要一些时间,这可能会破坏游戏的体验(取决于服务器的速度)。我正在构建一个类似于[这个]的游戏(http://apps.facebook.com/flash-pool/?ref=ts),我想知道他们是如何做到的... – Alex 2012-04-01 18:35:30

+0

你能为避免打破这种经历,您需要在计算完成后立即向客户端发送第一个动作,然后在完成完整计算后发送其余动作(或在计算它们时发送它们)。 或者,执行拍摄的玩家可以计算并执行自己的物理。当它完成后,可以通过服务器的数据来确保球位于正确的位置。如果不是(由于浮点错误,也许)只是重新定位球在服务器中的位置。 这样的射击球员应该仍然有良好的外观和感觉。 – Mesop 2012-04-01 18:46:05

+0

伟大的提示,谢谢!在我开始设计设计之前,只要等待看看其他人是否会添加一些东西...... – Alex 2012-04-01 19:12:22