我正在使用winsock和c ++创建一个2d sidescroller mmorpg,我想问一下如何编写客户端预测&更正? 特别是校正,因为预测基本上只是运行客户端服务器上运行的物理代码。 服务器每两秒发送一次更正。此消息包含X& Y位和X& Y速度和输入一样 左0,右1,跳1 ...
编辑: 我可以为其他客户做同样的事情吗?因此,我只发送已更改的输入和本地发送,而不是发送位置和速度的快照 客户将预测其他客户的目的地。服务器每2-3秒发送一次更正。
非常感谢!
答案 0 :(得分:7)
通常在这种类型的游戏中做了什么:
预测是“航位推算”,其中服务器让客户端以一定的速度移动(当然,调整此速度用于重力,爆炸以及服务器上发生的任何其他情况),直到客户端更新其当前位置和速度。对于一个动作游戏,很难提出比这个速度*时间运动更高级的预测(即试图预测输入的内容)。
告诉服务器您所在的位置是一件棘手的事情。如果服务器依靠玩家发送他们自己的位置和速度,客户可以欺骗他/她的位置来绕过障碍物。理想情况下,服务器只接收客户端输入并直接处理生成的移动,因此可以确定人们以合法的方式移动。然而,输入到服务器的延迟使这变得不切实际,所以你可能需要一个中间解决方案,其中客户端说“当我将速度改为(s,t)时,我就在(x,y)”(即在第x,y)点按下跳转键,服务器查看此信息并说“根据我对这个客户的预测动作,他实际上在0.7秒之前就已经接近这一点,所以我相信他确实做到了在那一点将他的速度改为(s,t)。我对最后0.7秒的预测是不准确的,所以玩家实际上在(x,y)+(s,t)* 0.7“如果服务器不同意,那么应该告诉玩家它认为她或她当前在哪里,以便玩家快速回到服务器指示的位置。例如,如果在客户端输入到达服务器之前服务器上发生了爆炸,那么客户端对自己的看法就不再准确了。同样,如果客户试图发送远离他当前位置的错误位置或荒谬的高移动速度。服务器必须打下去,可以这么说:)
服务器向每个客户端发送每个玩家在他或她附近的位置和速度。位置和速度足以完全预测和推断玩家的移动。换句话说,其他玩家不关心正在按压哪些键或类似的东西,服务器已经做出了准确性的确认。 NPC移动和AI可以在客户端进行处理,因此无需发送。
网络游戏几乎始终使用UDP套接字完成。 UDP套接字的开销比TCP低得多,因为收件人不会确认数据包。如果他们迷路了,他们就会永远消失。虽然这可以保存往返确认,但您不能假设数据包到达服务器,反之亦然。这是发送输入事件的棘手问题。始终发送当前状态“快照”而不是状态更改是理想的,因为即使数据包在传输过程中丢失,一旦数据包进入就会知道正确的状态。换句话说,您总是想说“这就是我现在和我正在做的事情“而不是”,我按下跳3次“。
总而言之,客户可以发送速度更新以及更改发生时头像的位置。服务器验证所有当前状态的合理值。服务器将此数据发送给附近的其他玩家(理想情况下将附近玩家的所有动作信息打包成一个数据包),客户端应用相同的预测模型减去合理动作的验证。
对不起,如果这太长了......