想到的一个想法是,如果您有一张您知道会经常使用的图像,您可以缓存它,这可能会有所帮助。
有一些方法可以使用 BufferedImage 和 ImageIcon 直接引用图像文件(我会直接链接,但我没有足够的点数:/)。
可能将缓存和直接引用与图像文件混合可以帮助加快该过程。除了缓存之外,您还可以找到一种方法将需要相同图像文件的所有对象组合在一起(这可以通过将使用此精灵的所有对象创建一个 arrayList 来完成。),因此一旦其中一个对象渲染文件时,他们都从缓存中渲染它。然后为下一个图像清除缓存。
此外,如果你有指向你的精灵的变量,那么你可以让对象加载变量,而不是它们都必须指向图像文件。
IE
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 个并重新绘制相同的处理过的图像。
希望这种一次性处理所有图像的想法可以帮助您找到一种只需要渲染一次图像的方法。