c# – 处理XNA lidgren的滞后

前端之家收集整理的这篇文章主要介绍了c# – 处理XNA lidgren的滞后前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在XNA中试用 lidgren,我在“滞后”中遇到一些问题.

我已经下载了他们的XNA sample,并注意到即使他们的样品滞后.事情是,运动在另一边不顺利,而我正在LAN上(实际上是在同一台计算机上),而不是在互联网上.

由于与盖帽和XNA的滞后关系,有没有与不平滑运动有相同的问题?

解决方法

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

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

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将直接传送到网络位置(并且看起来很长) – 因此您需要在两者之间的某个位置选择妥协

由于单位顺利地向着应有的地方移动,所以看起来根本就没有滞后!

在实现这种系统时还需要考虑其他一些问题,例如,您经常希望距离远程位置可以有多远的距离,否则在某些情况下,本地和远程状态可能会“脱离”.如果它们相距太远(除非是极端滞后,否则绝对不会发生),您可以停止游戏,并告诉用户它太滞后,或者将设备直接拉到位置,这将看起来很长,但至少游戏会继续.

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

猜你在找的C#相关文章