首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >简单在线乒乓球网络同步

简单在线乒乓球网络同步
EN

Stack Overflow用户
提问于 2011-01-17 13:19:31
回答 1查看 4.2K关注 0票数 5

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

  1. 在服务器端,我有一个游戏对象,它存储球员和球的位置,每个对象都有它的x,y位置和x,y速度。在此基础上,在循环中更新对象的位置。在客户端,有相同的本地对象具有相同的数据,并且它也在循环中被更新。当玩家按下/释放一个整数的网络包时,
  2. 发送一个网络数据包,以便player对象开始/停止在服务器上的游戏对象中移动。
  3. 服务器每50毫秒发送一个同步包,所有三个对象的位置和速度都是相同的。当客户端收到这个包时,它相应地改变游戏对象的位置。

这种方法不能很好地工作,因为它在客户端来回移动游戏对象。有什么办法改进吗?

EN

回答 1

Stack Overflow用户

发布于 2011-01-31 18:19:07

承认你在客户端和服务器之间有30 of的延迟。客户发送“我想把球拍往下移动”,它的球拍以0.1px/ms的速度拍在y=100px上。

30毫秒后:

  • 客户端球拍位于y=100+30*0.1= 103 at
  • 服务器上,接收来自客户端的订单并开始移动球拍(目前仍位于服务器端的y=100px )

20秒后:

客户端网球拍位于105px

  • server-side =客户端球拍在y=100+20*0.1= 102 to
  • 服务器发送到客户端的新位置(102 To)

30毫秒后:

  • 客户端rarcket在y=105+30*0.1= 108 of
  • 客户端从服务器接收到的新位置:102 of

此时,客户的球拍“跳跃”从108到102 to .

如何处理网络延迟?有两种complementary方式:

在执行action

  • predict操作结果(客户端和服务器端)

之前,

  • 等待服务器认可

当对客户端的影响很难与结果链接并且不能“回滚”时,使用第一个aproach。当客户端发射导弹时,服务器在下一次更新时压制这种导弹是不可取的,因为客户端实际上没有更多的导弹库存。因此,在这种情况下,客户端应用程序只有在服务器发送许可后才会发射导弹。

第二种总是用来避免服务器同步时的“跳转”。你必须监控网络延迟来预测游戏元素的移动。这里有两种方法:在启动时计算ping或同步服务器和客户端时间(最简单和更健壮的方法)。总的想法是:

  • 客户端发送“我想在time=1265871移动球拍”,并开始移动

30毫秒后:

  • 客户端在y=100+30*0.1= 103 at
  • 服务器上接收移动并计算30 at延迟(通过ping或时差),并在y=100+latency*0.1= 100+30*0.1= 103 at

上设置球拍位置。

太棒了!它们是同步的。

20后:

  • 服务器和客户端球拍都在y=103+20*0.1= 105 at
  • 服务器上发送新的位置和方向

30毫秒后:

  • 客户端在y=105+30*0.1= 108 at
  • 客户端接收新位置和方向(105 at向下移动),计算30 at延迟时间,并在y=105+latency*0.1= 105*30*0.1= 108 at

上设置球拍位置。

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

当第一个客户端停止移动时,可以在另一个客户端上发生Desync。在这种情况下,球员的球拍将“跳跃”一点点。当这不是关键时,就有可能使这一过渡顺利进行。

希望能帮上忙。

票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4713582

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档