2011-09-25 179 views
1

我目前正在研究一個簡單的2D自上而下射擊遊戲,讓您在地圖上操縱角色。圖形仍然處於「測試」階段(純色和矩形)。繪製過程如下:快速重繪地圖的有效方法(Java/JPanel)

  • 我有地圖(這基本上只是牆壁或自由空間)存儲爲一個整數數組,然後循環並繪製到我的JPanel上。
  • 一旦繪製了地圖,我會瀏覽地圖上的每個「實體」(通電,其他字符)並放置它們。
  • 最後,我畫的用戶的字符

我嘗試用不同的方法,最後決定用戶的角色會留在屏幕與地圖周圍移動中心。

目前,它工程但它似乎。我只有4面牆,2個實體,用戶的角色正在繪製,它的速度是90FPS,經常在60-70左右。如果遊戲結束,這將是可以接受的,但是我仍然有更加奇特的圖形,更多的實體,牆壁,子彈等被渲染到地圖上。我嘗試增加我的gameloop的速度,它可以高達230 FPS,但即使如此,當我進入實體或牆壁的區域時,它會降至50-70。

我試圖限制什麼繪製只有什麼是可見的,但結果是可以忽略不計,甚至是負面的。

目前paintComponent()方法看起來是這樣的:

public void painComponent(Graphics g) { 

for(int x = 0; x < Map.size.getWidth() ; x++) { 

     for(int y = 0; y < Map.size.getHeight(); y++) { 

       if(mapArray[y][x] == WALL) { 
        g.setColor(Color.BLACK); 
        g.fillRect(x, y, wallSize, wallSize); 
       } 

     } 
    } 

    for(int i = 0; i < map.countEntities(); i++) { 

     Entity obj = map.getEntity(i); 

     g.setColor(Color.WHITE); 
     g.fillRect(obj.getCoords().x, obj.getCoords().y, obj.getSize().width, obj.getSize().height); 

    } 

    Robot bot = map.getPlayerBot(); 

    g.setColor(Color.BLACK); 
    g.fillRect(bot.getCoords().x, bot.getCoords().y, bot.getSize().width, bot.getSize().height); 
} 

做任何你大師那裏有任何提示,以加快這一點嗎?

+0

爲什麼不只是將背景繪製到BufferedImage中一次,然後根據需要將圖像繪製到屏幕上,而不是遍歷所有地圖元素並每次繪製它們。 – MeBigFatGuy

+0

我剛試過這個。當窗口尺寸很小時,效果很好(90-100),因爲它不需要渲染整個圖像。但是當遊戲全屏運行時,FPS立即下降到40-50。這是與我的GameLoop運行儘可能快 – williamg

+0

只是一個小小的調整:我認爲你可以安全地移動'機器人bot = map.getPlayerBot();'出paintComponent(g)。似乎你正在查詢coords只有一個'Robot'實例的值。 – PraveenMax

回答

0

塞弗的答案已經被考慮和實施,但沒有提高速度。顯然,繪製的圖像根本不是問題。問題是我用來調用更新方法的計時器。我正在使用Timer類的一個實例,它似乎非常不可靠,尤其是在這些小的時間間隔內。在刪除定時器並根據系統時鐘調用我的更新方法後,我能夠達到並保持令人難以置信的高FPS。

+0

對於Timer類,所有可以確定的是,它將等待'至少'N個刻度,而不是在N個刻度後開始。 – Seph

2

除了在下面的鏈接中提到的答案: Java 2D Drawing Optimal PerformanceJava2D Performance IssuesJava 2D game graphicsHow to display many SVGs in Java with high performance

一種常見和簡單的技巧,以提高2D性能是吸引所有的靜態對象(「背景」)到一個緩衝的圖像,然後當繪製下一個圖像時,您只需從前一個屏幕相應地偏移背景圖像的像素,那麼您只需要在屏幕的兩個邊緣周圍繪製像素,而不是整個屏幕,這只是真正重要的當你在屏幕上繪製大量圖像圖層時。

除此之外,請確保啓用雙緩衝,以便在繪製下一張圖像時繪圖不會嘗試繪製到實際屏幕。

+0

到目前爲止,我已經將靜態圖像寫入圖像,但速度沒有顯着提高。假設我試圖畫的圖像是1000x1000,我應該多快能畫出它?目前,我正在每15毫秒重新繪製一次,這個速度差不多沒有滯後。試圖更頻繁地繪製它是否合理? – williamg