"橡皮筋"会解决多人插值口吃问题吗?

Z0q*_*Z0q 12 java networking interpolation physics multiplayer

我用UDP编写了多人Pong.我正在使用插值和外推,以便在客户端上创建平滑的效果.

有用.然而,球中有一些不断的口吃.每次收到新数据包时它会向前跳一小部分.它看起来有点滞后,但它是可玩的.

必须有一种方法让游戏看起来更顺畅.我读过有关橡皮筋的文章.离开这里最好的方法是什么?

我希望能够很好地回答我的问题的人会找到它.

更新

根据Ivan的要求,这是ping时间的图表.但是,我确实认为客户端平滑代码中存在问题.

在此输入图像描述

tuc*_*uxi 6

根据您之前的问题填写上下文,我知道您正在从每个客户端向另一个客户发送球拍和球位置.但是,只要客户就每个时刻桨的位置达成一致,球的运动就完全确定了(除了舍入误差),你应该尝试零球.每个客户应该保持自己的内部状态与桨和球的位置和速度.伪代码类似于以下内容:

// input thread
if input changed,
   alter paddle speed and/or direction
   send timestamped message to inform my opponent of paddle change

// incoming network thread
if paddle packet received
   alter opponent's paddle speed and/or direction at time it was sent
   fix any errors in previously extrapolated paddle position <--- Easy
if ball-packet received
   fix any errors in ball position and speed <--- Tricky

// update entities thread
for each entity (my paddle, opponent paddle, the ball)
   compute updated entity position, adjusted by time-since-last-update
   if ball reached my end, send ball-packet to other side
   draw updated entity
Run Code Online (Sandbox Code Playgroud)

这假设正在交换两种包类型:

  • paddle数据包是带时间戳的位置+ paddle的速度,并且只要客户端改变其自己的paddle的速度就会发送.
  • 球包是带时间戳的位置+球的速度,并且每当球到达客户的(本地)侧时发送,无论它是否从球拍反弹.

对于更新实体线程中的所有未知数,伪代码正在执行外推("假设事情继续照常移动").问题出现的唯一一点用<---箭头标出.

您可以通过将它们翘曲到新位置来轻松校正桨位置,可能会在短时间内插入运动以使其不那么刺耳.

如果两个客户或多或少都同意,那么校正球位置很容易(然后你可以再次进行插值技巧,以进一步平滑它).但是,一个客户可能会看到近乎未命中,另一个客户可能会看到接近命 在这种情况下,由于您使用的是点对点模型,我们让本地客户端进行呼叫,并解释对手发生了什么(在另一种设计中,您将有一个中央服务器做出这些决定;这样可以避免作弊).如果两个客户都不同意,你无法避免那里的丑陋跳跃 - 但希望这应该是相对罕见和短暂的,除非它与ping峰值一致.