jjzjj

c# - TCP 实时多人游戏

coder 2023-09-18 原文

好的,所以我意识到这个问题已经被反复讨论过,因为我已经阅读了无数的 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/

有关c# - TCP 实时多人游戏的更多相关文章

  1. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

  2. C# 到 Ruby sha1 base64 编码 - 2

    我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha

  3. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  4. ruby - 我需要从 facebook 游戏中抓取数据——使用 ruby - 2

    修改(澄清问题)我已经花了几天时间试图弄清楚如何从Facebook游戏中抓取特定信息;但是,我遇到了一堵又一堵砖墙。据我所知,主要问题如下。我可以使用Chrome的检查元素工具手动查找我需要的html-它似乎位于iframe中。但是,当我尝试抓取该iframe时,它​​是空的(属性除外):如果我使用浏览器的“查看页面源代码”工具,这与我看到的输出相同。我不明白为什么我看不到iframe中的数据。答案不是它是由AJAX之后添加的。(我知道这既是因为“查看页面源代码”可以读取Ajax添加的数据,也是因为我有b/c我一直等到我可以看到数据页面之后才抓取它,但它仍然不存在)。发生这种情况是因为

  5. python - Ruby 或 Python 的 3d 游戏引擎? - 2

    关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于StackOverflow来说是偏离主题的,因为它们往往会吸引自以为是的答案和垃圾邮件。相反,describetheproblem以及迄今为止为解决该问题所做的工作。关闭9年前。Improvethisquestion是否有适用于这些的3d游戏引擎?

  6. c# - C# 中的 Flatten Ruby 方法 - 2

    我如何做Ruby方法"Flatten"RubyMethod在C#中。此方法将锯齿状数组展平为一维数组。例如:s=[1,2,3]#=>[1,2,3]t=[4,5,6,[7,8]]#=>[4,5,6,[7,8]]a=[s,t,9,10]#=>[[1,2,3],[4,5,6,[7,8]],9,10]a.flatten#=>[1,2,3,4,5,6,7,8,9,10 最佳答案 递归解决方案:IEnumerableFlatten(IEnumerablearray){foreach(variteminarray){if(itemisIEnume

  7. ruby - 可以像在 C# 中使用#region 一样在 Ruby 中使用 begin/end 吗? - 2

    我最近从C#转向了Ruby,我发现自己无法制作可折叠的标记代码区域。我只是想到做这种事情应该没问题:classExamplebegin#agroupofmethodsdefmethod1..enddefmethod2..endenddefmethod3..endend...但是这样做真的可以吗?method1和method2最终与method3是同一种东西吗?还是有一些我还没有见过的用于执行此操作的Ruby惯用语? 最佳答案 正如其他人所说,这不会改变方法定义。但是,如果要标记方法组,为什么不使用Ruby语义来标记它们呢?您可以使用

  8. c# - Ruby 等效于 C# Linq 聚合方法 - 2

    什么是Linq聚合方法的ruby​​等价物。它的工作原理是这样的varfactorial=new[]{1,2,3,4,5}.Aggregate((acc,i)=>acc*i);每次将数组序列中的值传递给lambda时,变量acc都会累积。 最佳答案 这在数学以及几乎所有编程语言中通常称为折叠。它是更普遍的变形概念的一个实例。Ruby从Smalltalk中继承了这个特性的名称,它被称为inject:into:(像aCollectioninject:aStartValueinto:aBlock一样使用。)所以,在Ruby中,它称为inj

  9. (附源码)vue3.0+.NET6实现聊天室(实时聊天SignalR) - 2

    参考文章搭建文章gitte源码在线体验可以注册两个号来测试演示图:一.整体介绍  介绍SignalR一种通讯模型Hub(中心模型,或者叫集线器模型),调用这个模型写好的方法,去发送消息。  内容有:    ①:Hub模型的方法介绍    ②:服务器端代码介绍    ③:前端vue3安装并调用后端方法    ④:聊天室样例整体流程:1、进入网站->调用连接SignalR的方法2、与好友发送消息->调用SignalR的自定义方法 前端通过,signalR内置方法.invoke()  去请求接口3、监听接受方法(渲染消息)通过new signalR.HubConnectionBuilder().on

  10. c# - 先学什么? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭8年前。Improvethisquestion几年前我去学校学习编程,毕业后我找到了一份系统管理方面的工作,这就是我职业生涯的方向。我想重新开始某种开发,并且一直在“玩”C#和ASP.NET,但我已经听到很多关于其他"new"语言的讨论(新的意思是它们是新的)我)喜欢Ruby和F#。我想我想知道我是否在浪费时间学习主要的MS语言,而不是成为一名通才。很长一段时间没有离开开发社区(如果我曾经离开过的话)让我在潮流中挣扎,我不想落在时代的

随机推荐