如何在多线程游戏引擎中保持世界数据同步?

2024-03-15

所以我试图为我想编写的游戏创建一个简单的多线程游戏引擎。到目前为止,一切都很顺利,没有任何问题,我什至知道我必须采取什么步骤才能完成它。

只有一件事我不知道(好吧,从技术上讲,我知道它的解决方案,但我希望有更优雅和更快的东西):基本上,我的引擎的每个部分都有一个单独的线程 -图形、输入、物理、音频等

物理线程有一个完整的世界场景节点结构,它模拟了一切。然而,我现在必须以尽可能小的开销将此结构转移到我的图形线程。理想情况下,它应该只传输自上次更新以来更改的部分。

我有用于传输这些数据的组件,唯一的问题是生成它。

到目前为止,我想到了两种不同的方法:

  • 为每次更新复制整个结构 - 非常简单,但可能会占用大量时间和内存(我没有使用大型引擎的经验 - 这可行吗?)
  • 通过用一些标志标记场景节点,然后仅复制已更改的部分来跟踪场景的哪些部分发生了变化

方法一会复制大量内存,但没有太多处理能力,方法二则相反:处理能力充足,复制的内存较少。

是否有一些通用答案,在典型的游戏环境中哪种方法会更快?


不,没有公认的通用答案,这是游戏开发当前的研究领域。

我的 2 美分是传统智慧 - 使用哪一种实际上取决于您的具体用例 - 如果您的游戏有大量数据(即它非常占用内存,就像大多数大片游戏一样),您可能只想传输更改。如果您的游戏不是内存密集型游戏(例如街机游戏),您可能可以复制整个对象。

我建议同时实现两者并连接性能计时器,看看哪个更适合您;可以实现一种能够透明地处理这两种方法的体系结构。

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

如何在多线程游戏引擎中保持世界数据同步? 的相关文章

