处理XNA + lidgren中的延迟

时间:2010-07-18 19:00:49

标签: c# xna multiplayer lidgren

我在XNA中试验lidgren,我遇到了一些'滞后'的问题。

我已经下载了他们的XNA sample并注意到他们的样本甚至滞后了。问题是,另一方面的运动并不顺畅,我正在局域网(实际上是在同一台计算机上)尝试这种情况,而不是通过互联网。

由于与lidgren和XNA的连接滞后,是否存在与平滑移动相同的问题?

2 个答案:

答案 0 :(得分:31)

你直接链接的样本将位置设置为从网络接收的任何内容,这对于多人游戏来说是个坏主意!

在真实游戏中你应该做的是在本地位置和远程位置之间进行插值。所以,你的接收方法看起来有点像这样:

void Receive(packet)
{
    unit.RemoteX = packet.Read_X_Position();
    unit.RemoteY = packet.Read_Y_Position();
}

这对本机的本地位置没有影响,而是在您的更新方法(每一帧)中,您将本地位置移向远程位置:

void Interpolate(deltaTime)
{
    difference = unit.RemoteX - unit.LocalX
    if (difference < threshold)
        unit.LocalX = unit.RemoteX
    else
        unit.LocalX += difference * deltaTime * interpolation_constant
}

然后显示单位的“本地”位置,这样可以实现无滞后运动:

  1. 如果单位位置几乎处于远程位置,它将跳转到远程位置(但是,它会跳跃这么小的距离,看起来不会很迟钝。)
  2. 如果差异太大而无法跳跃,则慢慢向您应该进入的位置移动。
  3. 由于单位平稳地移向应该的位置,看起来根本就没有滞后!

    插值常量控制本地和远程位置收敛的速度:   - 0:忽略网络更新   - 小:非常快速地卡入到位(可能看起来很迟钝)   - 大:缓慢滑动到位,看起来光滑但可能感觉反应迟钝

    您需要在这些选项之间选择妥协。

    在实施此类系统时还需要考虑其他一些事项,例如,您经常需要一个上限,以确定单位与远程位置之间的距离,否则本地和远程状态在某些情况下可能会“脱落” 。如果它们相距太远(除非在极端滞后的情况下,它们永远不应该发生)你可以停止游戏并告诉用户它太迟了,或者将单位直接跳到位置,这看起来很迟钝但至少游戏会继续。

    附录:重读这个答案,我发现增强将是追踪时差。如果您(大致)知道系统中的延迟是什么,那么您就知道当您收到一个远程位置的数据包时,您大致知道数据包的过去距离。如果您也发送远程速度,则可以预测对象的位置(假设速度恒定)。这可能会使某些游戏中估计的局部状态和真实的远程状态之间的差异变小,在其他游戏中(你有很多不断变化的速度)可能会让事情变得更糟。

答案 1 :(得分:1)

我一直在寻找编写多人fps游戏,首先是演示只是移动一些立方体并在另一台机器上复制位置/旋转,这是一种观众模式。

我正在使用上面的代码示例并且它运行良好(我必须调整高于1的插值常量以使其看起来平滑)。

我已经看到一些插值示例,它们考虑了当前时间与收到消息上的时间戳之间的时差。

我看到这段代码没有使用时间差,所以插值只要需要,就可以获得目标值(或者至少在阈值范围内然后捕捉到位置)。我的问题是,这有什么好处吗?

非常感谢。