代码之家  ›  专栏  ›  技术社区  ›  Andreas Grech

处理XNA+lidgren中的滞后

  •  10
  • Andreas Grech  · 技术社区  · 14 年前

    lidgren 在XNA中,我遇到了一些关于“滞后”的问题。

    XNA sample

    由于lidgren和XNA的连接滞后,是否有人对不顺畅的移动有相同的问题?

    2 回复  |  直到 13 年前
        1
  •  36
  •   Martin    4 年前

    您链接的示例直接将位置设置为从网络接收到的任何位置,这对于多人游戏来说是个坏主意!

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

    这不会影响设备上的本地位置,而是在更新方法(每帧)中,将本地位置移向远程位置:

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

    1. 如果差异太大而无法跳跃,那么慢慢向你应该处于的位置移动。

    由于该单位顺利地向它应该是,它看起来没有滞后在所有!

    插值常数控制本地和远程位置会聚的速度:

    • 0:忽略网络更新
    • 大:慢慢滑入到位,看起来很平滑,但可能感觉没有反应

    你需要在这两种选择之间做出妥协。

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

    补遗:重读这个答案,我突然想到,一个增强将是跟踪时间差。如果您知道(大致)系统中的延迟是什么,那么您就知道当您接收到一个远程位置的数据包时,您大致知道该数据包所处的过去有多远。如果你也发送远程速度,你可以预测物体现在的位置(假设速度恒定)。在某些游戏中,这可能会使估计的本地状态和真实的远程状态之间的差异变小,而在其他游戏中(速度变化很大),这可能会使情况变得更糟。

        2
  •  1
  •   Prometheus3k    14 年前

    我一直在考虑编写一个多人fps游戏,首先是演示如何移动一些立方体,然后在另一台机器上复制位置/旋转,这台机器处于旁观者模式。

    我正在使用上面的代码示例,它运行得很好(我不得不将插值常量调整为大于1,以使其看起来平滑)。

    我看到这段代码没有使用时间差,所以插值将需要尽可能长的时间才能到达目标值(或者至少在阈值内然后捕捉到位)。我的问题是,这有什么好处吗?

    非常感谢。