Networking 在网络游戏中,立即将输入发送到服务器或输入缓存中

Networking 在网络游戏中,立即将输入发送到服务器或输入缓存中,networking,multiplayer,Networking,Multiplayer,我正在编写一个网络化多人游戏,其中所有影响游戏性的输入都被保存并作为队列中的事件处理,以便能够在给定一组事件的情况下重新生成所有动作。 例如:用户按下左箭头按钮;然后,将带有“Press Left”的事件添加到队列中,以当前时间t保存,然后使用固定的时间步长执行 这些事件还被发送到服务器,服务器定期将从客户端接收到的一组事件发送到所有其他客户端,比如说每100ms发送一次。该游戏是一款快节奏的多人游戏,因此使用实体插值,如下所述: 将这些事件发送到服务器的最佳方式是什么?立即单独发送每个事件,或

我正在编写一个网络化多人游戏,其中所有影响游戏性的输入都被保存并作为队列中的事件处理,以便能够在给定一组事件的情况下重新生成所有动作。 例如:用户按下左箭头按钮;然后,将带有“Press Left”的事件添加到队列中,以当前时间t保存,然后使用固定的时间步长执行

这些事件还被发送到服务器,服务器定期将从客户端接收到的一组事件发送到所有其他客户端,比如说每100ms发送一次。该游戏是一款快节奏的多人游戏,因此使用实体插值,如下所述:

将这些事件发送到服务器的最佳方式是什么?立即单独发送每个事件,或者在客户机上保存“事件缓存”,并且在客户机上定期向服务器发送新事件列表,这样做有意义吗?我担心,如果我立即发送事件,事件的同步可能会出现问题,或者它可能会因网络上的消息过多而堵塞

事件缓存的问题是,我必须为所有内容添加额外的延迟,因为事件只能从客户端每隔n秒发送一次,然后从服务器每隔n秒发送一次。玩家从输入到执行的允许延迟是多少


我希望我已经说清楚了。

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

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

对于以这种速率进行联网,最好的选择是UDP。因为它是无连接的,所以您需要自己处理掉的或无序的数据包。根据游戏的不同,您可以将命令分为必须可靠传输的命令和不能可靠传输的命令。服务器的响应可以以更大的间隔发送(例如100ms)。回到玩家移动的例子,如果你每15毫秒发送一次坐标(让我们坐在
t
t+1
t+2
),如果你把数据包放在
t+1
上,你仍然可以插入
t
t+2
中的
t+1
值(因为服务器将每隔100毫秒做出响应)所以这种东西可以不可靠地传输。但是,如果玩家施法、使用物品或类似物品,你需要确保该消息到达服务器

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

这是一个宽泛的问题,所以这些只是一些需要考虑的问题。其中一些可能在您提供的链接中进行了解释,您也可以阅读