【问题标题】:Correct use of SwingWorker in Java Swing game loop在 Java Swing 游戏循环中正确使用 SwingWorker
【发布时间】:2015-02-18 23:50:16
【问题描述】:

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

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

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

【问题讨论】:

    标签: java multithreading swing


    【解决方案1】:

    宽相位算法

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

    • 如果要执行 n^2 次碰撞检查,则需要宽相位算法。

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

    资源: Broad-phase collision detection methods?

    在大多数应用中,我已经看到一种有效的宽相位算法将所花费的时间减少了几个数量级。当然,这会因情况而异。

    祝你好运。

    【讨论】:

      【解决方案2】:

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

      模拟将在它自己的线程中运行,通过图形引擎使用 SwingUtilities#invokeLater 方法更新可显示状态。模拟通常会尝试达到每秒一定数量的模拟滴答声,介于两者之间。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-01-21
        • 1970-01-01
        • 2014-03-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多