【问题标题】:Game network code - Client side prediction & correction游戏网络代码 - 客户端预测和修正
【发布时间】:2012-01-09 11:06:31
【问题描述】:

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

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

非常感谢!

【问题讨论】:

    标签: c++ networking winsock


    【解决方案1】:

    这类游戏的典型做法是:

    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 次”。

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

    抱歉,如果这太长了...

    【讨论】:

      猜你喜欢
      • 2022-11-09
      • 2011-09-05
      • 1970-01-01
      • 1970-01-01
      • 2013-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      相关资源
      最近更新 更多