随机推荐

  • 我试图在视图控制器之间传递数据,但 16 个变量中只有一半传递? [复制]

    这个问题在这里已经有答案了 本质上 我试图将 16 个不同的变量从一个视图控制器传递到另一个视图控制器 但只传递最后 8 个对手变量 我不确定我做错了什么 或者为什么只有那 8 个 有共同的 对手 被通过 我是 XCode 新手 所以任何可
  • 生成脚手架 ConnectionFactory 时出错

    我有一个名为 Applicant 的简单课程 我正在尝试使用实体框架添加一个模板控制器 并将 Applicant 作为我的模型类 以及一个新的数据上下文 每次我尝试创建控制器时 都会收到一个错误对话框 其中显示 无法检索 MyNameSpa
  • Internet Explorer 7 中的 @font-face 问题

    我的一个网站的 font squirrel 生成 font face 代码有问题 该字体在 Internet Explorer 7 中不显示 在其他浏览器中它工作得很好 地址是 http www mrsherskin com http ww
  • 使用 pandas 和 matplotlib 绘图

    我正在尝试用 Python 创建散点图 我有一个具有指定类别的数据框 df x 和 y 是列号 groups df groupby category fig ax plt subplots for name group in groups
  • Google + iPhone API 无需离开应用程序即可登录和共享

    我最近在我的应用程序中集成了 Google API 这很容易 我唯一的问题是 一切都需要您离开应用程序然后再回来 它使用 URL 方案 这不是我想要的行为 有没有办法直接调用他们的服务 并像在 LinkedIn API 中一样对响应执行任何
  • 太多的子进程 fork() [重复]

    这个问题在这里已经有答案了 代码 for ii 0 ii lt 24 ii switch fork case 1 printf n nproblem with fork n n exit 0 case 0 WriteOnShared Mem
  • 是否可以以有限的权限安装到程序文件中?

    我有一个将作为 MSI 包部署的应用程序 在 WiX 中编写 我正在决定是否指定elevated or limited安装程序所需的权限 除了位于 Program Files 下的默认安装位置之外 该应用程序不包含任何需要提升权限的内容 现
  • electro-forge如何指定打包的源目录?

    我已经操纵了创建反应应用程序与电子锻造app 现在我需要以某种方式指定从 CRA 生成的构建文件夹用于打包 该文件夹也应该被提供 电子锻造可以实现这样的事情吗 我知道您是在问如何告诉 electro forge 在哪个目录中找到源文件来打包
  • 无法在 FireFox 中更改 HTML5 音频标记的音量

    在本页http www metrovancouver org services solidwaste Holiday Pages Song aspx http www metrovancouver org services solidwas
  • XNA 媒体播放器快进/快退

    使用 XNA 4 0 我当前正在使用以下命令播放用户 PC XBox360 上的歌曲 Microsoft Xna Framework Media MediaPlayer Play Song song 我看到媒体播放器有一个静态属性比赛位置正
  • 如何确保 OS X 10.10 (Yosemite) 中的 Applescript 对话框焦点?

    在 OS X 10 10 Yosemite 之前 我可以通过告诉 当前应用程序 激活来确保 applescript 对话框获得焦点 tell current application activate set output to do she
  • 每当 Gem 无法在 Capistrano 中正确运行“bundle exec”时

    我在使用 Capistrano 将每当 gem 部署到我的生产环境时遇到问题 问题源于一个bundle exec whenever命令触发了一些 缺少 gem 问题 但从 shell 运行捆绑安装显示一切实际上都在那里 我的感觉是发生了两件
  • 为什么 Spring 不为关系数据库提供反应式(非阻塞)客户端?

    我用过Vert x https vertx io 用于创建反应式应用程序的工具包 支持关系数据库 例如MySQL 和 Postgres https vertx io docs vertx mysql postgresql client ja
  • C# 中日期时间更改时收到通知

    最近我正在尝试制作一个日历应用程序 它将向用户显示当前的年月日期 问题是 如果用户想让我的应用程序在第二天继续运行 我如何收到通知 我该如何更改显示的日期 我不想轮询当前日期来更新它 这在c 中可能吗 注意 我尝试过系统事件 TimeCha
  • 如何将任何类型的日期转换为 dd/mm/yyyy

    我从任何日期格式的 csv 文件接收文本 例如 dd mm yy or dd mm yyyy or mm dd yyyy or 4 may 2010 我如何转换为单一类型的格式 dd mm yyyy 我正在研究 C NET 3 5 WinF
  • MPDF 在末尾显示额外的页面

    我使用 mpdf 从 html 生成 pdf 生成的 pdf 存在一个问题 即多显示一页 如果内容在第 1 页结束 则生成 2 个页面 如果内容在第 2 页结束 则生成 3 个页面 这是我的代码
  • 用于搜索网站并提取结果的 Excel 宏

    我在工作表 1 的 A1 中有一个值 它可以是企业名称 或其关联的企业编号 当网站按编号或名称搜索时 输入需要详细信息的公司名称 或编号 后 我希望能够单击 搜索 按钮并将搜索结果显示在包含 2 列的表格中 例如工作表 1 A5 B9 标签
  • mat-error 不显示错误消息 角度 5

    问题是即使我将字段留空并移至另一个字段 也不会显示错误消息 我无法找到我在这里做错了什么 任何帮助将不胜感激 如果我在 onFormValuesChanged 上放置断点 它永远不会到达断点 我尝试过在构造函数内移动表单的构建部分 但没有任
  • 在iOS项目中使用Java库

    我正在开发一个项目 需要基于相对复杂的规则集进行业务逻辑计算 计算将在以下平台上执行 安卓应用程序 iOS app Java EE 应用程序容器 业务逻辑不依赖于任何特定于平台的细节 而是严格与 数字运算 有关 为了避免 Java 和 Ob
  • 如何在多线程游戏引擎中保持世界数据同步?

    所以我试图为我想编写的游戏创建一个简单的多线程游戏引擎 到目前为止 一切都很顺利 没有任何问题 我什至知道我必须采取什么步骤才能完成它 只有一件事我不知道 好吧 从技术上讲 我知道它的解决方案 但我希望有更优雅和更快的东西 基本上 我的引擎