gpt4 book ai didi

java - "Rubber banding"会解决多人插值问题吗?

转载 作者:搜寻专家 更新时间:2023-10-30 21:10:07 26 4
gpt4 key购买 nike

我使用 UDP 编写了多人游戏 Pong。我正在使用插值和外推来为客户端创建平滑的外观效果。

它有效。但是,球中有一些持续的口吃。每次收到新数据包时,它都会向前跳一点点。它看起来有点滞后,但可以玩。

一定有办法让游戏看起来更流畅。我读过橡皮筋。离开这里的最佳方式是什么?

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

更新

应 Ivan 的要求,这里是 ping 时间的图表。但是,我确实相信问题存在于客户端平滑代码中。

enter image description here

最佳答案

填写您的 previous question 的上下文,据我所知,您正在将每个客户的桨和球位置发送给另一个客户。然而,只要客户及时就 Racket 的每个时刻的位置达成一致,球的运动就完全确定了(舍入误差除外),您应该尝试零球卡顿。每个客户都应该保持自己的内部状态,包括 Racket 和球的位置和速度。伪代码类似于以下内容:

// 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

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

  • paddle 数据包是带时间戳的位置 + paddle 速度,每当客户端改变自己 paddle 的速度时发送。
  • 球数据包是带时间戳的位置 + 球的速度,每当球到达客户端(本地)端时发送,无论它是否从桨上弹起。

伪代码正在对更新实体线程中的所有未知数执行外推(“假设事物继续像往常一样移动”)。出现问题的唯一点标记为 <---箭头。

您可以通过将 Racket 调整到新位置来轻松纠正 Racket 位置,可能会在短时间内插入运动以减少震动。

如果两个客户或多或少都同意,则更正球的位置很容易(然后您可以再次执行插值技巧,以进一步平滑它)。但是,一位客户可能会看到差点错过,而另一位客户可能会差点命中。在这种情况下,由于您使用的是点对点模型,我们让本地客户端进行调用,并解释对手发生了什么(在另一种设计中,您将有一个中央服务器做出此类决定;这有助于避免作弊)。如果两个客户端都不同意,您无法避免那里的丑陋跳转 - 但希望这种情况应该相对罕见且较短,除非它与 ping 尖峰同时发生。

关于java - "Rubber banding"会解决多人插值问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39976899/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com