多人游戏同步

2024-03-13

我实现了服务器/客户端架构,其中所有状态更改都发送到函数,经过验证并广播到所有连接的客户端。这工作得相当好,但系统目前无法维持游戏客户端实例之间的同步。

如果服务器和特定客户端之间恰好有 5 秒的延迟,那么他将在其他客户端之后 5 秒收到状态更改,从而使他的游戏状态不同步。我一直在寻找各种方法来实现客户端之间的同步系统,但到目前为止还没有找到太多。

我是网络编程的新手,并不天真地认为我可以自己发明一个工作系统,而无需投入大量时间。然而,我一直以来的想法是保留某种时间系统,因此每个状态更改都将与游戏中的特定时间戳相关联。这样,当客户端收到状态更改时,它就会准确地知道更改发生在游戏的哪个时期,并且反过来能够关联延迟。这种方法的问题在于,在那些n延迟几秒后,游戏将在客户端继续进行,因此客户端必须及时回滚以更新状态更改,这肯定会变得混乱。

所以我正在寻找讨论解决该问题的主题或算法的论文。也许我对多人游戏系统如何工作的整个设计是有缺陷的,从某种意义上说,除非从服务器收到概念,否则客户端的游戏实例不应更新?现在,客户端只是在游戏循环中更新自己,假设任何状态都没有改变。


基本的方法就是所谓的航位推算 https://www.gamasutra.com/view/feature/131638/dead_reckoning_latency_hiding_for_.php可以在这里找到一篇关于它的非常好的文章。基本上,它是一种预测算法,用于猜测服务器更新之间的时间实体位置。

有更先进的方法建立在这个概念的基础上,但它是一个很好的起点。


