多人台球游戏物理模拟

时间:2012-04-01 17:50:13

标签: networking game-physics

我正在建立一个在线多人桌球游戏,我很难想到多人物理模拟的最佳方法。我想到了三个可能的场景,每个场景都有自己的优点和缺点,我想听听那些已经实现了类似内容或有多人在线游戏经验的人的意见。

第一个场景:客户端上的物理模拟:玩家轮流拍摄,然后将镜头和电源的角度发送给服务器,服务器会使用这些值更新所有客户端,以便他们可以独立模拟镜头。

优点:

  1. 服务器过热低
  2. 缺点:

    1. 同步问题。无论帧速率如何,客户端都必须模拟精确的模拟。 (可以用一些聪明的算法来解决,比如描述here
    2. 作弊。玩家可以通过调整物理引擎来作弊。 (可以确定何时在击球结束时与其他球员的球位置进行比较。如果桌上只有两名球员(即不是观众),那么骗子是谁?)
    3. 第二种情景:

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

      优点:

      1. 同步没问题。
      2. 缺点:

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

        第3种场景:物理将在服务器上进行模拟。

        优势:

        1. 由于模拟独立于客户运行,因此无法作弊。
        2. 没有同步问题,一次模拟意味着每个人都会看到相同的结果(如果不是因为网络滞后而同时发生的事件)
        3. 缺点:

          1. 巨大的服务器超载。对于每个表,不仅服务器必须每秒计算物理量30/60次(可能同时有100个表),而且还必须向房间中的每个人广播所有坐标。
          2. 修改 我正在制作一些类似的游戏,以防有人熟悉他们如何克服这些问题:

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

1 个答案:

答案 0 :(得分:0)

我认为第三个是最好的。

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

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

正如JimR所写,你应该使用速度或运动方程而不是通过小步增量模拟(如Runge-Kutta方法)做一小步

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

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#可以轻松地序列化对象)。