2011-09-04 106 views
0

我有一款遊戲使用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

回答

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評論是有效的。嘗試將不變量移出循環(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