2011-12-20 77 views
0

我有我的遊戲裏面,每個渲染循環,通過我的地圖(128×128),它作爲你可能會說,會導致很多滯後的所有塊循環。當我第一次製作它時,我不得不讓它只渲染屏幕上的塊,否則它會立即崩潰。現在我只在屏幕上渲染塊,但仍然遍歷所有塊,看它們是否在屏幕上,這讓我的FPS在約2如何加快我的遊戲fps?

for (int y = 0; y < 128; y++) { 
     for (int x = 0; x < 128; x++) { 
      Block b = LevelGen.getBlockAt(x, y); 
      if (Forgotten.isInsideGameWindow(x * 30, y * 30)) { 
       arg1.drawImage(b.getTexture(), x * 30, y * 30); 
      } 
     } 
    } 

有沒有辦法讓它儘量沒有按」通過所有這些循環?

+0

預先加載了紋理/圖像嗎?或者,您是在每次繪製圖像時加載圖像? – eazimmerman 2011-12-20 21:33:21

+0

所有紋理都已預加載 – 2011-12-20 21:35:56

+0

「忘記」是如何知道您提供的座標是否「在遊戲窗口內?」 (例如,是什麼'Forgotten.isInsideGameWindow'辦?)如果它比較'x'和'y'您提供一些其他'x'和'y',然後an't你剛纔繪製圖像在其他'X '和'y'並且完全避免循環? – 2011-12-20 21:36:37

回答

3

找出你的顯示窗口的大小,只迭代是在它內部的塊。

final int tile_size = 30; 

final RectangleType displayWindow = Forgotten.getDisplayWindow(); 

final int left = displayWindow.getLeft()/tile_size - 1; 
final int right = displayWindow.getRight()/tile_size + 1; 
final int top = displayWindow.getTop()/tile_size - 1; 
final int bottom = displayWindow.getBottom()/tile_size + 1; 

for (int y = top; y < bottom; ++y) 
    for (int x = left; x < right; ++x) 
     canvas.drawImage (LevelGen.getBlockAt (x,y).getTexture(), 
         x * tile_size, y * tile_size); 

您可能還需要弄清楚畫布居然要繪製的哪個區域(一個或多個),而是不斷的地區「髒矩形」列表重繪。無論何時瓦片發生變化,或者精靈/粒子/通過其空間的任何東西,將該瓦片添加到矩形中。即使您只是使用一個放大的包含所有更新的髒矩形,如果您的遊戲在任何時候都不會在顯示屏上的所有點實際發生「事情發生」,您的幀速率將平均更高但是從大規模效應的影響)

擴大後認爲:

 public class Map { 
      private Rectangle dirtyRect = null; 

      public void dirty (Rectangle areaAffected) { 
        if (null == dirtyRect) { 
         dirtyRect = areaAffected; return; 
        } 
        dirtyRect = new Rectangle (Math.min (dirtyRect.getLeft(), 
                 areaAffected.getLeft()), 
               Math.min (dirtyRect.getTop(), 
                 areaAffected.getTop()), 
               Math.max (dirtyRect.getRight(), 
                 areaAffected.getRight()), 
               Math.max (dirtyRect.getBottom(), 
                 areaAffected.getBottom())); 
      } 

然後用髒矩形代替displayWindow正常吸引,你可以測試if (null == getDirtyRectangle()) return;跳過繪製在所有如果沒有什麼是改變。

+0

這工作,感謝128 fps的現在:d,IL標記爲已接受ansewer當我可以 – 2011-12-20 21:42:50

+0

順便說一句,你可以增加x + = TILE_SIZE和y + = TILE_SIZE而不是X ++或y ++ – havexz 2011-12-20 21:43:52

+0

你不能,因爲x和y使用瓦片單位, tile_size最有可能使用像素?你可以用像素來完成整個座標,但是你必須使用除法來獲得塊的座標。 – Mario 2011-12-20 21:45:51

0

你可以只插入你的代碼塊內休息..但我沒有看到這個代碼到16,32,或256倍尋找的目的...

+1

您可以預先確定屏幕上的哪些塊,然後使for循環相應地啓動和停止。 – eazimmerman 2011-12-20 21:37:11

0

嗯,你可以將數組中的所有塊包含塊對象中的座標,然後使用這些座標繪製塊。然後你只需要循環顯示在屏幕上的塊。只有在屏幕上沒有那麼多塊的情況下才有用。