我的游戏的Swing.Timer取决于我为背景导入的图像的大小。当我导入大小为1920 x 1080的图像时,计时器非常慢,几乎没有更新,但它是完美的质量。当图像尺寸设置为50 x 50时,计时器工作正常但图像本身却非常扭曲。有没有办法在java中解决这个问题?代码如下所示:
加载图片类:
public class BufferedImageLoader {
Image image;
public Image loadImage(String path) {
try {
image = ImageIO.read(this.getClass().getResource(path));
} catch (IOException e) {
e.printStackTrace();
}
return image;
}
}
获取加载图片
public class ImageLoader {
BufferedImageLoader bif = new BufferedImageLoader();
public Image spaceship() {
return bif.loadImage("/objects/spaceship.png");
}
public Image background() {
return bif.loadImage("/objects/spaceBackground.png");
}
public Image asteroid1() {
return bif.loadImage("/objects/v.png");
}
public Image background2() {
return bif.loadImage("/Other/background.png");
}
}
我遇到问题的代码:
public void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
if(menu)
ms.render(g2);
if(game) {
g2.drawImage(il.background2(), 0, 0, 1000, 750, this);
g2.drawImage(il.spaceship(), dx, 600, 100, 100, this);
}
if(settings)
ss.render(g2);
if(credits)
cs.render(g2);
}
il是ImageLoader对象 我发现问题发生的时候,我真的不明白为什么会发生这种情况......
编辑:对于任何想知道的人,当我将背景大小设置为1000,750(我将其绘制为这个大小)时,计时器与1920 x 1080图像相同,非常慢且笨重。
答案 0 :(得分:1)
加载图片非常耗时。例如,您可以更好地预加载和缓存图像,并简单地重复使用它们。
public enum BufferedImageLoader {
INSTANCE;
private Map<String, BufferedImage> cache = new HashMap<>();
public Image loadImage(String path) {
BufferedImage image = cache.get(path);
if (image == null) {
try {
image = ImageIO.read(this.getClass().getResource(path));
cache.put(path, image);
} catch (IOException e) {
e.printStackTrace();
}
}
return image;
}
}
然后你可以做......
public class ImageLoader {
public Image spaceship() {
return BufferedImageLoader.INSTANCE.loadImage("/objects/spaceship.png");
}
作为一般的经验法则,不要在油漆方法中做任何可能需要时间执行的事情,油漆应尽可能快地运行