想到的一个想法是,如果您知道一张图片会被大量使用,您可以cache 它,这可能会有所帮助。
有一些方法可以使用 BufferedImage 和 ImageIcon 直接引用图像文件(我会直接链接,但我没有足够的点数:/)。
可能将缓存和直接引用与图像文件混合使用有助于加快处理速度。除了缓存之外,您还可以找到一种方法将需要相同图像文件的所有对象组合在一起(这可以通过将使用此精灵的所有对象创建一个数组列表来完成。),因此一旦其中一个对象渲染文件时,他们都从缓存中渲染它。然后为下一个图像清除缓存。
另外,如果你有指向你的精灵的变量,那么你可以让对象加载变量,而不是它们都必须指向图像文件。
即
String path = "Image1.jpg";
File file = new File(path);
BufferedImage image = ImageIO.read(file);
然后您的所有对象都引用图像作为其图像的来源。但是,我不确定这是否比单独将每个对象指向文件更快,这只是一个想法。
希望其中一些回答您的问题。祝你好运!
---编辑---
所以我的下一个想法可以使用父类和或只是另一个包含 ArrayList 的类来实现。所以我们的想法是,您不希望每次要加载图像时都必须使用方法 images.get(imgPath)。
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import javax.swing.ImageIcon;
class SomeClass{
ImageIcon imgOne = new ImageIcon(new BufferedImage(images.get(imgPath)))
ImageIcon imgTwo = new ImageIcon(new BufferedImage(images.get(imgPathTwo)))
private ArrayList<ImageIcon> imagesHolder = new ArrayList<ImageIcon>(){{
add(imgOne);
add(imgTwo);
}};
public ImageIcon getImageIcon(int index){
return imagesHolder.get(index);
}
}
class test{
SomeClass imageHolder = new SomeClass();
JLabel label = new JLabel(imageHolder.getImageIcon(0));
JFrame f = new JFrame();
f.getContentPane().add(label);
}
在此,我们有一个类(someclass),其对象(我们只需要其中一个)在实际之前将数组列表中的每个图像存储到处理最多的状态(imageIcon 或您正在使用的任何东西都可以在这里使用)把它放在 JFrame 上可以创建一个对象来获取所有已经渲染的图像。
这意味着此时您所要做的就是将图像添加到 JFrame。您不必一遍又一遍地对每个图像进行大量预处理,因为它已经准备好在 JFrame 上进行。
虽然这对渲染没有多大帮助(因为其中大部分是图像处理),但它确实对内存有很大帮助,因为您只需为每个已处理的图像创建 1 个并重新绘制相同的已处理图像。
希望这种一次性处理所有图像的想法可以帮助您找到一种只需要渲染一次图像的方法。