在网络游戏中定期将输入发送到服务器或输入缓存中

时间:2015-01-19 02:45:41

标签: networking multiplayer

我正在编写一个联网的多人游戏,其中影响游戏玩法的所有输入都被保存并作为队列中的事件处理,以便能够在给定一组事件的情况下重新生成所有动作。 例如:用户按下左箭头按钮;然后是"按左键"被添加到队列中,以当前时间t保存,然后使用固定的时间步长http://gafferongames.com/game-physics/fix-your-timestep/执行。

这些事件也被发送到服务器,该服务器定期将从客户端收到的一组事件发送给所有其他客户端,让我们说每100毫秒。游戏是一个快节奏的多人游戏,因此如下所述使用实体插值:http://www.gabrielgambetta.com/fpm3.html

将这些事件发送到服务器的最佳方法是什么?是立即单独发送每个事件还是保存一个"事件缓存"是否有意义?在客户端上,还在客户端上定期向服务器发送新事件列表?我担心如果我立即发送事件会导致事件同步,或者它可能会因为网络上的过多消息而以某种方式堵塞。

事件缓存的问题在于我必须为所有内容添加额外的延迟,因为事件只会每隔n秒从客户端发送一次,然后每隔n秒从服务器发送一次。对于玩家来说,输入的容忍延迟是多少?执行它?

我希望我已经清楚了。

1 个答案:

答案 0 :(得分:2)

可接受的延迟实际上取决于游戏的类型。对于快节奏的游戏(例如FPS),你会希望延迟尽可能低,我认为在这种情况下任何不直接的事都是不可接受的。

您应该以固定的时间间隔向服务器发送更新,但如果可以,请降低它们,比如15-20ms。在更新间隔之间,您将缓冲命令(事件)。我不知道它究竟是什么类型的游戏,但最好是在客户端上计算对象状态(并立即显示),然后将状态发送到服务器进行验证。例如,如果我们谈论玩家移动,你会发送当前坐标和速度向量,服务器将检查提供的新坐标是否有效(是否可以从前一点到达)。在此期间,您将在客户端中显示新坐标,并在服务器响应后根据需要进行更正。

对于那些速率的网络,最好的选择是UDP。由于它是无连接的,您需要自己处理丢弃或无序的数据包。根据游戏的不同,您可以将命令分类为必须可靠传输的命令和不可传输命令的命令。可以以更大的间隔(例如100ms)发送来自服务器的响应。回到玩家动作的示例,如果你每隔15毫秒发送一次坐标(让我们坐在tt+1t+2),如果你将数据包丢弃在t+1你仍然可以插入来自t+1t的{​​{1}}值(因为服务器将以100毫秒的间隔响应),以便可以不可靠地传输这类内容。但是如果玩家施放了一个咒语,则使用一个物品或类似的东西来确保该消息到达服务器。

您对同步和数据包丢失的担忧是有效的,但在这两种情况下,这些事情都可能(并且会不时发生)。无论如何,我认为丢弃一个包含一个或两个事件(更小的间隔)的数据包比丢弃一个包含数十个数据包的数据包更好。此外,在大多数使用QoS较小数据包的网络配置中,丢弃或延迟的可能性较小。此外,根据您发送到服务器的数据,所需的带宽量可能不会那么大。

这是一个广泛的问题,所以这些只是需要考虑的事情。其中一些可能在您提供的链接中有解释,您也可以阅读this