游戏网络代码 - 客户端预测和纠正

Mic*_*ael 4 c++ networking winsock

我正在使用winsock和c ++创建一个2d sidescroller mmorpg,我想问一下如何编写客户端预测和纠正程序?特别是校正,因为预测基本上只是运行客户端服务器上运行的物理代码.服务器每两秒发送一次更正.此消息包含X和Y位置以及X和Y速度,输入如左0,右1,跳1 ...

编辑:我可以为其他客户做同样的事情吗?因此,我只发送已更改的输入,而不是发送位置和速度的快照,本地客户端将预测其他客户端移动到的位置.服务器每2-3秒发送一次更正.

非常感谢!

jow*_*owo 7

通常在这种类型的游戏中做了什么:

  1. 预测是"航位推算",其中服务器使客户端以一定的恒定速度移动(当然,为重力,爆炸以及服务器上发生的任何其他情况调整此速度),直到客户端更新其当前位置和速度.对于动作游戏,很难提出比这个速度*时间运动更高级的预测(即试图预测输入的内容).

  2. 告诉服务器您所在的位置是一件棘手的事情.如果服务器依靠玩家发送他们自己的位置和速度,客户可以欺骗他/她的位置来绕过障碍物.理想情况下,服务器只接收客户端输入并直接处理生成的移动,因此可以确定人们以合法的方式移动.然而,输入到服务器的延迟使这变得不切实际,所以你可能需要一个中间解决方案,其中客户端说"当我将速度改为(s,t)时,我就在(x,y)"(即在第x,y)点按下跳转键,服务器查看此信息并说"根据我对这个客户的预测动作,他实际上在0.7秒之前就已经相当接近这一点,所以我相信他确实做到了在那一点将他的速度改为(s,t).我对最后0.7秒的预测是不准确的,所以玩家实际上在(x,y)+(s,t)*0.7"如果服务器不同意,那么应该告诉玩家它认为她或她当前在哪里,以便玩家快速回到服务器指示的位置.例如,如果在客户端输入到达服务器之前服务器上发生了爆炸,那么客户端对自己的看法就不再准确了.同样,如果客户试图发送远离他当前位置的错误位置或荒谬的高移动速度.服务器必须打下去,可以这么说:)

  3. 服务器向每个客户发送他或她附近的每个玩家的位置和速度.位置和速度足以完全预测和推断玩家的移动.换句话说,其他玩家不关心正在按压哪些键或类似的东西,服务器已经做出了准确性的确认.可以在客户端处理NPC移动和AI,因此不需要发送它们.

  4. 网络游戏几乎总是使用UDP套接字完成.UDP套接字的开销比TCP低得多,因为收件人不会确认数据包.如果他们迷路了,他们就会永远消失.虽然这可以保存往返确认,但您不能假设数据包到达服务器,反之亦然.这是发送输入事件的棘手问题.始终发送当前状态"快照"而不是状态更改是理想的,因为即使数据包在传输过程中丢失,一旦数据包进入就会知道正确的状态.换句话说,您总是想说"这就是我现在和我正在做的事情而不是"我按下Jump 3次".

总而言之,客户可以发送速度更新以及更改发生时头像的位置.服务器验证所有当前状态的合理值.服务器将此数据发送给其他附近的玩家(理想情况下将附近玩家的所有动作信息打包成单个数据包),并且客户端应用相同的预测模型减去合理动作的验证.

对不起,如果这太长了...