Questions tagged «movement-prediction»

4
客户端预测如何工作?
我已经阅读了Valve + Gafferon和Google的数百页内容,但是出于任何原因,我都无法理解客户预测。 据我了解,基本问题是: 客户端A在以下位置发送输入 T0 服务器在以下位置接收输入 T1 所有客户都在以下位置收到更改 T2 在T2然而,使用客户预测,客户端A现在是在合适的位置来T4。 在预测服务器将接受移动请求时,如何确保客户端A不在服务器之前?显然,它们一直都在前进,这导致返回到服务器上次看到它们的位置。经过我尝试的所有更正,当您停止时这仍然很明显,因为服务器在您身后停止了

6
如何确保旋转的物体以正确的末端击中目标?
我正在研究一种投掷刀型武器,玩家可以自由瞄准然后投掷一把刀。刀在空中旋转,在碰撞时停止旋转,并将其自身与碰撞的物体作父母。旋转是通过动画处理的,而刀的路径是通过物理处理的。 我面临的一个问题是如何确保当刀与敌人碰撞时,刀将朝向他们。此刻有时会发生的情况是刀先嵌入敌人的手柄中。这显然是不现实的。同时,我认为如果刀首先与刀片碰撞,只刀“击中”敌人是非常不合理的,因为刀的旋转速度超出了玩家的控制范围。 我一直在观看许多类似武器的慢速杀伤镜头,每次抛出武器,它都会在空中旋转,而且魔术般地总是以叶片指向目标为目标。对于投掷距离将保持一致的游戏,这很简单。但是我不确定如何预测这一点,因为其中涉及许多不可预测的因素。刀的方向,刀的旋转,敌人的位置,与敌人的距离等。如果可能的话,我宁愿不必使用复杂的预测逻辑,因为游戏将用于相当低端的设备。有没有“烟和镜子”的方法来解决这个问题? 示例:https://youtu.be/0fav8lFpBko?t = 42s


2
如何用客户端预测来补偿运动对象?
我正在实现一个支持类似Star Control的近战游戏服务器。因此,您有飞船和射击船,它们具有超简单的速度/加速度/减震物理原理来驱动运动。 我已经阅读了Valve,Gafferon和Gambetta,并实现了Gambetta的算法来进行客户预测: 客户端预测通过在服务器上更新其位置来对玩家船进行工作,然后将服务器尚未处理的输入重新应用于玩家船。 不幸的是,它不适用于我的游戏。我认为这与Gambetta的示例没有考虑已经移动的对象或逐步更新的命令有关。(“步”是指帧)。因此,在我的游戏中,玩家抬起脚来加速(已经移动)的飞船,该飞船在客户端上继续移动,将命令发送到服务器,通常在下一步从服务器接收世界快照。我得到更多类似的东西: 该播放器命令在客户端步骤3运行,但在服务器上仅在服务器步骤5运行。到客户端在客户端步骤6接收到世界快照时,该预测已经完成,尤其是在速度更快的情况下。 问题的症结在于客户端在步骤5运行命令,而服务器在步骤6运行命令。我考虑过可能会使用命令发送客户端步骤,并让服务器回滚并使用客户端时间步骤重新运行命令。但是,这可能会导致许多其他问题-例如自回滚以来收到的命令发生了什么,或者作弊客户端如何通过更改发送的步骤来加以利用。 从Google 读取和观看此类视频时,提到了一种不同的方法,您可以逐步更改播放器的位置,以使其与快照的位置匹配。 我的问题: 您能使Gambetta的算法以恒定的步幅运行吗?还是在概念上与我的游戏不兼容? 那么逐步逐步插值是正确的方法吗?如果是这样,您如何从客户位置插值一个已经移动的对象以匹配刚从服务器接收到的对象? 这些方法,渐进插值法和Gambetta算法可以串联使用,还是互斥?

2
如何通过客户端预测处理实时随机运动
我正在构建一个实时多人游戏,该游戏在客户端和服务器上运行相同的“物理”循环。我使用的转向行为“徘徊”是必不可少的随机运动。运行漫游算法时,客户端和服务器生成不同的随机数。 我想知道如何保持自然随机的运动,但使用一些常数来确保客户端和服务器得出相同的结论。

2
外推打破碰撞检测
在对精灵的运动进行推断之前,我的碰撞效果非常好。但是,在对精灵的运动进行推断(以使物体平滑)之后,碰撞不再起作用。 这是外推之前的工作方式: 但是,在执行推断后,碰撞例程将中断。我假设这是因为它作用于外推例程(位于我的render调用中)产生的新坐标。 应用推断后 如何纠正这种行为? 我尝试在推断后再进行一次额外的碰撞检查-这似乎确实解决了许多问题,但是我将其排除在外是因为将逻辑放入渲染中是不可能的。 我还尝试制作了spritesX位置的副本,对其进行推断并使用该位置而不是原始位置进行绘制,从而保留了原始位置以供逻辑使用-这似乎是一个更好的选择,但仍然会产生一些奇怪的效果与墙壁碰撞时。我很确定这也不是解决此问题的正确方法。 我在这里找到了几个类似的问题,但是答案并没有帮助我。 这是我的推断代码: public void onDrawFrame(GL10 gl) { //Set/Re-set loop back to 0 to start counting again loops=0; while(System.currentTimeMillis() > nextGameTick && loops < maxFrameskip){ SceneManager.getInstance().getCurrentScene().updateLogic(); nextGameTick+=skipTicks; timeCorrection += (1000d/ticksPerSecond) % 1; nextGameTick+=timeCorrection; timeCorrection %=1; loops++; tics++; } extrapolation = (float)(System.currentTimeMillis() + skipTicks - …

1
发送播放器速度更改时如何同步客户端和服务器?
我正在执行客户端预测。大多数说明都假定客户端发送诸如“ 将我的播放器上移1个位置 ”之类的消息。如果我发送诸如“ 将播放器的速度设置为x ”之类的消息怎么办? 在客户端上,播放器在服务器之前设置自己的速度(通过客户端预测),导致两者不同步。即使考虑平均延迟,此问题仍然存在。 我该如何解决?
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.