0

我有一个使用 Java 制作的 LWJGL 和 Slick2D 的游戏。我最近添加了这段代码来获取像素是否为空:

for (Entity e : onscreenents)
    if (e.getBlockID() == 1 || e.getBlockID() == -2)
        for (int x = e.getX(); x < e.getX() + 18; x++)
            for (int y = e.getY(); y < e.getY() + 18; y++)
                if (x > 0 && y > 0 && x < empty.length && y < empty[x].length)
                    empty[x][y] = false;

这段代码在 Eclipse 的运行模式下似乎运行良好,但是当我在 Eclipse 的调试模式下启动程序时,游戏运行非常缓慢并且非常有故障。删除此代码块可使调试模式像运行模式一样流畅运行。

有谁知道为什么会这样,是否是我的错?这真的很有帮助:)

4

1 回答 1

1

这些可能会有所帮助:

使用 Eclipse IDE 在调试模式下加速 Tomcat

为什么 Java 代码在调试器中变慢?

为什么在使用方法入口调试时,被调试的程序速度变慢了这么多?

如果您确实需要性能改进,那么 bmargulies 评论是有效的。尝试将不变量移出循环,以便它们只计算一次。

因此,在 for 循环之上移动e.getX()e.getY()调用,以便它们只被调用一次并将它们保存在本地变量中。相同empty.length(如果这些不会随着每个循环迭代而改变)。

甚至可能保存empty[x]到局部变量中,因为数组项取消引用比局部变量访问慢。

您还对x>0and进行了测试y>0。如果您只对 +ve 值感兴趣,那么您可以在循环之前测试e.getX()+18e.getY()+18查看它们是否为 +ve,因为您甚至可能不必执行它们。(例如,如果e.getX()+18<=0您不必执行x循环。对于 相同y

不过要注意过早的优化。

于 2011-09-04T22:43:22.900 回答