我目前正在研究一個簡單的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);
}
做任何你大師那裏有任何提示,以加快這一點嗎?
爲什麼不只是將背景繪製到BufferedImage中一次,然後根據需要將圖像繪製到屏幕上,而不是遍歷所有地圖元素並每次繪製它們。 – MeBigFatGuy
我剛試過這個。當窗口尺寸很小時,效果很好(90-100),因爲它不需要渲染整個圖像。但是當遊戲全屏運行時,FPS立即下降到40-50。這是與我的GameLoop運行儘可能快 – williamg
只是一個小小的調整:我認爲你可以安全地移動'機器人bot = map.getPlayerBot();'出paintComponent(g)。似乎你正在查詢coords只有一個'Robot'實例的值。 – PraveenMax