多线程游戏 - 更新、渲染以及如何拆分它们

2024-02-29

所以,我正在开发一个游戏引擎,并且已经取得了很好的进展。然而,我的引擎是单线程的,将更新和渲染分成单独的线程的优点听起来是一个非常好的主意。

我该怎么做?单线程游戏引擎(概念上)非常容易制作,你有一个更新->渲染->睡眠->重复的循环。但是,我想不出一种将更新和渲染分开的好方法,特别是如果我更改它们的更新速率(假设我每秒执行 25 次更新循环,并且渲染速度为 60 fps) - 如果我中途开始更新怎么办通过渲染循环,或者反之亦然?


将您的更新逻辑放在某种Updater工人阶级(实施Runnable),并将渲染器放入单独的工作类中。当需要更新数据时,让Updater将该更新放入Updater和Producer共享的队列中。最方便的是使用已经具有内置多线程支持的队列,例如BlockingQueue。示例代码请参见 javadocBlockingQueue.

如果您需要渲染所有更改,甚至是过时的更改,那么使用队列是很自然的。如果您只想渲染最新的更改,请使用ConcurrentHashMap而不是队列。

不要忘记使更新成为不可变对象,这样更新在渲染时就不可能更改。

正如 Nirmal 指出的,您可以使用某种线程池来限制线程数量并简化线程的启动/停止。参考Executor接口和ExecutorsJDK 中的实用程序类可在此处查看可用选项。

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

