我使用的是一种结构,客户端在一个包中每20‘m发送一次输入,而服务器每更新一次就解析他的输入(同样也是20’m)。我有一个问题,因为玩家可以给我发送多个输入包(如果他使用欺骗),所以他可以比其他人移动得更快。问题是,我不知道如何检查他的信息是否太频繁。以前,我做过这样的工作:客户端每隔20 to在缓冲区中复制他的输入,每100 to将缓冲区发送到服务器。服务器每20‘s解析此缓冲区的1/5,并将客户端的状态发送给客户端。问题在于存在很大的延迟,而且客户端在屏幕上的状态是不稳定的,因为他在100‘s上发送消息,等待服务器解析它(多100’s),所以每个客户端的消息都会增加延迟。由于服务器每100 be只解析一条输入消息,所以即使客户机试图欺骗他的速度,我也一直在使用它。我的问题是,其他游戏开发人员做什么,他们如何能够确保服务器不会解析太多的客户端消息和延迟将是很少的?我肯定我错过了什么,因为我没有看到像这个这样的问题,它应该很容易解决,所以如果我错了,请告诉我。
发布于 2019-03-16 10:35:59
听起来,你的问题来自于对玩家输入的急切处理,当它出现的时候。在这种情况下,很难跟踪输入的上下文及其相对于其他玩家的时间/频率以及您自己的主要/权威更新时间步骤。
相反,试着把你的游戏想象成是基于转弯的,只是有非常快的,自动推进的转弯。
每当您的服务器收到来自某个玩家的输入时,都给它分配一个时间戳,该时间戳表示应该在游戏时间内应用它的时刻(这可能是接收时间,或者是试图补偿延迟的回溯时间),并将其填充到优先级队列中,以便立即处理。
服务器上的每一个固定时间步骤,使用为该回合收集的输入,将游戏推进一个回合。这意味着您运行一个更新通行证,将权威的游戏状态更新为一个新的盖章时间。在这一次传递中,处理队列中发生在游戏时间这一段中的所有输入。
因为你在一次回合中运行了所有的服务器逻辑,所以你可以确保你不会在一次回合中重复处理任何一个玩家的输入,或者让他们组合/垃圾邮件操作,这是不应该允许的。
(例如,也许“我按右”和“我按下跳转”这两个堆栈,都可以在一个更新回合中执行,但“我按右”和“我按右”只会折叠成一个单一的右输入。或者,您可以重新盖章第二个输入,并将其重新填充到队列中,以强制它在稍后的回合中发生)
您还可以使用这张通行证查看每个玩家在此更新窗口中输入的数量,跟踪偏差,以及标记看起来像作弊而不是普通时间波动的情况。
https://gamedev.stackexchange.com/questions/169080
复制相似问题