通过网络连接进行命中检测的策略,如Quake或其他FPS游戏

时间:2009-12-14 02:14:23

标签: networking tcp udp

我正在了解各种网络技术,特别是UDP和TCP协议。

我已多次读过像Quake这样的游戏使用UDP,因为“如果你错过导弹等的位置更新包并不重要,因为下一个数据包会把导弹放到需要它的位置。“

这个思维过程在物体的飞行路径上都很好,但是当导弹到达它的目标时它并不好。如果一台计算机收到导弹到达预定目标的消息,但该数据包被丢弃在另一台计算机上,则会造成一些麻烦。

显然,在像Quake这样的游戏中,这种类型的事情并没有真正发生,那么他们使用什么策略来确保每个人都与瞬时类型事件同步,例如碰撞?

3 个答案:

答案 0 :(得分:4)

您已经确定了两种不同的信息:

  • 可以安全地错过的更新,因为它们携带的信息将在下次更新时提供;
  • 更新无法错过,因为他们携带的信息不属于下一次定期更新。

你是对的 - 游戏通常做的是在协议中分离这两种消息,并要求第二种类型的确认和重传,但不是第一种类型。 (如果基础IP协议是UDP,则需要在更高层提供这些确认/重传。)

答案 1 :(得分:1)

当你说“显然没有发生”时,你显然没有在有损连接上玩游戏。控制台人群中的一个流行技巧是在以太网连接的接收线上设置一个开关,这样你就可以让你的控制台暂时停止接收数据包,所以每个人都很好,仍然可以让你全部拍摄。

可能发生的原因是控制台确定射击是否是命中,并将该信息传递给对手。这确保了可以确定性地确定不同步或滞后命中数据。即使远端不认为射击是一次打击,它应该足够接近它看起来并不可怕。它的工作方式合理,除了我上面提到的。当然,如果你认为你的球员没有作弊,这种方法非常合理。

答案 2 :(得分:0)

我不是专家,但似乎有两种方法可以采取。让客户决定它是否是一个命中(允许作弊),或让服务器决定。

对于前者,如果你射击子弹,它看起来像一击,它将算作一击。在其他人收到这些数据之前可能会有一点延迟(也就是说,你可能会打一个人,但他们仍然可以玩半秒钟,然后就死了)。

对于后者,只要服务器收到您弹射子弹的信息,它就可以使用当前拥有的任何位置来确定是否有命中,然后发送该数据回来给你。这意味着在您将数据发回给您之前,您和受害者都不会知道您是否被击中。

我想要“平滑”它让你让客户自己决定,然后如果服务器输入并说“不,那没有发生”它就会纠正。我认为这可能意味着玩家会恢复生机,但我认为将生命设置为0会更有意义,直到你得到一个明确的答案,这样你就不会有奇怪的图形化。

至于确保服务器/客户端已收到该事件......我想还有两种方法。让服务器/客户端回答“是的,我收到了活动”或完全忘记了事件,只考虑状态方面的一切。没有“热门”事件,只有HP之前和之后。迟早,它将获得最新的状态。