Java:使用 Swing 进行游戏编程

2024-02-21

我对游戏开发比较陌生。我现在已经开发游戏并学习游戏开发2-3个月了。我使用Java。

我一直使用 Swing 来制作图形(也就是说,整个游戏都显示在JPanel, 用一个Graphics2D目的)。到目前为止我没有遇到任何问题。

最近,我在最近的项目中遇到了一个问题。某些方法在以一致的时间间隔调用时存在问题(有时它应该每 15-16 毫秒运行一次,有时它开始每 3000 (!) 毫秒运行一次)。

我做了一些令人沮丧的调试和一些研究,发现发生这种情况的原因可能是因为我没有正确处理 Swing 和线程。

我的整个游戏循环都在run()线程的方法(不是 EDT)。所以我一直在 EDT 之外修改 Swing 元素。显然,这必然会引起问题。

当我发现问题所在时,我想:

“嘿,我会简单地使用SwingUtilities.invokeLater()为了在 EDT 内运行游戏循环!”

但后来我想起来了,就像‘禁止’一样操纵 Swing 元素outside东部夏令时间,操纵起来也有问题来自的非 Swing 对象inside the EDT (我想……这是正确的吗?).

如果是这样,那么我不知道如何使用 Swing 在 Java 中开发游戏不会遇到奇怪的问题.

我的问题是:

如何使用 Swing 安全地开发游戏?为了避免涉及 Swing 和线程的问题,我应该严格遵守哪些良好的指导方针?每个使用 Swing 的游戏开发人员都应该了解哪些说明?

理解这一点对我来说非常重要,因为我真的很想使用 Java 进行游戏开发,但如果我不理解这一点,我总是会遇到奇怪的问题并且无法取得进展。

感谢您的帮助


只要你除了面板上绘制的图形之外不修改任何东西,你就可以should大部分时间都还好。就像单个非 EDT 线程一样大多数时候。只要您不添加或删除任何 gui 元素,不调整任何内容的大小,不隐藏任何内容等,Swing 就不会对其内部细节进行足够的修改,从而导致线程和 EDT 之间的竞争条件 - 大多数的时间。

即使用户在非 EDT 代码上绘图时最小化面板也不会导致崩溃 - 面板可能会丢弃旧的图形上下文并开始使用新的图形上下文,但旧的上下文将保持有效直到你释放它(这与 C++ 不同,C++ 中delete立即使对象无效,这会在其他线程仍然使用本地指针时导致崩溃)。

问题是,如果您使用“我还没有看到出现问题的情况,总是对我有用”的方法,那么您将依赖于未定义的行为,并且您的代码可能会在更新后立即开始崩溃你的 JVM。

你能做的最好的事情就是在 EDT 线程上设置你的 GUI,在不同的线程上运行你的游戏逻辑,调用一个计时器repaint()每 20 毫秒在面板上显示一次(或任何您希望的帧速率)。然后,有一个类对象来保存显示当前游戏状态所需的所有内容。在一个synchronized代码块,让面板的paint()生成它自己的对象副本,并且有paint()在主线程计算游戏需要的任何内容时使用副本。主线程应该使用相同的synchronized当然要写入类对象。这样,您就可以在线程之间获得最大可能的分离。

仅在 EDT 上运行整个游戏线程可能是行不通的,因为游戏执行的任何操作可能需要一段时间才会导致 UI 冻结。任何需要大量 UI 资源的东西都会影响你的游戏逻辑。

顺便说一句,您确定您最初的问题(时不时地长时间延迟,但并非总是如此)不是垃圾收集的结果吗?我已经见过好几次了;如果您不使用并行垃圾收集器,GC 可能会运行几十秒并阻塞其他所有内容。

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

