我正在为两个在网络上玩的玩家编写一个简单的在线乒乓球游戏。这是一个客户端服务器应用程序,服务器端有一个游戏逻辑。我在客户端的游戏同步方面有一些问题,结果非常不令人满意。它目前的工作方式如下:
这种方法不能很好地工作,因为它在客户端来回移动游戏对象。有什么办法改进吗?
发布于 2011-01-31 18:19:07
承认你在客户端和服务器之间有30 of的延迟。客户发送“我想把球拍往下移动”,它的球拍以0.1px/ms的速度拍在y=100px上。
30毫秒后:
。
20秒后:
客户端网球拍位于105px
30毫秒后:
。
此时,客户的球拍“跳跃”从108到102 to .
如何处理网络延迟?有两种complementary方式:
在执行action
之前,
当对客户端的影响很难与结果链接并且不能“回滚”时,使用第一个aproach。当客户端发射导弹时,服务器在下一次更新时压制这种导弹是不可取的,因为客户端实际上没有更多的导弹库存。因此,在这种情况下,客户端应用程序只有在服务器发送许可后才会发射导弹。
第二种总是用来避免服务器同步时的“跳转”。你必须监控网络延迟来预测游戏元素的移动。这里有两种方法:在启动时计算ping或同步服务器和客户端时间(最简单和更健壮的方法)。总的想法是:
30毫秒后:
上设置球拍位置。
太棒了!它们是同步的。
20后:
30毫秒后:
上设置球拍位置。
再次,客户端和服务器是同步的!
当第一个客户端停止移动时,可以在另一个客户端上发生Desync。在这种情况下,球员的球拍将“跳跃”一点点。当这不是关键时,就有可能使这一过渡顺利进行。
希望能帮上忙。
https://stackoverflow.com/questions/4713582
复制相似问题