图像大小创建计时器问题

时间:2017-11-13 05:21:23

标签: java swing timer background

我的游戏的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图像相同,非常慢且笨重。

1 个答案:

答案 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");
    }

作为一般的经验法则,不要在油漆方法中做任何可能需要时间执行的事情,油漆应尽可能快地运行