gpt4 book ai didi

synchronization - 简单的在线乒乓游戏网络同步

转载 作者:行者123 更新时间:2023-12-04 16:32:30 24 4
gpt4 key购买 nike

我正在为两个通过网络玩的玩家编写一个简单的在线乒乓球游戏。它是一个客户端-服务器应用程序,在服务器端有一个游戏逻辑。我在客户端的游戏同步有一些问题,结果很不令人满意。这是它目前的工作方式:

  • 在服务器端,我有一个存储玩家和球位置的游戏对象,每个对象都有它的 x、y 位置和 x、y 速度。基于对象的位置在循环中更新。
    在客户端有相同的本地对象具有相同的数据,并且它也在循环中更新。
  • 当玩家按下/释放向上或向下时,客户端发送一个整数的网络数据包,使玩家对象开始/停止在服务器上的游戏对象中移动。
  • 服务器每 50 毫秒发送一个同步数据包,其中包含所有三个对象的位置和速度。当客户端收到此数据包时,它会相应地更改游戏对象的位置。

  • 这种方法不能很好地工作,因为它在客户端来回移动游戏对象。任何想法如何改进它?

    最佳答案

    承认您在客户端和服务器之间有 30 毫秒的延迟。
    客户端发送“我想把我的 Racket 向下移动”,它的 Racket 在 y=100px 处,速度为 0.1px/ms

    30ms 秒后:

  • 客户端 Racket 在 y=100+30*0.1= 103px
  • 服务器收到客户端的命令并开始移动 Racket
    (目前在服务器端仍为 y=100px)

  • 20ms 秒后:
  • 客户端 Racket 在 y=103+20*0.1 = 105px
  • 服务器端客户端 Racket 在 y=100+20*0.1= 102px
  • 服务器向客户端发送新位置 (102px)

  • 30ms 秒后:
  • 客户端 Racket 在 y=105+30*0.1= 108px
  • 客户端从服务器接收 Racket 的新位置:102px

  • 此时,客户端 Racket 从 108 像素向后“跳”到 102 像素......

    如何应对网络延迟?
    两个 补充方法:
  • 在执行操作之前等待服务器确认
  • 预测操作的结果(在客户端和服务器端)

  • 当对客户端的影响与结果几乎没有联系并且无法“回滚”时,使用第一种方法。示例:当客户端发射导弹时,由于客户端实际上没有更多的导弹库存,因此该导弹在下次更新时被服务器抑制是不可否认的。所以在这种情况下,客户端应用程序只会在服务器发送确认后发射导弹。

    第二个总是用于在服务器同步时避免这些“跳转”。您必须监控网络延迟以预测游戏元素的移动。这里有两种方法:在启动时计算 ping 或同步服务器和客户端时间(最简单和更健壮的方法)。
    总体思路是:
  • 客户发送“我想在时间=1265871 向下移动我的 Racket ”并开始移动

  • 30 毫秒后:
  • y=100+30*0.1= 103px
  • 的客户端 Racket
  • 服务器接收移动并计算 30ms 延迟(通过 ping 或时间同步差异)并将 Racket 位置设置为 y=100+latency*0.1=100+30*0.1=103px

  • 完美的!它们是同步的。

    20 毫秒后:
  • 服务器和客户端都在 y=103+20*0.1= 105px
  • 服务器发送新位置和方向

  • 30 毫秒后:
  • y=105+30*0.1= 108px
  • 的客户端 Racket
  • 客户端接收新位置和方向(向下移动 105px),计算 30ms 延迟并将 Racket 位置设置为 y=105+latency*0.1= 105*30*0.1= 108px

  • 再次,客户端和服务器是同步的!

    当第一个客户端停止移动时,可能会在另一个客户端上发生不同步。在这种情况下,球员的 Racket 会“跳跃”一点。如果这不是关键,则可以平滑此过渡。

    希望它会有所帮助。

    关于synchronization - 简单的在线乒乓游戏网络同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4713582/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com