Java:使用 Swing 进行游戏编程 的相关文章

  • @RestController 没有 @ResponseBody 方法工作不正确

    我有以下控制器 RestController RequestMapping value base url public class MyController RequestMapping value child url method Req
  • 通过SOCKS代理连接Kafka

    我有一个在 AWS 上运行的 Kafka 集群 我想用标准连接到集群卡夫卡控制台消费者从我的应用程序服务器 应用程序服务器可以通过 SOCKS 代理访问互联网 无需身份验证 如何告诉 Kafka 客户端通过代理进行连接 我尝试了很多事情 包
  • 使用 GWT 读取非常大的本地 XML 文件

    我正在使用 GWT 构建我的第一个 Java 应用程序 它必须从一个非常大的 XML 文件中读取数据 当我尝试发送对文件中信息的请求时遇到问题 并且我不太确定它是否与文件的大小或我的语义有关 在我的程序中 我有以下内容 static fin
  • GWT - 如何组织项目以拥有多个网页以及它们之间的导航

    我是 GET 的新手 顺便说一句 它给我留下了深刻的印象 并且发现它对于像我这样熟悉 C NET 桌面技术并愿意编写 Web 应用程序的人来说非常有吸引力 我根据 GWT Eclipse 向导生成的示例启动了自己的项目 该项目生成带有面板的
  • 通往楼梯顶部的可能路径

    这是一个非常经典的问题 我听说谷歌在他们的面试中使用过这个问题 问题 制定一个递归方法 打印从楼梯底部到楼梯顶部的所有可能的独特路径 有 n 个楼梯 您一次只能走 1 步或 2 步 示例输出 如果它是一个有 3 级楼梯的楼梯 1 1 1 2
  • 是否可以使用 Flying Saucer (XHTML-Renderer) 将 css 解析为类路径资源?

    我正在尝试将资源打包到 jar 中 但我无法让 Flying Saucer 在类路径上找到 css 我无法轻松构建 URL 来无缝解决此问题 https stackoverflow com questions 861500 url to l
  • 大数据使用什么数据结构

    我有一个包含一百万行的 Excel 工作表 每行有 100 列 每行代表一个具有 100 个属性的类的实例 列值是这些属性的值 哪种数据结构最适合在这里使用来存储数百万个数据实例 Thanks 这实际上取决于您需要如何访问这些数据以及您想要
  • 当客户端关闭连接时,Spring StreamingResponseBody 请求线程未清理

    我在控制器中有一个端点 它返回一个StreamingResponseBody 用于向客户端发送文件 其代码大致如下 RestController RequestMapping value api public class Controlle
  • 如何使用 Hibernate (EntityManager) 或 JPA 调用 Oracle 函数或过程

    我有一个返回 sys refcursor 的 Oracle 函数 当我使用 Hibernate 调用该函数时 出现以下异常 Hibernate call my function org hibernate exception Generic
  • Java Swing For mac 中的 DJ Native Swing 浏览器

    我有一个用 Swing 制作的 Java 应用程序 并且使用了一个 DJ Native Swing 浏览器 当我尝试在 OS X 上使用它时 它抛出了一个NoClassDefFoundError尽管我添加了 swt jar 但始终如此 有人
  • 如何避免 ArrayIndexOutOfBoundsException 或 IndexOutOfBoundsException? [复制]

    这个问题在这里已经有答案了 如果你的问题是我得到了java lang ArrayIndexOutOfBoundsException在我的代码中 我不明白为什么会发生这种情况 这意味着什么以及如何避免它 这应该是最全面的典范 https me
  • 了解joda时间PeriodFormatter

    我以为我明白了 但显然我不明白 你能帮我通过这些单元测试吗 Test public void second assertEquals 00 00 01 OurDateTimeFormatter format 1000 Test public
  • 流中的非终结符 forEach() ?

    有时 在处理 Java Stream 时 我发现自己需要一个非终端 forEach 来触发副作用但不终止处理 我怀疑我可以用 map item gt f item 之类的方法来做到这一点 其中方法 f 执行副作用并将项目返回到流中 但这似乎
  • Hamcrest Matchers - 断言列表类型

    问题 我目前正在尝试使用 Hamcrest Matchers 来断言返回的列表类型是特定类型 例如 假设我的服务调用返回以下列表 List
  • Resteasy 可以查看 JAX-RS 方法的参数类型吗?

    我们使用 Resteasy 3 0 9 作为 JAX RS Web 服务 最近切换到 3 0 19 我们开始看到很多RESTEASY002142 Multiple resource methods match request警告 例如 我们
  • 使用按钮作为列表的渲染器

    我想使用一个更复杂的渲染器 其中包含列表的多个组件 更准确地说 类似于this https stackoverflow com questions 10840498 java swing 1 6 textinput like firefox
  • OpenCSV:将嵌套 Bean 映射到 CSV 文件

    我正在尝试将 bean 映射到 CSV 文件 但问题是我的 bean 具有其他嵌套 bean 作为属性 所发生的情况是 OpenCSV 遍历属性找到一个 bean 然后进入其中并映射该 bean 内的所有数据 如果找到另一个 bean 它就
  • .NET UI 元素线程限制的原因

    我们知道 除了实例化元素的线程之外 不可能从任何线程执行操作任何 UI 元素属性的代码 我的问题是 为什么 我记得当我们使用 COM 用户界面元素时 在 COM Visual Basic 6 0 时代 所有 UI 元素都是使用 COM 类和
  • 将 Apache Camel 执行器指标发送到 Prometheus

    我正在尝试转发 添加 Actuator Camel 指标 actuator camelroutes 将交换 交易数量等指标 发送到 Prometheus Actuator 端点 有没有办法让我配置 Camel 将这些指标添加到 Promet
  • 泛型、数组和 ClassCastException

    我想这里一定发生了一些我不知道的微妙事情 考虑以下 public class Foo

