我正在製作基於網格的遊戲,隨着窗口大小的變化調整其網格大小。我也可能在將來爲照明效果應用彩色濾光片。我很擔心這個代碼的性能,它在屏幕上畫出一個網格中的圖像。使用drawImage(...)和解決方案重複縮放和過濾圖像的性能
public void drawSquares(Graphics g){
ListIterator<Viewport> iterator = vp.listIterator();
while(iterator.hasNext()){
Viewport v = (Viewport)iterator.next();
BufferedImage img = v.getSqView().getImage();
Rectangle b = v.getPixRect();
g.drawImage(img, b.x, b.y, b.width, b.height, v.getSqView().getBackground(), null);
}
return;
}
這段代碼的作用是獲得圖像(存儲在img
),並得到它需要適應(存儲在b
),然後在通過drawImage
獲分配的空間繪製的像素矩形。
drawImage
表示它在飛行中縮放圖像 - 這意味着所有圖像都將在每幀中重新縮放。但窗口很少會重新調整大小,因此這必須浪費大量的處理器時間重複執行相同的操作。
現在我看到了這一點,並決定只更新一次調整大小的所有圖像,然後存儲結果並能夠正常繪製。
像這樣:
public void resizeImage(int width, int height){
BufferedImage resized = new BufferedImage(width, height, img.getType());
Graphics2D g = resized.createGraphics();
g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
g.drawImage(img, 0, 0, width, height, 0, 0, img.getWidth(), img.getHeight(), null);
g.dispose();
img = resized;
}
這不工作 - 我認爲這是與img = resized
。我只是用這段代碼丟失了所有的圖片。
然後我有幾個問題。
- 使用drawImage重複縮放的性能成本是多少?即使窗口在幀之間沒有調整大小,它有什麼不同嗎?
- 我應該如何獲得第二個代碼片段?出了什麼問題?
- 如果我在瓦片上應用照明濾鏡,如果我每幀都運行它,是否會消耗大量的處理器時間? (在800x800左右的顯示器上想像225個左右的小圖像)
- 應用照明濾鏡的最佳做法是什麼?我打算在整個地圖上疊加一個黑色濾光片,然後曝光光源周圍的區域。
感謝您的任何幫助!
爲了更好地提供幫助,請發佈[SSCCE](http://sscce.org/)。 –
在可能的情況下,實時執行縮放和效果,將結果緩存在臨時的'BufferedImage'中。基本的想法是保持一個需要在圖像需要改變時應用的效果鏈,以便您可以根據需要添加/刪除和重新應用它們。這也可以讓你決定何時以及如何應用效果。 – MadProgrammer