多线程游戏 - 更新、渲染以及如何拆分它们 的相关文章

  • 与 Eclipse 中的 Java Content Assist 交互

    作为我的插件项目的一部分 我正在考虑与 Eclipse 在 Java 文件上显示的内容辅助列表进行交互 我正在尝试根据一些外部数据对列表进行重新排序 我看过一些有关创建新内容辅助的教程 但没有看到有关更改现有内容辅助的教程 这可能吗 如果是
  • Java 的支持向量机?

    我想用Java编写一个 智能监视器 它可以随时发出警报detects即将到来的性能问题 我的 Java 应用程序正在以结构化格式将数据写入日志文件
  • 为什么即使我的哈希码值相同,“==”也会返回 false

    我写了一个像这样的课程 public class HashCodeImpl public int hashCode return 1 public static void main String args TODO Auto generat
  • 如何在 JPQL 或 HQL 中进行限制查询?

    在 Hibernate 3 中 有没有办法在 HQL 中执行相当于以下 MySQL 限制的操作 select from a table order by a table column desc limit 0 20 如果可能的话 我不想使用
  • Android中如何使用JNI获取设备ID?

    我想从 c 获取 IMEIJNI 我使用下面的代码 但是遇到了未能获取的错误cls 它总是返回NULL 我检查了环境和上下文 它们都没有问题 为什么我不能得到Context班级 我在网上搜索了一下 有人说我们应该使用java lang Ob
  • Jframe 内有 2 个 Jdialogs 的 setModal 问题

    当我设置第一个选项时 我遇到了问题JDialog模态 第二个非模态 这是我正在尝试实现的功能 单击 测试对话框 按钮 一个JDialog有名字自定义对话框 主要的将会打开 如果单击 是 选项自定义对话框主 其他JDialog named 自
  • 从 MATLAB 调用 Java?

    我想要Matlab程序调用java文件 最好有一个例子 需要考虑三种情况 Java 内置库 也就是说 任何描述的here http docs oracle com javase 6 docs api 这些项目可以直接调用 例如 map ja
  • 在 Java 中如何找出哪个对象打开了文件?

    我需要找出答案哪个对象在我的 Java 应用程序中打开了一个文件 这是为了调试 因此欢迎使用工具或实用程序 如果发现哪个对象太具体了 这class也会很有帮助 这可能很棘手 您可以从使用分析器开始 例如VisualVM http visua
  • 将非 Android 项目添加到 Android 项目

    我在 Eclipse 中有三个项目 Base Server 和 AndroidClient Base和Server是Java 1 7项目 而AndroidClient显然是一个android项目 基础项目具有在服务器和 Android 客户
  • 如何仅从 Firestore 获取最新更新的数据?

    在 Firestore 上发现任何更改时始终获取整个文档 如何只获取最近更新的数据 这是我的数据 我需要在第一次加载时在聊天中按对象顺序 例如 2018 09 17 30 40 msg和sendby 并且如果数据更新则仅获取新的msg和se
  • 将人类日期(当地时间 GMT)转​​换为日期

    我正在服务器上工作 服务器正在向我发送 GMT 本地日期的日期 例如Fri Jun 22 09 29 29 NPT 2018在字符串格式上 我将其转换为日期 如下所示 SimpleDateFormat simpleDateFormat ne
  • 如何使用 JMagick 转换色彩空间?

    如何使用 JMagick API 转换色彩空间 例如 CMYK gt RGB 和 RGB gt CMYK None
  • 在Java中运行bat文件并等待

    您可能会认为从 Java 启动 bat 文件是一项简单的任务 但事实并非如此 我有一个 bat 文件 它对从文本文件读取的值循环执行一些 sql 命令 它或多或少是这样的 FOR F x in CD listOfThings txt do
  • 蓝牙发送和接收文本数据

    我是 Android 开发新手 我想制作一个使用蓝牙发送和接收文本的应用程序 我得到了有关发送文本的所有内容逻辑工作 但是当我尝试在手机中测试它时 我看不到界面 这是Main Activity Code import android sup
  • 如何将 HTML 链接放入电子邮件正文中?

    我有一个可以发送邮件的应用程序 用 Java 实现 我想在邮件中放置一个 HTML 链接 但该链接显示为普通字母 而不是 HTML 链接 我怎样才能将 HTML 链接放入字符串中 我需要特殊字符吗 太感谢了 Update 大家好你们好 感谢
  • 在 Java 中获取并存储子进程的输出

    我正在做一些需要我开始子处理 命令提示符 并在其上执行一些命令的事情 我需要从子进程获取输出并将其存储在文件或字符串中 这是我到目前为止所做的 但它不起作用 public static void main String args try R
  • hibernate 6.0.2.Final 和 spring boot 2.7.0 的entityManagerFactory bean 未配置问题

    所以最近我想升级我的 Spring Boot 项目项目的一些依赖项 特别是这些组件 雅加达 EE 9 弹簧靴2 7 休眠 6 0 2 Final 完成此操作后 所有更新和代码折射 更新将 javax 导入到 jakarta 以及一些 hib
  • 将 JavaFX FXML 对象分组在一起

    非常具有描述性和信息性的答案将从我这里获得价值 50 声望的赏金 我正在 JavaFX 中开发一个应用程序 对于视图 我使用 FXML
  • 部署 .war 时出现 Glassfish 服务器错误:部署期间发生错误:准备应用程序时出现异常:资源无效

    我正在使用以下内容 NetBeans IDE 7 3 内部版本 201306052037 爪哇 1 7 0 17 Java HotSpot TM 64 位服务器虚拟机 23 7 b01 NetBeans 集成 GlassFish Serve
  • Spring RESTful控制器方法改进建议

    我是 Spring REST 和 Hibernate 的新手 也就是说 我尝试组合一个企业级控制器方法 我计划将其用作未来开发的模式 您认为可以通过哪些方法来改进 我确信有很多 RequestMapping value user metho