还可以找到有关如何在源引擎(第一款《半条命》游戏的 Valve 引擎)中处理此问题的描述here http://developer.valvesoftware.com/wiki/Source_Multiplayer_Networking,原理基本上是相同的 - 直到服务器告诉您使用预测算法沿着预期路径移动实体 - 但本文处理这对尝试更深入地拍摄某些内容所产生的影响。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多人游戏同步 的相关文章

  • C++ std::accumulate 没有给出预期的总和

    double numbers 1 0 5 0 333333 0 25 0 2 0 166667 0 142857 0 125 0 111111 0 1 std vector
  • SOAP Web 服务:多台服务器,一个接口

    我有一个场景 需要任意数量的服务器来提供相同的 SOAP Web 服务 我想生成一组代理类 并能够为它们提供一个位置 以便在运行时将它们指向不同的服务器 不幸的是 看起来好像wsdl port节点 子节点wsdl service 要求对特定
  • 如何使用T4从一个模板同时生成两个文件?

    我遇到的情况是 我需要生成两个 CSharp 代码文件 它们的代码几乎相同 但方法的输入和输出类型的命名空间不同 事实上 每个文件都针对特定国家 地区 并且类型来自特定国家 地区的 WSDL 我正在围绕服务编写一些包装器 逻辑完全相同 但从
  • 如何在 C++ 中为指针“this”赋值

    在函数中 如何分配this一个新的价值 您可以分配对象this点于 this XY 但你不能分配直接值this this XY Error Expression is not assignable
  • 如何在 C# 中以编程方式将行添加到 DataGrid?

    正如标题所述 我正在尝试使用 C 以编程方式将行添加到 DataGrid 但我似乎无法使其工作 这是我到目前为止所拥有的 I have a DataGrid declared as dg in the XAML foreach string
  • C# 结构默认值

    我有一个方法 它接受一个包含许多具有基本数据类型的字段的结构 我想传递大部分默认值 但需要进行一些调整 但我了解结构声明中的基本字段不能包含默认值声明 例如struct S int a 42 现在是这样的 OptionsStruct opt
  • 自己绘制的WPF自定义滑块

    这是我关于堆栈溢出的第一个问题 所以不要踢它 我在尝试创建 Mac 风格的滑块控件时遇到问题 我已经发现这个解决方案 http www codeproject com KB miscctrl MAC Slider aspx我已经在我的解决方
  • 从图像创建半透明光标

    是否可以从图像创建光标并使其半透明 我目前正在拍摄自定义图像并覆盖鼠标光标图像 如果我可以将其设为半透明 那就太好了 但不是必需的 销售人员喜欢闪亮的 目前正在做这样的事情 Image cursorImage customImage Get
  • 当我尝试传递临时地址作为参数时,它是一个 UB 吗?

    对于以下 C 代码 include
  • 为什么连续抛出 2 个异常不会生成无法访问的代码警告?

    为什么以下代码行不会创建编译器警告 void Main throw new Exception throw new Exception 据我所知 编译器应该通知您无法到达第二个抛出异常 这显然是一个编译器错误 它是在 C 3 0 中引入的
  • C# 可以为控制台应用程序部分类“程序”类吗?

    我想知道是否可以将为任何控制台应用程序创建的默认 程序 类更改为部分类 我想这样做是因为我想要更好的组织 而不是将所有方法都放在按区域分类的 1 个文件中 对我来说 将某些方法类别放在单独的文件中会更有意义 我对分部类的理解是 它是多个文件
  • 运行实体框架自定义工具,它有什么作用?

    在 Visual Studio 中 当使用实体框架并为 tt 和 Context tt 文件应用运行自定义工具时 它是什么以及它有什么作用 为什么它解决数据库同步问题 有时 为什么我应该在运行 tt 之前运行它 Context tt 它被称
  • fgets溢出后如何清除输入缓冲区?

    当输入字符串超出其预定义限制时 我遇到了 fgets 的小问题 以下面的例子为例 for index 0 index lt max index printf Enter the d string index 1 if fgets input
  • 从单应性估计 R/T

    我一直在尝试计算 2 个图像中的特征 然后将这些特征传递回CameraParams R没有运气 特征已成功计算并匹配 但是问题是将它们传递回R t 我明白你必须分解Homography为了使这一点成为可能 我已经使用如下方法完成了 http
  • 具有多个父项的 Qt 树模型

    我想构建一棵树 其中一个元素可以引用另一个元素 我想要构建的树是 像这样的东西 A B C D E F P this is a pointer to C D first child of C E second child of C I fo
  • 为什么我可以在另一个函数中定义一个函数?

    请参阅下面的代码 我在另一个函数中定义了一个函数 void test1 void void test2 void printf test2 n printf test1 n int main void test1 return 0 这个用法
  • 异步/等待 - 是*并发*吗?

    我一直在考虑 C 5 中新的异步内容 并且出现了一个特殊问题 据我了解 await关键字是一个简洁的编译器技巧 语法糖来实现连续传递 http en wikipedia org wiki Continuation passing style
  • 尝试后终于没有被调用

    由于某种原因 在我的控制台应用程序中 我无法运行我的finally 块 我编写这段代码是为了测试finally块是如何工作的 所以它非常简单 static void Main int i 0 try int j 1 i Generate a
  • 如何配置 qt Creator 以显示 C++ 代码而不是反汇编程序?

    昨天我做了很多事情 比如更新 GCC Clang 和重新安装 Qt Creator 今天 在逐步调试我的代码时 调试器显示的是反汇编代码 而不是我编写的 C 代码 紧迫F10 or F11 调试器正在进入汇编代码而不是 cpp nor h我
  • 如何将模型绑定到动态创建的类 nancyfx

    首先感谢任何愿意查看我的问题的人 我对 Nancyfx 还很陌生 在尝试将 JSON 有效负载绑定到动态创建的类时遇到问题 我按照这篇文章中的代码动态创建了该类 在C 中动态创建一个类 https stackoverflow com que

