我正在XNA中试验lidgren,我遇到了一些“滞后”的问题。
我下载了他们的XNA sample,并注意到即使是他们的样本也是滞后的。问题是,在另一端的移动并不顺畅,我在局域网上(实际上是在同一台计算机上)而不是在互联网上尝试这样做。
有没有因为与lidgren和XNA的连接滞后而导致移动不顺畅的问题?
发布于 2010-07-19 03:52:25
您链接的示例直接将位置设置为它从网络接收的任何内容,这对于多人游戏来说不是一个好主意!
在真正的游戏中,你应该做的是在本地位置和远程位置之间进行插值。因此,您的接收方法看起来有点像这样:
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
}然后显示单元的“本地”位置,这实现了无滞后运动,如下:
由于该单元顺利地朝着它应该在的位置移动,所以看起来根本没有延迟!
插值常量控制本地和远程位置收敛的速度:
updates
您需要在这些选项之间选择一个折衷方案。
在实现这类系统时,还需要考虑其他一些事情,例如,您通常希望对单元与其远程位置之间的距离设置一个上限,否则在某些情况下,本地和远程状态可能会变得“不稳定”。如果它们离得太远(除非是极端滞后的情况,否则永远不会发生),你可以暂停游戏,告诉用户它太慢了,或者直接跳到单位的位置,这看起来很慢,但至少游戏会继续。
附录:重读这个答案,我想到了一个改进,那就是跟踪时间差。如果您知道(粗略地)系统中的延迟是什么,那么您就知道,当您收到一个带有远程位置的数据包时,您大致知道该数据包距离过去有多远。如果你也发送远程速度,你可以预测物体现在的位置(假设速度恒定)。在一些游戏中,这可能会使估计的本地状态和真实的远程状态之间的差异变小,而在其他游戏中(在其他游戏中,您有许多变化的速度),这可能会使情况变得更糟。
发布于 2011-02-11 22:40:12
我一直在考虑编写一个多人fps游戏,从一个演示开始,只是移动一些立方体,并在另一台机器上复制位置/旋转,这是在观众模式下。
我正在使用上面的代码样本,它工作得很好(我必须调整大于1的插值常数以使其看起来平滑)。
我见过一些插值示例,它们考虑了当前时间和接收消息上的时间戳之间的时间差。
我看到这段代码没有使用时间差,所以插值将花费它所需的时间,以达到目标值(或者至少在阈值内,然后捕捉到位置)。我的问题是,这样做有什么好处吗?
非常感谢。
https://stackoverflow.com/questions/3276821
复制相似问题