Z0q*_*Z0q 12 java networking interpolation physics multiplayer
我用UDP编写了多人Pong.我正在使用插值和外推,以便在客户端上创建平滑的效果.
有用.然而,球中有一些不断的口吃.每次收到新数据包时它会向前跳一小部分.它看起来有点滞后,但它是可玩的.
必须有一种方法让游戏看起来更顺畅.我读过有关橡皮筋的文章.离开这里最好的方法是什么?
我希望能够很好地回答我的问题的人会找到它.
更新
根据Ivan的要求,这是ping时间的图表.但是,我确实认为客户端平滑代码中存在问题.
根据您之前的问题填写上下文,我知道您正在从每个客户端向另一个客户发送球拍和球位置.但是,只要客户就每个时刻桨的位置达成一致,球的运动就完全确定了(除了舍入误差),你应该尝试零球.每个客户应该保持自己的内部状态与桨和球的位置和速度.伪代码类似于以下内容:
// 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)
这假设正在交换两种包类型:
对于更新实体线程中的所有未知数,伪代码正在执行外推("假设事情继续照常移动").问题出现的唯一一点用<---箭头标出.
您可以通过将它们翘曲到新位置来轻松校正桨位置,可能会在短时间内插入运动以使其不那么刺耳.
如果两个客户或多或少都同意,那么校正球位置很容易(然后你可以再次进行插值技巧,以进一步平滑它).但是,一个客户可能会看到近乎未命中,另一个客户可能会看到接近命 在这种情况下,由于您使用的是点对点模型,我们让本地客户端进行呼叫,并解释对手发生了什么(在另一种设计中,您将有一个中央服务器做出这些决定;这样可以避免作弊).如果两个客户都不同意,你无法避免那里的丑陋跳跃 - 但希望这应该是相对罕见和短暂的,除非它与ping峰值一致.
| 归档时间: |
|
| 查看次数: |
358 次 |
| 最近记录: |