And*_*ech 10 c# xna multiplayer lidgren
我在XNA 试验lidgren,我遇到了'滞后'的问题.
我已经下载了他们的XNA样本,并注意到他们的样本甚至滞后.问题是,另一方面的运动并不顺畅,我正在尝试在局域网上(实际上在同一台计算机上),而不是在互联网上.
由于与lidgren和XNA的连接滞后,是否有任何相同的问题?
Mar*_*tin 31
您链接的样本直接将位置设置为从网络接收的任何内容,这对于多人游戏来说是个坏主意!
在真实游戏中你应该做的是在本地位置和远程位置之间进行插值.所以,你的接收方法看起来有点像这样:
void Receive(packet)
{
unit.RemoteX = packet.Read_X_Position();
unit.RemoteY = packet.Read_Y_Position();
}
Run Code Online (Sandbox Code Playgroud)
这不会影响设备上的本地位置,而是在更新方法(每个帧)中,将本地位置移向远程位置:
void Interpolate(deltaTime)
{
difference = unit.RemoteX - unit.LocalX
if (difference < threshold)
unit.LocalX = unit.RemoteX
else
unit.LocalX += difference * deltaTime * interpolation_constant
}
Run Code Online (Sandbox Code Playgroud)
然后显示单元的"本地"位置,这样就可以实现无滞后运动:
由于单元平稳地移动到它应该的位置,看起来根本没有滞后!
在实现这种系统时还需要考虑其他一些事项,例如,您经常需要一个上限与远程位置相距多远的位置,否则本地和远程状态在某些情况下可能会"脱落".如果它们相距太远(除非在极端滞后的情况下,它们永远不应该发生)你可以停止游戏并告诉用户它太迟,或者将单位直接跳到位置,这看起来很迟钝但至少游戏会继续.
附录:重读这个答案,我认为增强将是追踪时差.如果您(大致)知道系统中的延迟是什么,那么您就知道当您收到一个远程位置的数据包时,您大致知道该数据包的过去距离.如果您也发送远程速度,则可以预测对象的位置(假设速度恒定).这可能会使某些游戏中估计的局部状态和真实的远程状态之间的差异变小,在其他游戏中(你有很多变化的速度)可能会使事情变得更糟.