Javascript 客户机-服务器实现:哪个增量时间?

Javascript 客户机-服务器实现:哪个增量时间?,javascript,node.js,server,game-loop,anti-cheat,Javascript,Node.js,Server,Game Loop,Anti Cheat,以每秒更新次数60次的服务器为例,该服务器可以随时接收客户端输入,将其存储在阵列中,并在下次更新时处理所有输入。一旦处理完毕,数组将清空。服务器可能会延迟,每秒更新少于60次。 为了防止作弊,处理输入时需要:player.x+=speed*deltaTime 问题是找到正确的deltaTime 如果是每个服务器滴答声之间的延迟时间,当服务器延迟时,玩家将移动得更快,或者如果玩家发送的输入比其他玩家多,则玩家可以作弊(移动得更快) 如果客户机发送输入的时间戳,我们可以在连续的相同输入之间获取增量时

以每秒更新次数60次的服务器为例,该服务器可以随时接收客户端输入,将其存储在阵列中,并在下次更新时处理所有输入。一旦处理完毕,数组将清空。服务器可能会延迟,每秒更新少于60次。 为了防止作弊,处理输入时需要:player.x+=speed*deltaTime

问题是找到正确的deltaTime

如果是每个服务器滴答声之间的延迟时间,当服务器延迟时,玩家将移动得更快,或者如果玩家发送的输入比其他玩家多,则玩家可以作弊(移动得更快)

如果客户机发送输入的时间戳,我们可以在连续的相同输入之间获取增量时间(但第一个输入的增量时间等于0)。但是,玩家可以再次发送另一个时间戳来作弊

解决方案

多谢各位


编辑:另外,还有一个客户端预测,它在两个刻度之间使用一个deltaTime。

我认为您的服务器不应该在deltaTime上运行。您的客户端应该通过插值来适应网络延迟问题,而您的服务器应该在更新时处理更新-欺诈预防应该用不同的方法来处理。这是一个解决方案,但如果我有一个客户端和权威服务器呢?模拟在每个帧之间都有一个增量。例如,客户机将输入发送到服务器,将其(与deltaTime一起)存储在一个数组中并计算预测状态,服务器处理它,并在100毫秒后将权威状态与最后处理的输入一起发送给客户机。客户机接收它,应用这个旧状态,并重新应用来自这个状态的所有下一个输入。问题是服务器和客户端都有不同的deltaTime…你不能期望两个不同的设备(甚至是你的NodeJS应用的实例)有相似的计时。deltaTime是指用于渲染的每帧之间的时间-您的服务器不应该有帧速率,因为它不应该显示任何帧。我认为您的服务器不应该在deltaTime上运行。您的客户端应该通过插值来适应网络延迟问题,而您的服务器应该在更新时处理更新-欺诈预防应该用不同的方法来处理。这是一个解决方案,但如果我有一个客户端和权威服务器呢?模拟在每个帧之间都有一个增量。例如,客户机将输入发送到服务器,将其(与deltaTime一起)存储在一个数组中并计算预测状态,服务器处理它,并在100毫秒后将权威状态与最后处理的输入一起发送给客户机。客户机接收它,应用这个旧状态,并重新应用来自这个状态的所有下一个输入。问题是服务器和客户端都有不同的deltaTime…你不能期望两个不同的设备(甚至是你的NodeJS应用的实例)有相似的计时。deltaTime是指用于渲染的每帧之间的时间-您的服务器不应具有帧速率,因为它不应显示任何帧。