Java Graphics drawImage耗多少钱?

时间:2014-07-26 00:05:08

标签: java graphics

我正在使用Java创建一个应用程序,并在执行此操作后注意到:

g.drawImage(ImageIO.read(...)....);
它消耗了更多的CPU和帧,所以我开始怀疑 这会占用多少内存?以及是否还有其他更好的方法来绘制图像。

谢谢!

3 个答案:

答案 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。我已经成功地使用了它。

快速步骤:

  • 在本地启动您的应用
  • 启动visualvm
  • 工具>选项>分析>杂项(下)>重置校准数据:确定
  • 在VVM中,连接到您的应用,即在左侧框架中,双击pkg.YourMainClass(pid 2112)
  • Profiler选项卡,然后单击Memory。

初始基线分析完成后,您会看到活动对象的直方图。

您可以拍摄快照并进行比较,在套餐上设置过滤器等。请参阅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);
}

就像任何其他应用程序一样,资源(图像,数据等)都在启动时加载。