如何用客户端预测来补偿运动对象?


11

我正在实现一个支持类似Star Control的近战游戏服务器。因此,您有飞船和射击船,它们具有超简单的速度/加速度/减震物理原理来驱动运动。

在此处输入图片说明

我已经阅读了Valve,Gafferon和Gambetta,并实现了Gambetta的算法来进行客户预测:

在此处输入图片说明

客户端预测通过在服务器上更新其位置来对玩家船进行工作,然后将服务器尚未处理的输入重新应用于玩家船。

不幸的是,它不适用于我的游戏。我认为这与Gambetta的示例没有考虑已经移动的对象或逐步更新的命令有关。(“步”是指帧)。因此,在我的游戏中,玩家抬起脚来加速(已经移动)的飞船,该飞船在客户端上继续移动,将命令发送到服务器,通常在下一步从服务器接收世界快照。我得到更多类似的东西:

在此处输入图片说明

该播放器命令在客户端步骤3运行,但在服务器上仅在服务器步骤5运行。到客户端在客户端步骤6接收到世界快照时,该预测已经完成,尤其是在速度更快的情况下。

问题的症结在于客户端在步骤5运行命令,而服务器在步骤6运行命令。我考虑过可能会使用命令发送客户端步骤,并让服务器回滚并使用客户端时间步骤重新运行命令。但是,这可能会导致许多其他问题-例如自回滚以来收到的命令发生了什么,或者作弊客户端如何通过更改发送的步骤来加以利用。

从Google 读取和观看此类视频时,提到了一种不同的方法,您可以逐步更改播放器的位置,以使其与快照的位置匹配。

我的问题:

  • 您能使Gambetta的算法以恒定的步幅运行吗?还是在概念上与我的游戏不兼容?

  • 那么逐步逐步插值是正确的方法吗?如果是这样,您如何从客户位置插值一个已经移动的对象以匹配刚从服务器接收到的对象?

  • 这些方法,渐进插值法和Gambetta算法可以串联使用,还是互斥?


我一直在做同样的事情,遇到完全相同的问题。一旦我添加了应用服务器状态和重新应用输入的速度,就摆脱了已经处理过的速度变化。自上次收到消息以来,我一直在尝试重新应用所有更新,但是还不是很顺利。您是否找到了解决方案?
MakuraYami

@MakuraYami是的-我已经开始写一篇描述解决方案的文章。即将更新!
OpherV

我在我的项目上做了更多的工作,找到了一个可用的解决方案以及一些有关此问题的优质资源。我有兴趣进一步讨论,比较解决方案,等等。让我知道可以在哪里与您联系:)
MakuraYami

@makurayami我在Gmail的用户名
OpherV,2016年

Answers:


5

自问这个问题以来的6个月中,我最终开发了一个完整的开源游戏服务器来解决这个确切的问题(以及许多其他问题!):http : //lance.gg

在此处输入图片说明

现在,参与的研发使我可以回答自己的问题:

  • 您能使Gambetta的算法以恒定的步幅运行吗?还是在概念上与我的游戏不兼容?

    当实体的移动不确定时(根据客户的POV),Gambetta的算法将不起作用。如果一个实体可以在没有物理或其他参与者的输入的情况下受到影响,那么就需要采取更为详尽的方法。

  • 那么逐步逐步插值是正确的方法吗?如果是这样,您如何从客户位置插值一个已经移动的对象以匹配刚从服务器接收到的对象?

    这涉及另一个主题,即服务器更新的客户端协调。渐进插值是可行的,但是对于节奏非常快的游戏(如该问题中的一种),最好实际实施推断

  • 这些方法,渐进插值法和Gambetta算法可以串联使用,还是互斥?

    它们可以一起工作,但前提是实体移动是根据客户POV确定的。因此,如果实体受物理或伪物理(如插入,拖动等)影响,将无法正常工作


1

您的游戏似乎太“实时”,无法根据时间步长进行思考。如果游戏可以被视为“基于回合制”,我只会考虑“回合制”。否则,请放弃转弯或阶梯的想法。一切都变得容易了:)

请注意,您是为玩家本地预测的,而仅是为其他实体插值的(如本系列第三篇文章所述)。处理已移动对象的服务器更新的方法是服务器端协调,这在第二篇文章的下半部分(您链接到的内容)中进行了说明。

希望这可以帮助 :)


只是为了澄清-“步进”是指“帧”,每秒运行60次。我将其称为步骤(而不是帧),以区分实际游戏进度与渲染,理想情况下,两者均以60每秒的速度同步。我已经实现了您的服务器端对帐版本,该版本运行良好。这个问题仅涉及玩家飞船-不论玩家命令如何(由于惯性而定),飞船一直在移动。那就是我的困难所在。有什么想法吗?:)
OpherV

框架与步骤不同。步骤以恒定,可预测的顺序移动。帧移动的时间量可变,因此必须将任何进度乘以该帧的增量时间。
Tealr

@Tealr的确如此,这就是为什么我使用“ step”一词开始的原因-我只是想更清楚地表明“ step”的使用并不限于回合制游戏,在我的游戏中,step恰好需要1 / 60秒,与渲染无关。
OpherV

我为自己的实验所注意的只是1/60秒。速度异常之快,我敢打赌,大多数参与度超过1x1的网络游戏都将以1 / 10s的速度运行。更新或附近。
Patrick Hughes
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.