我正在使用Java创建一个应用程序,并在执行此操作后注意到:
g.drawImage(ImageIO.read(...)....);
它消耗了更多的CPU和帧,所以我开始怀疑
这会占用多少内存?以及是否还有其他更好的方法来绘制图像。
谢谢!
答案 0 :(得分:2)
drawImage
占用了大量CPU,而不是ImageIO.read(…)
!开放流是昂贵的,因此应该只进行一次;当你第一次需要加载图像时。绘制图像的最佳方法是将其预加载到BufferedImage
(或者如果您操纵像素VolatileImage
)。
BufferedImage imageToDraw = ImageIO.read(getClass().getResource("path/To/Image.png"));
该路径从.java文件的目录开始。因此,您需要添加包含图像的文件夹。加载图像有许多不同的方法,其中更多讨论here。
然后你可以像以前一样画画。
g.drawImage(imageToDraw, x, y, null);
这应该更多更快。如果您仍然遇到速度问题,那么this问题可能会有用。
答案 1 :(得分:0)
一种可能性是使用visualvm:http://visualvm.java.net。我已经成功地使用了它。
快速步骤:
初始基线分析完成后,您会看到活动对象的直方图。
您可以拍摄快照并进行比较,在套餐上设置过滤器等。请参阅http://visualvm.java.net/docindex.html
答案 2 :(得分:0)
如果您正在阅读图像而不是将其作为图像的实例,那么您将占用过多的内存。
我非常强烈建议将图像存储为带有ImageIO.read(params)的Image实例,而不是绘制它并在每个循环传递中读取它。
你最有可能在你的Canvas / JPanel / Swing Component类中这样做:
private Image myImage;
//Assume other code here
public void loadImages() {
myImage = ImageIO.read(params);
//load any other images
}
public void paint(Graphics g) {
g.drawImage(myImage, x, y, null);
}
就像任何其他应用程序一样,资源(图像,数据等)都在启动时加载。