在Java中加载图像后,FPS下降

时间:2018-12-17 17:56:31

标签: java image optimization frame-rate

因此,我最近问了一个有关如何在Java(preloading images in Java)中预加载图像的问题,效果很好!直到我去玩游戏。帧速率急剧下降。我不知道那是什么,但是基本上,我已经将整个精灵图加载到了一个数组中。每个图像对应一个三度旋转。因此,将5度变成3度图像,将6保留为6,依此类推(我尝试过Math.round,它实际上使5度和4度图像变成了6度图像,这是更可取的,但是速度较慢)
我正在寻找一些优化代码的方法。这是我的角度计算:

private float getAngle(double x, double y) {
    float angle = (float) Math.toDegrees(Math.atan2(y - this.getCenterY(), x - this.getCenterX()));
    if(angle < 0){
        angle += 360;
    }
    return angle;
}

输入到方法中的x和y值是执行此计算的塔所针对的敌人的中心x和y值。然后在draw方法中执行以下代码:

if(airID==Value.towerCannon && (airRow>0 && airRow<5) && angle>=0) {
    if(angle==Canvas.rotatedAirMap.length) angle = 0;
        g.drawImage(Canvas.rotatedAirMap[angle][level-1], x, y, width, height, null); 
    } else {
        g.drawImage(Canvas.airMap[airRow][airID], x, y, width, height, null); 
    }
}

这将绘制适当的,以指定角度旋转的预加载图像(当塔射击时,将角度计算结果除以三,然后将其转换为整数,就可以计算出“角度”-或图像标识符-我也可以舍入该值)
关于如何优化此设置的任何建议,这样我就不会出现这么大的帧丢失?我认为丢帧是由于VM堆大小太小所致,但是我增加了它,但仍然没有发生任何重大变化。任何帮助将不胜感激。
谢谢!

@VGR这是我对您的回复所做的:

public void paintComponent(Graphics g) {
    if(isFirst) { //Define stuff when isFirst is true
        define(); //Sets up the image arrays

        GraphicsConfiguration config = getGraphicsConfiguration();
        if(config == null) {
            GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();
            config = env.getDefaultScreenDevice().getDefaultConfiguration();
        }

        BufferedImage compatibleImage = config.createCompatibleImage(image.getWidth(), image.getHeight(), image.getTransparency());

        g = compatibleImage.createGraphics();

        isFirst = false;
    }
}

这稍微快一些了,但我不得不做一些变通方法。 repaint()在游戏循环中被调用(此类实现可运行),所以repaint方法创建的图形组件(无论如何起作用)是我在整个游戏中使用的图形。这是正确的方法吗?

1 个答案:

答案 0 :(得分:1)

将图像从其固有的颜色模型转换为当前视频模式的颜色模型会降低渲染速度。为避免这种情况,您可以确保每个图像与窗口所在的屏幕兼容

BufferedImage image = ImageIO.read(/* ... */);

GraphicsConfiguration config = getGraphicsConfiguration();
if (config == null) {
    GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment;
    config = env.getDefaultScreenDevice().getDefaultConfiguration();
}

BufferedImage compatibleImage = config.createCompatibleImage(
    image.getWidth(), image.getHeight(), image.getTransparency());

Graphics2D g = compatibleImage.createGraphics();
g.drawImage(image, 0, 0, null);
g.dispose();

image = compatibleImage;

如果图像具有与当前视频模式相同的颜色模型,则在绘制图像时不需要翻译。甚至有可能完全由GPU绘制此类图像。