gpt4 book ai didi

c# - TCP 实时多人游戏

转载 作者:可可西里 更新时间:2023-11-01 02:39:54 26 4
gpt4 key购买 nike

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

我已将其用于多人游戏大厅,例如将玩家连接到游戏等等。我的主要问题是游戏何时开始,因为它变得非常 block 状。所以根据我的研究

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

但是我的主要问题是我正在使用加速度计来更新每个玩家的位置,但是我的服务器无法接收该数据并像加速度计更新一样快地处理它,这导致它开始搞砸了。

所以今天我尝试简单地向服务器发送数据,但是我的最大传输时间约为 350 毫秒,这可以防止它意外地合并消息。

然后我遇到了“航位推算”,这在理论上是可行的,但是因为理论上您不会跟踪最新的桨位置。当球击中对手的 Racket 时会发生什么?你会自动将 Racket 猛拉到位并反转球的位置吗?

基本上,我认为我已经绕了一个大圈子,只是通过理论化不同的方法来做到这一点。我也知道 UDP,但我无法想象 Pong 多人游戏会要求我运行 UDP 连接,必须有一种使用 TCP 的方法。

无论如何,谢谢你们给我的帮助。我对此很陌生,我认为已经迷失在网络网络中。

最佳答案

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

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

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

3) 最小化延迟。如果可以,将您的服务器完全切断循环并让您的客户端相互广播更新。

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

关于c# - TCP 实时多人游戏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13812627/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com