首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在网络上同步时钟以进行游戏开发?

如何在网络上同步时钟以进行游戏开发?
EN

Software Engineering用户
提问于 2013-06-16 23:48:09
回答 3查看 4.4K关注 0票数 10

我正在写一个游戏,有很多基于时间的方面。当网络中断和数据包没有通过时,我使用时间来帮助估计玩家的位置(以及数据包被接收和不接收之间的时间)。这是一个pacman类型的游戏,意思是玩家选择一个方向,不能停止移动,所以这个系统是有意义的(至少我认为是这样)。

因此,我有两个问题: 1)由于网络存在延迟,我如何同步游戏开始时的时钟。2)不对它们进行同步,只假设它们是相同的(我的代码与时区无关),这样做可以吗?这不是一个超级竞争的游戏,人们会改变他们的时钟作弊,但仍然。

这个游戏正在用Java和Python编程(并行开发作为一个项目)。

EN

回答 3

Software Engineering用户

发布于 2013-06-17 09:41:38

我认为在系统中同步时钟绝对是不可以的。用户不希望您触摸系统设置,而且许多系统甚至不允许您这样做。

您所需要的只是有一个相关性,以将时间戳从一方的时钟转换为另一方的时钟。另一方面,如果你想用它来预测球员的位置的话,你需要这个相关性来更精确,比如说至少是百分之一秒。系统时钟不会在随机机器之间有如此好的关联。因此,您应该自己建立相关性,使用NTP主题上的一些变化,可能会嵌入到其他消息中,以节省网络带宽。

基本思想可能是,在您发送的每个数据包中,您发送的时间戳以及从另一方收到最后一个数据包时的序列号和时间戳。由此计算往返:例如,如果数据包Q表示它是在1000发送的,而数据包P是在500收到的,那么如果您在0发送了数据包P,并且在800接收到了q,那么往返的往返时间是(800-0)-(1000-500)= 300。不可能知道不对称度,所以你只需要假设包在两个方向上都会有一半(150)的滴答。这个远程时间戳比本地时间提前1000 -(800-150)= 350刻度。往返时间各不相同.如果你认为时钟是相当精确的,你应该使用一个长期平均值的相关性。

请注意,您也不想为时钟使用系统时钟。他们可能会在中途重新同步,让你偏离轨道。您应该在Unix上使用clock(CLOCK_MONOTONIC),在Windows上使用GetTickCount (目前不确定这些API是如何用Java或Python包装的)。

注意:SO_TIMESTAMP套接字选项(请参阅ott- in注释中提到的插座(7) )将有助于分离接收数据包的事件循环的延迟效应。这是否值得,这取决于你需要多好的精确度。

票数 9
EN

Software Engineering用户

发布于 2013-06-18 15:03:43

你怎么知道哪个球员的钟是正确的?你不需要,所以使用参考时钟。

NTP在这里太过分了--你只需要1秒的精度--所以使用雷达或者从多个时钟同步算法。中挑选一些东西。

你已经选择了一个方法,让每个玩家的机器按照这个方法来获取时间(而不改变他们的系统时钟)。无论参考UTC时间和玩家的系统时钟UTC时间有什么不同,它们的有效偏移量都是UTC时间。任何时候,你做时间相关的计算,例如推断机器人的移动或射线跟踪子弹,你考虑这个偏移后,得到系统的时间。使用UTC将消除时区因素。

票数 1
EN

Software Engineering用户

发布于 2013-06-18 16:18:37

我第二次声明,您不应该为此使用NTP或接近系统时钟。如果您实际检查了这个需求,您会发现您有以下需求:

  • 从上一帧到现在已经过去了多长时间,这样您就可以提前处理任何基于时间的东西了。如果客户端和服务器都以不同的速率运行(例如,有时您可能看到服务器以固定的20 as (或其他什么)运行,但客户机允许以他们希望的速度运行),这可能是不同的。
  • 自当前地图开始以来已经过去了多长时间。这是一个基于零的计时器(在客户端和服务器启动时将其输入到0),服务器时间被认为是“主”,因此服务器将这个时间的当前视图发送给在服务器上运行的每个帧的客户端。这可以通过获取当前服务器的时间并减去服务器启动的时间,或者通过积累上面的每帧时间来实现。上述客户端每帧时间也可用于生成任意两个连续服务器帧之间的插值点。
  • 一个引用“基准时间”,所有其他时间都从它开始;在客户端和服务器上都可以(但不是绝对需要对所有游戏类型)进行相同的引用,并且在游戏开始时(或当前的地图)初始化,但在游戏开始后从未更改(除非启动了新游戏--或新地图)。

这是一个简化的大纲--我不试图处理诸如延迟/丢弃数据包/等问题--但这是整个事件应该基于的基本框架。

所有这些都不需要接近系统时钟,也不需要关注诸如不同时区之类的问题,尽管最后一项可能使用某个时区(如果需要的话)。重要的是,实际经过的时间是用高分辨率的基于零的计时器来测量的,所以它们完全不知道时区的差异。要在服务器上找到实际的当前时间吗?只要将它经过的时间添加到它的参考基准时间中,就可以得到它了。客户也是如此。

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

https://softwareengineering.stackexchange.com/questions/201756

复制
相关文章

相似问题

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