随机推荐

  • php中如何分离字符串中的字母和数字

    我有一个由字母和数字组合而成的字符串 对于我的应用程序 我必须用字母和数字分隔一个字符串 例如 如果我的字符串是 12jan 我必须分别获取 12 jan numbers preg replace 0 9 str letters preg
  • 如何根据条件更新列表中的字符串

    我陷入这样的情况 我有一个列表 但我想更改子网 21 to 24 x 192 168 8 1 21 192 168 4 36 24 192 168 47 54 16 for a in x if 21 in a 2 print a else
  • 如何使用 PHP 简单 HTML DOM 解析器用 div 替换所有 ul 和 li 标签?

    好的 我想使用 PHP Simple HTML DOM Parser 创建一个 网站移动器 在现阶段 我想 将所有 ul 和 li 标签更改为 div 标签并 将所有 table 元素 例如 table tr td th 更改为 div 我
  • 在 Windows 10 上与 tcpdump-option 一起使用时 Android 模拟器无法启动

    我可以在 Windows 10 上使用 cmd 运行 avd 命令如下 emulator avd avdmy 但是当我想使用 tcpdump 捕获网络流量时 模拟器无法启动 emulator avd avdmy tcpdump test c
  • 使用 colnames() 设置变量,使用 := 运算符更新 data.table,变量是否默默更新? [复制]

    这个问题在这里已经有答案了 嗯 这有点奇怪 似乎通过使用 运算符在 data table 中创建新列 先前分配的变量 使用 colnames 创建 会默默地更改 这是预期的行为吗 如果不是有什么问题呢 Lets make a simple
  • Ajax JSON 转为 Highcharts 饼图

    在过去的几天里 我在外部文件中的一些示例 json 数据中使用 ajax 来使用 Highcharts 库填充饼图时遇到了问题 这是文件中的示例 JSON 数据 data json Apples 43 0 Pears 57 0 这是我的 h
  • R闪亮-启用键盘快捷键?

    有没有办法暴露键盘按键 如功能键 F1 F10 来控制闪亮 例如切换标签 我能够想出一个半工作的解决方案 但是闪亮确实有一些限制 所以我用闪亮打开了一个错误 这是代码 library shiny jscode lt function doc
  • 有谁知道如何实现 C++ 项目属性规则的 DynamicEnumProperty 类型

    我正在尝试向 C 项目的自定义构建配置添加一个属性 我希望属性组合框显示可以在代码中设置的动态值列表 我认为这应该使用 DynamicEnumProperty 类型来完成 但我不确定它的实现 在此之前有人与此房产合作过可以为我指明正确的方向
  • 由用户在 C# 类中使用的 WPF 传递传入变量

    我的目标是在文件 user xaml 在文本框中 中传输用户传入的变量 并在类中返回该变量
  • SVN不递归更新

    几周前 我检查了我们的整个 SVN 存储库 non recursive模式 现在看来 当我做一个svn up 它不会递归更新文件夹 这是一个问题 因为我想从同事那里获取更改 而不必遍历每个目录并执行svn up手动 如何强制更新是递归的 以
  • 我什么时候应该使用“REQUIRED”和“NOT_SUPPORTED”作为 MDB 的 @TransactionAttribute 值?

    我了解容器管理事务 CMT 我也知道关于不同的可能值 http docs oracle com javaee 6 api javax ejb TransactionAttributeType html枚举类型的TransactionAttr
  • DI 在桌面应用程序中有意义吗?

    我即将创建一个桌面应用程序 使用 NET Windows 窗体 本质上 我想创建一个 n 层应用程序 但我也希望各层之间松散耦合 但是 我不太确定这对于 Windows 窗体来说是否是一个好方法 现在我只是想知道使用任何 IoC Struc
  • 如何停用 Spring Data 异常转换

    The new org springframework orm hibernate5 HibernateExceptionTranslator使用失败是指它首先尝试使用普通 Hibernate 来映射异常 SessionFactoryUti
  • 如何更新 vueJs 数组列表的特定行?

    有没有一种正确的方法可以刷新 vueJS 数组列表中的某一特定行而不重新加载所有数据 在本例中 它是一个电话列表
  • 为什么 AngularJS $http success/error 方法被弃用?从 v1.6 中删除?

    AngularJS 文档有一个弃用通知 http success and error方法 这个抽象被从库中删除有什么具体原因吗 问题是 success and error方法是不可链接因为他们忽略返回值 这给熟悉的人带来了问题chainin
  • 表单以 windows-1252 编码提交

    I am getting the following warning in the JS tab of the Firefox web console Ctrl Shift K 表单以 windows 1252 编码提交 无法编码 所有 U
  • 带选项的 Python 装饰器

    我有一个模块 它的函数原型与线程类的原型类似 def do fn argtuple kwargdict priority 0 block False timeout 0 callback None daemon False do stuff
  • 如何正确编写异步方法?

    所以我试图学习在 C 中使用 async 和 await 的基础知识 但我不确定我在这里做错了什么 我期待以下输出 Calling DoDownload DoDownload done output here 但我没有得到下载的输出 我也期
  • 使用 Ionic 框架生成 PDF 文件

    Ionic 框架是否有任何插件可以使用 html 内容生成 pdf 文件 基本上 我需要使用从 Ionic 移动应用程序传递的值和一些 css 样式创建一个 html 然后将其转换为 pdf 文件 该文件可以保存在设备 Android 设备
  • 多人游戏同步

    我实现了服务器 客户端架构 其中所有状态更改都发送到函数 经过验证并广播到所有连接的客户端 这工作得相当好 但系统目前无法维持游戏客户端实例之间的同步 如果服务器和特定客户端之间恰好有 5 秒的延迟 那么他将在其他客户端之后 5 秒收到状态