【问题标题】:Eclipse Debugging IssueEclipse 调试问题
【发布时间】:2023-03-14 01:45:01
【问题描述】:

我有一个使用 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 的 Run 模式下似乎运行良好,但是当我在 Eclipse 的 Debug 模式下启动程序时,游戏运行非常缓慢并且非常有故障。去掉这块代码,让调试模式运行起来和运行模式一样流畅。

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

【问题讨论】:

  • 您可以尝试将 e.get(X|Y) 的调用拉出循环。在调试中,eclipse 可能会觉得需要在每次迭代时实际调用它们。

标签: java arrays lwjgl


【解决方案1】:

这些可能会有所帮助:

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 评论是有效的。尝试将不变量移出循环,以便它们只计算一次。

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

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

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

但请注意过早的优化。

【讨论】:

  • 啊,谢谢您的帮助 :) 我将 empty.length 移到了一个局部变量中,现在它似乎运行得很好。 :)
猜你喜欢
  • 2012-07-11
  • 2011-01-16
  • 2013-02-24
  • 1970-01-01
  • 1970-01-01
  • 2011-04-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多