繁体   English   中英

在Java Swing游戏循环中正确使用SwingWorker

[英]Correct use of SwingWorker in Java Swing game loop

我目前正在开发一个涉及在JPanel周围移动的数千个1x1像素2D矩形的模拟。 矩形移动并可以碰撞并连接在一起。

我创建了一个Event Dispatch Thread ,它又创建了我的GUI。 然后,我创建了一个模拟实例,并使用游戏循环来控制系统,使用move()detectCollision()repaint()方法,所有矩形都存储在全局ArrayList move()将每个矩形移动1个像素,而detectCollision()检查两个矩形是否彼此相邻,并将它们连接在一起(如果适用)。

该系统目前正在运行,但运行速度极慢。 在每个方法周围放置一个计时器表明我的detectCollision()方法最多可能需要1000毫秒才能完成。 我的问题是,我可以在detectCollision()方法中使用工作线程来提高程序的效率吗?

广义算法

  • 任何算法都可以限制在仿真系统中检查碰撞的对的数量。

  • 如果您正在执行n ^ 2碰撞检查,则需要一个广泛的算法。

  • 由于您的对象已经是矩形,我认为一些空间分区技术可以帮助您。

资源: 广角碰撞检测方法?

在大多数应用中,我已经看到有效的宽相算法减少了数量级所需的时间。 但当然这会因情况而异。

祝好运。

为了处理计算密集型模拟,应用程序通常将工作分为两个领域:图形引擎,包括JPanel的子类的#repaint(); 包含#move()和#detectCollision()方法的模拟引擎。

模拟将在它自己的Thread中运行,使用SwingUtilities#invokeLater方法通过图形引擎更新可显示状态。 模拟通常试图在每秒之间实现一定数量的模拟滴答。

通常,在本机AWT内部创建事件调度程序线程(EDT)以消化从底层窗口系统到达的事件。 如果您以某种方式手动创建它,则表示您可能错误地使用Swing或AWT。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM