java - 图像大小造成计时器问题

标签 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 图像相同,非常慢且笨重。

最佳答案

加载图像非常耗时。例如,您最好预先加载和缓存图像并简单地重新使用它们。

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

作为一般经验法则,不要在绘制方法中执行任何可能需要时间才能执行的操作,绘制应该尽可能快地运行

关于java - 图像大小造成计时器问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47257532/

相关文章:

java - JTabbedPane FlowLayout 抛出 ArrayIndexOutOfBoundsException

java - 简单的 Android 计时器游戏

java - 有人可以解释为什么我不能向这个 ScrollView 添加额外的按钮吗?

java - 将二维整数数组的行从小到大排序

java - jFreeChart重新加载数据集问题

java - 拖动未修饰的 jDialog

android - Android 服务内的计时器

java动画,使对象每 'x'秒改变颜色

java - 使用@JsonTypeInfo和@JsonSubTypes,反序列化没有基类和类型信息的具体子类的对象

java - 如何使用谷歌金融货币转换器API?