随机推荐

  • Typescript 和 Google 关闭

    我使用 Typescript 命令 tsc 创建一个包含所有平台类的 Javascript 文件 tsc Main ts out script myProject debug js declarations 然后 我想用 Google Cl
  • 将 Android Studio 更新到 2020.3.1 Canary 14 Build 后未解决的 Kotlin 引用

    我目前遇到 Android Studio 警告我某些不存在的 Kotlin 函数 我认为这是 Android Studio 唯一的问题 因为我可以很好地编译和运行我的项目 例如Android Studio无法识别val rows mutab
  • 如何使用 ASP.NET 5 注册 OData

    我有一个 ASP NET 5 应用程序 我想将 OData v4 与它一起使用 这是我尝试过的 1 我导入了以下nuget包 Microsoft AspNet WebApi 5 2 3 Microsoft AspNet OData 5 7
  • Mapbox 中路线的多色折线

    我用我的应用程序记录路线 主要是摩托车路线 并希望根据路线每个点的速度为其着色 基本上我知道如何在 Mapbox 中做到这一点 这就是问题所在 由于您只能为一条折线设置颜色 因此我必须将速度部分中的路线分开 并使用其特定的颜色打印每个路线部
  • WSO2ESB 4.5.1 axi2 属性 ssl.client.auth.cert.X509 始终为 NULL

    当使用NIO SSL监听器 org apache synapse transport nhttp HttpCoreNIOSSLListener 时 没有HttpServletContext不再可用 显然 因此深入研究可能解决我发现的客户端证
  • 如何在 aws elastic beanstalk 环境实例启动上运行 shell 脚本

    我正在使用 Terraform 脚本创建 aws elastic beanstalk 环境 我需要在实例启动时启动 shell 脚本 我已经尝试过以下操作 resource aws elastic beanstalk environment
  • 无边框 TabControl wpf (XP)

    我在 WPF 中设置 TabControl 样式时遇到视觉问题 因此 即使我将选项卡控件的边框设置为 0px 且透明 右侧和底部边框上仍然有一条非常细的线 我没有找到可以解决这个问题的属性 所以也许有人遇到了同样的问题并可以分享 提前致谢
  • LibGDX指导-精灵追踪2D无限随机贝塞尔曲线

    我已经能够将平滑的动画应用于我的精灵并使用加速度计控制它 我的精灵固定为沿 x 轴左右移动 从这里开始 我需要弄清楚如何创建一条垂直的无限波浪线供精灵尝试追踪 我的游戏的目的是让用户用加速度计控制精灵的左 右移动 试图尽可能地追踪永无止境的
  • MVC4 部分视图中的淘汰赛绑定

    简而言之 我相信我所追求的是一种在 MVC4 部分视图中为剔除绑定 javascript 对象提供范围 上下文的方法 这样我就可以重用相同的部分而不会让它们互相干扰 但仍然能够在客户端引用父子视图模型 作为一个出色的菜鸟 更广泛地说 是真正
  • 查找 html 块中最宽单词的宽度

    目标是找到这里最宽单词的宽度 文本是由不同字体的单词组成的句子 如图所示 the html looks like span style font bold 14px Verdana LONGESTW span span style font
  • WSO2 API Manager - 移动应用程序如何连接到 API Manager?

    我们有一个移动应用程序 需要通过 WSO2 API Manager 来访问一些 API 由于oauth2身份验证 我们需要在移动应用程序中存储用户名和密码 安全吗 例如 可以使用用户名和密码登录API Store 对于这种情况有其他解决方案
  • Rails cron 与无论何时,设置环境

    如果您了解用于创建 cron 作业的whengem 这个问题可能才有意义 我的 Schedule rb 中有一个任务 例如 every 1 day at gt 4am do command cd RAILS ROOT rake thinki
  • SQL Server 存储过程能否以比其调用者更高的权限执行?

    我们的 SQL Server 数据库具有报告功能 允许调用者读取但不能写入任何表 因为用户 或者更准确地说 代表用户操作的 Web 应用程序打开的连接 仅具有以下数据读取器权限 数据库 我们希望能够编写一个存储过程 它是一个特殊的 清理报告
  • 为什么使用setTimeout函数会立即执行?

    我正在尝试编写简单的代码setTimeout 但是setTimeout只是不会等待它应该等待的时间并且代码会立即执行 我究竟做错了什么 setTimeout testfunction 2000 您将立即调用该函数并安排其返回值 Use se
  • 神秘的阴谋集团安装问题

    全新安装 Haskell Platform OS X Snow Leopard Platform 2010 1 0 1 这样做会导致简单的序列导致非常奇怪cabal install行为 cabal install time cabal in
  • 如何在 Visual Studio C++ Express 版本中启用自动完成功能?

    请指导我 如何在 VS C 中启用自动完成功能 通过自动完成 我的意思是 当我在控件名称后面加点时 编辑器应该显示一个下拉菜单以供选择 谢谢 开始写作 然后只需按 CTRL SPACE 即可
  • 如何在 Heroku.com 上托管的 Redmine 上安装插件

    刚刚把redmine推送到heroku平台 虽然我无法让积压插件工作 但它在本地工作得很好 我已将本地数据库推送到heroku aswwell Heroku 的公共目录不可写 但默认的 Redmine 假设 要求如此 因为在应用程序服务器启
  • 在 apache Spark 中替换 groupByKey 的方法

    我想知道更换的最佳方法按键分组与另一个操作 基本上我想获得一个RDD int 列表 测量 我的情况 consider measures like RDD of objects measures keyBy getId groupByKey
  • 为什么在自定义 WinRT C++/CX 控件中默认添加 [Windows::Foundation::Metadata::WebHostHidden]?

    当我在 WinRT C CX 项目中创建新控件时 类属性 Windows Foundation Metadata WebHostHidden Visual Studio 2012 默认添加 Example namespace Windows
  • Java:使用 Swing 进行游戏编程

    我对游戏开发比较陌生 我现在已经开发游戏并学习游戏开发2 3个月了 我使用Java 我一直使用 Swing 来制作图形 也就是说 整个游戏都显示在JPanel 用一个Graphics2D目的 到目前为止我没有遇到任何问题 最近 我在最近的项