首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在XNA + lidgren中处理lag

在XNA + lidgren中处理lag
EN

Stack Overflow用户
提问于 2010-07-19 03:00:49
回答 2查看 7.4K关注 0票数 12

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

我下载了他们的XNA sample,并注意到即使是他们的样本也是滞后的。问题是,在另一端的移动并不顺畅,我在局域网上(实际上是在同一台计算机上)而不是在互联网上尝试这样做。

有没有因为与lidgren和XNA的连接滞后而导致移动不顺畅的问题?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-07-19 03:52:25

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

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

代码语言:javascript
复制
void Receive(packet)
{
    unit.RemoteX = packet.Read_X_Position();
    unit.RemoteY = packet.Read_Y_Position();
}

这对单元上的本地位置没有影响,相反,在更新方法(每一帧)中,您将本地位置移向远程位置:

代码语言:javascript
复制
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. 如果单位位置几乎在远程位置,它就会跳到远程位置(但是,它会跳得很小,看起来不会太慢)。
  2. 如果差异太大,不能跳,那么就慢慢地朝你应该在的位置移动。

由于该单元顺利地朝着它应该在的位置移动,所以看起来根本没有延迟!

插值常量控制本地和远程位置收敛的速度:

updates

  • Small:

  • 0:忽略网络,快速捕捉到位(可能看起来像是慢慢滑入到位,看起来很流畅,但可能感觉像unresponsive

您需要在这些选项之间选择一个折衷方案。

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

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

票数 37
EN

Stack Overflow用户

发布于 2011-02-11 22:40:12

我一直在考虑编写一个多人fps游戏,从一个演示开始,只是移动一些立方体,并在另一台机器上复制位置/旋转,这是在观众模式下。

我正在使用上面的代码样本,它工作得很好(我必须调整大于1的插值常数以使其看起来平滑)。

我见过一些插值示例,它们考虑了当前时间和接收消息上的时间戳之间的时间差。

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

非常感谢。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3276821

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档