随机推荐

  • 将发布 dll 与调试主应用程序 exe 混合

    假设我有一个 Visual C 应用程序 它有一个主可执行文件和许多 dll 我有2个配置发布和调试 我只是想知道使用 mix 可能会产生什么效果 我的意思是使用带有发布主 exe 的调试 dll 或带有发布 dll 的调试 exe Tha
  • Angular - 单击菜单项后隐藏侧边栏菜单

    我创建了一个侧边栏菜单 但单击菜单项后无法隐藏该菜单 我按照以下示例https blog thecodecampus de angular 2 animate creating sliding side navigation https b
  • 如何在 Objective C 中对 NSMutableArray 进行排序 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在开发计时器应用程序 我有一个数
  • 正则表达式用 HTML 标签包裹字符串

    我有一个文本区域 其中有很多行 如下所示 1 stuff 2 more stuff 123 even more stuff 我正在使用正则表达式来查找 num 模式 0 9 我想让它们成为锚标记 例如 a href 123 123 a 但它
  • 如何在数据库中插入时间戳? [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我收到此错误 java lang IllegalArgumentException 时间戳格式必须为 yyyy mm dd 时 分
  • 两个 pandas 数据帧之间的欧几里德距离

    我有两个数据框 df1形式的 user id x coord y coord 214 55 2 22 1 214 55 2 22 1 214 55 2 22 1 and df2 形式相同 但用户不同 user id x coord y co
  • 无法安装mbstring php冲突

    我正在尝试使用 php 5 6 安装 php mbstring 并收到此错误 Error php56w common conflicts with php common 5 4 45 3 el6 remi x86 64 You could
  • 当 JavaFX 中选定的选项卡更改时如何聚焦特定节点?

    我想将焦点设置到选项卡内容中的特定节点 我添加了一个变化监听器 to 选定的项目属性如下 假设该类包含一个名为第二个节点类型的Node tabPane getSelectionModel selectedItemProperty addLi
  • html5数据属性不区分大小写吗?

    我最近注意到chrome转换数据属性data 为小写 e g div div 将被转换为 div div 在 Chrome 开发工具中 当我用 javascript 调用该属性时 console log e hasAttribute dat
  • Jekyll 如何处理 _posts/subdir 中的帖子

    Jekyll Bootstrap 项目在目录中有一篇示例博客文章 posts core samples 我假设 子目录中的帖子 文件 的处理方式与根目录中的帖子相同 它是否正确 如果是这样 我将添加一个 stage 子目录 将其排除 这样我
  • 为什么不使用记录的创建时间作为主键?

    我有一个表 其中有一个自动递增的 PK 和creation date 字段 这是unix 时间戳 我想知道为什么不丢失自动递增字段并使用创建日期字段作为 PK 因为它是唯一的 我使用 1 1000 秒的精度 对于 我正在删除一个索引行 反对
  • ffmpeg - 我可以将音频通道绘制为图像吗?

    我想知道是否可以使用 ffmpeg 将视频或音频文件的音频通道绘制为图像 或者是否有其他工具可以在 Win2k8 x64 上执行此操作 我将这样做作为用户上传视频或音频文件后编码过程的一部分 我使用 ColdFusion 10 来处理上传并
  • 安装 phpredis MAC OSX

    任何人都可以帮我在 MAC OSX 中安装 php redis 吗 brew install php redis 不工作 pecl install php redis 也不起作用 无效的包名称 包文件 php redis 自制错误 自制错误
  • 在 Postgres 中收集递归 JSON 键

    我有 JSON 文档以 JSON 数据类型 Postgres 9 3 存储在 Postgres 中 并且我需要递归地收集树中的键名称 例如 给定这个 JSON 树 files folder file1 property blah file2
  • 更改 EF4 中的数据库表名称(实体框架 4)

    有谁知道如何更改 EF4 实体框架 4 中实体的映射数据库表 稍后编辑 我想我已经在模型浏览器中找到了定义表名称的位置 但它们的名称是只读的 因此无法使用设计器对其进行编辑 另外 在 xml 模式中没有对表名称的引用 根据我的搜索 如果您只
  • unittest 测试用例中的重复代码

    我有一个如下所示的测试用例 def MyTestCase unittest Testcase def test input01 self input read from disk input01 output run input valid
  • 为什么字符范围类 [A-z] 匹配下划线?

    在多种语言中尝试过 结果相同 JavaScript 示例 A z test gt true A z test 0 gt false A z test gt false A z test A gt true 为什么第一个病例没有返回false
  • 使用 JavaScript 调整图像大小并保存到磁盘

    我试图将由 JavaScript 完成的调整大小的图像上传到服务器 所以我尝试使用调整大小的图像设置文件输入 后来我才知道除非用户选择文件 否则我们无法更改文件输入 https stackoverflow com questions 169
  • 如何在服务器上定位Sh​​arepoint文档库源页面?

    我正在使用 Sharepoint 文档库 并且正在尝试查找文档库页面的源 我正在 Sharepoint 服务器上工作 我就是找不到它 它应该存放在哪里 谢谢你 SharePoint 不会将页面直接存储在文件系统中 该机制有点不那么简单 要了
  • 多线程游戏 - 更新、渲染以及如何拆分它们

    所以 我正在开发一个游戏引擎 并且已经取得了很好的进展 然而 我的引擎是单线程的 将更新和渲染分成单独的线程的优点听起来是一个非常好的主意 我该怎么做 单线程游戏引擎 概念上 非常容易制作 你有一个更新 gt 渲染 gt 睡眠 gt 重复的