我正在實現一個棋盤遊戲,其中每個玩家有幾個單位,並且每個單位都向使用我使用以下方法從文件中讀取的公共圖像向用戶顯示。我在應用程序啓動時閱讀這個圖像,並在稍後使用它。在這種情況下使用緩存生成BufferedImages?
private static BufferedImage readBufferedImage (String imagePath) {
try {
InputStream is = IconManager.class.getClassLoader().getResourceAsStream(imagePath);
BufferedImage bimage = ImageIO.read(is);
is.close();
return bimage;
} catch (Exception e) {
return null;
}
}
單位與位於該共同圖像的頂部各種豐富多彩的令牌不同。
之前,我只加幾個commonImages到JPanel並標記使用其漂浮於commonImage
頂部//at startup
ImageIcon commonImage = new ImageIcon(readBufferedImage("image.png"));
...
JPanel panel = new JPanel();
panel.add(commonImage);
panel.add(commonImage);
//located JLabels with token on the top of each commonImage
不過,現在我想用JScrollPane的,而不是的JPanel的JLabel實現的,所以我認爲它在將其展示給用戶之前,將drawString()和drawImage()提供給每個commonImage是一種更好的方法。
我估計的單位數量大約爲20.所以現在每個單位我都需要生成帶有各種令牌配置的動態單獨BufferedImage。
問題是我應該緩存已經生成的BufferedImages,這取決於令牌配置從緩存中提取,如果圖像之前已經生成了相同的配置?
如果您可以緩存部分或全部結果,則重繪速度會更快。例如,您可以生成每個令牌的「BuffereImage」並將其繪製,再加上每條路徑上的公共圖像。由於常見圖像是共享資源,它會更好(恕我直言)嘗試,只保留一個副本(而不是將圖像和文本合併成一個圖像) - 這當然歸結於單位數量和大小。內存摺衷爲每個單元生成一個單一的圖像,因爲在那裏「令牌」可能是可協商的。你認爲繪製任何一種方法都很容易 – MadProgrammer
「它會更好(恕我直言)嘗試,只保留一個副本(而不是將圖像和文本合併成一個圖像)」 - @MadProgrammer,但如何實現這一點?我已經完成了JLabels的浮動工作,但從現在開始,我將所有內容都放入了ScrollPane中,因此當滾動發生時相應地移動JLabels會非常複雜,並且當通用圖像由於滾動而變得不可見時,隱藏其中的一部分。 –
滾動窗格將照顧它。事實上,您可以將現有面板轉儲到滾動窗格中,並根據需要調整遊戲板的大小,屏幕窗格將爲您處理它。 – MadProgrammer