2013-01-19 28 views
1

我正在製作基於網格的遊戲,隨着窗口大小的變化調整其網格大小。我也可能在將來爲照明效果應用彩色濾光片。我很擔心這個代碼的性能,它在屏幕上畫出一個網格中的圖像。使用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。我只是用這段代碼丟失了所有的圖片。

然後我有幾個問題。

  1. 使用drawImage重複縮放的性能成本是多少?即使窗口在幀之間沒有調整大小,它有什麼不同嗎?
  2. 我應該如何獲得第二個代碼片段?出了什麼問題?
  3. 如果我在瓦片上應用照明濾鏡,如果我每幀都運行它,是否會消耗大量的處理器時間? (在800x800左右的顯示器上想像225個左右的小圖像)
  4. 應用照明濾鏡的最佳做法是什麼?我打算在整個地圖上疊加一個黑色濾光片,然後曝光光源周圍的區域。

感謝您的任何幫助!

+0

爲了更好地提供幫助,請發佈[SSCCE](http://sscce.org/)。 –

+0

在可能的情況下,實時執行縮放和效果,將結果緩存在臨時的'BufferedImage'中。基本的想法是保持一個需要在圖像需要改變時應用的效果鏈,以便您可以根據需要添加/刪除和重新應用它們。這也可以讓你決定何時以及如何應用效果。 – MadProgrammer

回答

1

使用drawImage重複縮放的性能成本是多少?即使窗口在 幀之間沒有被調整大小,它是否與 有什麼不同?

你應該總是測量,但是這裏肯定會有性能成本,即使窗口沒有調整大小,因爲Javadoc說,這個drawImage方法沒有緩存。成本還取決於幀速率。

我應該如何獲得第二個代碼片段?出了什麼問題?

的第二代碼片段應該是OK的,我認爲這個問題是其他地方。嘗試在「小而全」的程序中重現問題,如果您仍然看到問題,請發佈另一個問題。

如果我在瓦片上應用照明濾鏡,那麼如果我每幀都運行它,是否會消耗大量的處理器時間? (想想225個左右爲800x800左右的顯示器上的小圖像)

您應經常測量:)

什麼是應用照明過濾器的最佳實踐?我打算在整個地圖上疊加一個黑色濾光片,然後曝光光源周圍的區域。

您可以使用AlphaComposite

2

調整此Grid的幀大小以獲得延遲的主觀感受。使用顯示的方法here來測量延遲。在profiler中驗證您的發現。

沒有理由不應該按照您的建議將List<Image>的元素調整大小,但add()resized實例會在創建新列表時調整大小。