我正在为在网络上玩的两个玩家编写一个简单的在线乒乓球游戏。它是一个客户端 - 服务器应用程序,在服务器端具有游戏逻辑。我在客户端有一些游戏同步问题,结果非常不满意。这就是它目前的工作方式:
这种方法不能很好地工作,因为它在客户端来回移动游戏对象。任何想法如何改进它?
答案 0 :(得分:17)
承认客户端和服务器之间的延迟为30毫秒。 客户发送“我想把我的球拍向下移动”,它的球拍是y = 100px,速度为0.1px / ms
30ms后:
30ms后:
此时,客户端球拍从108跳转到102px ......
如何应对网络延迟? 两种互补方式:
当客户端上的效果几乎与结果无关并且无法“回滚”时,将使用第一个aproach。例如:当一个客户射击导弹时,它不能说明这个导弹在下一次更新时被服务器压制,因为客户实际上没有更多的导弹库存。因此,在这种情况下,客户端应用程序将仅在服务器发送确认后启动导弹。
第二个用于在服务器同步时避免这些“跳转”。您必须监视网络延迟以预测游戏元素的移动。这里有两种方法:在启动时计算ping或同步服务器和客户端时间(最简单,更健壮的方式)。 一般的想法是:
30ms后:
完美!它们是同步的。
20ms后:
30ms后:
同样,客户端和服务器同步!
当第一个客户端停止移动时,可以在另一个客户端上发生Desync。在这种情况下,球员球拍将“跳跃”一点点。如果这不重要,可以平滑这种转变。
希望它会有所帮助。