Eclipse调试问题

Eclipse调试问题

问题描述:

我有一款游戏使用Java中制作的LWJGL和Slick2D。我最近加入这个代码来获得,如果一个像素为空:Eclipse调试问题

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的调试模式中的程序,游戏运行非常缓慢并且非常糟糕。删除这段代码使得调试模式和运行模式一样平稳运行。

有谁知道这是为什么发生,如果这是我的错?这将真正帮助:)

+0

您可以尝试将呼叫从e.get(X | Y)中拉出。在调试中,Eclipse可能会觉得需要在每次迭代中实际调用它们。 – bmargulies

这些可能帮助:

Speeding up Tomcat in debug mode with Eclipse IDE

Why does Java code slow down in debugger?

Why does the debugged program slow down so much when using method entry debugging?

如果你真的需要的性能提升,那么bmargulies评论是有效的。尝试将不变量移出循环(s),以便它们只计算一次。

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

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

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

请注意不成熟的优化。

+0

啊,谢谢你的帮助:)我将empty.length移入了一个局部变量,它现在似乎运行得很好。 :) – Humphrey