【发布时间】:2014-01-20 10:41:15
【问题描述】:
编辑:有关此问题的答案,请参阅此答案的 cmets。 TLDR:瓶颈是缩放图像,但分析显示这是 ImageIcon 构造函数中的一个问题。
$ java -version
Picked up _JAVA_OPTIONS: -Dswing.aatext=true -Dawt.useSystemAAFontSettings=on
java version "1.7.0_45"
OpenJDK Runtime Environment (IcedTea 2.4.3) (ArchLinux build 7.u45_2.4.3-1-x86_64)
OpenJDK 64-Bit Server VM (build 24.45-b08, mixed mode)
我的应用程序在启动时会加载 1,380 个图标。加载代码如下所示。使用 SSD 磁盘,ImageIcon 构造函数调用实际上比磁盘读取更昂贵(磁盘读取可能会使用一些缓存..)
加载图标需要5.4s,其中3.2s用在ImageIcon构造函数中。
有没有办法加快 ImageIcon 的构建或使用其他方法?
private ImageIcon setIcon(LogicalIcon iconInfo, int size) {
ImageIcon icon = iconImages.get(iconInfo.getIconName());
if(icon == null) {
BufferedImage image = null;
try {
image = ImageIO.read(getBestPreviewIcon(iconInfo).getFile());
icon = new ImageIcon(ImageUtils.scaleDownTo(image, new Dimension(size, size)));
iconImages.put(iconInfo.getIconName(), icon);
} catch (IOException e) {
// FIXME: Add a "Missing Image" icon
e.printStackTrace();
}
}
setIcon(icon);
return icon;
}
【问题讨论】:
-
重采样需要时间;尝试不缩放。
-
您在考虑调用 scaleDownTo 吗?我也预计这是问题所在,但根据 NetBeans 分析器,这仅占 9 毫秒。可能是 Image 类使用了一些后期绑定,所以在请求之前它实际上并没有完成。我会检查的。编辑:是的,禁用缩放完全消除了瓶颈..我想我毕竟需要添加一个加载屏幕..以及选择缩放质量的设置..
-
是的,我可以在显示进度条时使用它。应用程序的唯一目的是选择图标,所以在加载图标之前没有用。
标签: java performance swing