我正在实施一个棋盘游戏,其中每个玩家都有几个单位,每个单位都是使用我使用以下方法从文件中读取的公共图像向用户显示的。我在应用程序启动时读取了这个图像,并将在以后使用它。
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;
}
}
单位因位于该常见图片顶部的各种彩色标记而异。
在我向JPanel添加几个commonImages之前,令牌是使用漂浮在commonImage顶部的JLabel实现的
//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,所以我认为在向用户展示之前,将drawString()和drawImage()更好地用于每个commonImage。
我估计大约有20个单位为20个。所以现在每个单位的每一个转弯我需要动态生成具有各种令牌配置的BufferedImage。
问题是我是否应该根据令牌配置缓存已生成的BufferedImages,以便在使用相同配置之前生成图像时从缓存中提取?
答案 0 :(得分:1)
你问的问题取决于几个因素:
因此,如果不了解您的申请,任何人都无法为您提供准确的答案。
一般情况下,如果您只是移动令牌,应该快速实现图纸面板的update
和paintComponent
方法。如果您保存基本图像,令牌图像和当前生成的图像(基本上是您提出的),我不会预料到性能问题。关键是要在自定义update
方法中更新图像,并始终使用paintComponent
方法绘制当前结果图像。
<强>更新强>
例如,您可以使用与此类似的代码缓存当前显示:
private BufferedImage cachedImage;
...
@Override
public void paintComponent(Graphics g){
//If the image needs to be refreshed draw it to the cache first
if(cachedImage == null){
cachedImage = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_4BYTE_ABGR);
super.paintComponent(cachedImage.getGraphics());
}
//Draw the image from cache
g.drawImage(cachedImage, 0, 0, this);
}
如果要清除缓存,请在执行更新的方法中设置cachedImage = null;
但在你的情况下,