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

3
我目前正在开发一个模拟系统,涉及到数千个1x1像素的2D矩形在一个JPanel中移动。这些矩形会相互碰撞和合并。
我创建了一个事件调度线程来创建GUI。然后我创建了一个模拟实例,并使用游戏循环控制系统,使用move()、detectCollision()和repaint()方法,所有的矩形都存储在全局的ArrayList中。 move()方法将每个矩形向左或向右移动1像素,而detectCollision()方法则检查两个矩形是否相邻,如果适用,则将它们合并。
该系统目前可以工作,但运行速度非常慢。将计时器放置在每个方法周围显示,detectCollision()方法可能需要长达1000ms才能完成。我的问题是,我是否可以在detectCollision()方法内部使用工作线程来提高程序的效率?
2个回答

2

粗检测算法

  • 是指在模拟系统中限制要检查碰撞的对象对数的任何算法。

  • 如果您正在执行n^2次碰撞检查,则需要使用粗检测算法。

  • 由于您的对象已经是矩形,我认为一些空间划分技术应该有所帮助。

资源: 广相撞检测方法?

在大多数应用程序中,我看到高效的粗检测算法可以将时间缩短几个数量级。但当然,这取决于具体情况。

祝好运。


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

模拟将在其自己的线程中运行,使用SwingUtilities#invokeLater方法通过图形引擎更新可显示状态。模拟通常会尝试实现每秒钟一定数量的模拟时刻,并在之间进行休眠。

通常,在本机AWT中创建一个事件分派线程(EDT),以消化从底层窗口系统到达的事件。如果您正在手动创建此线程,则表示您可能在错误地使用Swing或AWT。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接