TCP实时多人游戏

时间:2012-12-11 02:21:35

标签: c# networking tcp real-time multiplayer

好的,所以我意识到这已经一遍又一遍地讨论,因为我已经阅读了无数的Stack Overflow线程和网上的文章。我目前在VPS上运行TCP异步C#.NET服务器。

我已经让它适用于多人游说,例如将玩家连接到游戏以及什么不是。我的主要问题是游戏何时开始,因为它变得非常块状。所以我的研究

我在Interpolation上发现了一些非常有用的线程,他们引导我走向基本(差异(Serverpos - Localpos)* Deltatime(服务器更新之间的时间?)*插值常数)。这在某种意义上起作用,它平滑了帧速率,但我仍然在服务器更新时间上有一个短暂的延迟。

然而,我的主要问题是我使用加速度计来更新每个播放器的位置,但是我的服务器无法接收该数据并像加速度计更新那样快速处理它,导致它开始搞乱。

所以今天我尝试简单地将数据发送到服务器,但是我的最大传输时间大约是350MS,这使得它不会在意外时合并消息。

然后我遇到了“Dead Reckoning”,这在理论上会起作用,因为你理论上不会跟踪桨位置。当球击中你的对手球拍时会发生什么?你是否自动将桨叶推入位置并反转球位置?

基本上我认为我通过理论化不同的方式将自己旋转成一个大圈子。我也知道UDP,但我不能想象Pong多人游戏需要我运行UDP连接,必须有一种方法来使用TCP。

无论如何,谢谢你们给我的任何帮助。我是新手,我认为已经迷失在网络网络中。

1 个答案:

答案 0 :(得分:3)

这不是网络问题,而是过滤问题。我建议阅读“卡尔曼过滤”。数学可能是令人生畏的,但你正在尝试的基本问题是“如何根据我对系统物理学的了解和(可能)用户输入和先前状态的噪声和不规则测量来插值状态”....这恰好是经典的卡尔曼问题。

1)您必须建立服务器和客户同意的共同“时间”。有一些众所周知的算法可以做到这一点。使用此常用时间为所有更新添加时间戳。

2)使用UDP是可行的方法 - 请记住,数据包可能会丢失,并且无法保证按发送顺序接收数据包。这意味着在使用它们更新客户端之前,您必须有一种方法来检查数据包并确定它们是否“旧”。您还遇到的问题是,如果您的客户端无法像发送它们那样快速处理它们,那么您将开始在客户端上获得大量增量...最好丢弃一个旧的数据包而不是花时间处理它

3)尽量减少延迟。如果可以,请将服务器完全切断,让客户端相互广播更新。

4)这就是滤波器理论的用武之地 - 对于每个自由度,决定你愿意容忍多少错误(客户看到的与“真相”之间的差异)。例如,对于飞机而言,位置不是非常动态 - 您可能会在一个甚至两秒钟的更新中逃脱,并且在客户端中的位置误差非常小。但是,姿态(俯仰,偏航,滚动)非常动态,因此您可能需要每0.25秒更新一次这些状态以实现可接受的位置误差。卡尔曼理论将告诉您实现所需错误所需的更新速率。您还可以根据您在原始客户端发生的情况更改更新速率....快速控制输入=>高更新率与无控制输入=>更新率低。

相关问题