BufferedImage会降低性能

时间:2020-07-07 13:05:31

标签: java bufferedimage

我正在开发游戏,没什么大不了的,只是为了好玩。
我写了一个“ ImageBuilder”类来帮助创建一些图像。
一切正常,除了一件事。
我这样初始化变量:

// other stuff
m_tile = new ImageBuilder(TILE_SIZE, TILE_SIZE, BufferedImage.TYPE_INT_RGB).paint(0xff069dee).paintBorder(0xff4c4a4a, 1).build();
// other stuff

然后,在渲染方法中,我有:

for (int x = 0; x < 16; x++) {
    for (int y = 0; y < 16; y++) {
         g.drawImage(m_tile, x * (TILE_SIZE + m_padding.x) + m_margin.x, y * (TILE_SIZE + m_padding.y) + m_margin.y, null);
    }
}

注意:m_padding和m_margin只是两个Vector2i

这会在屏幕上使用该图像绘制一个简单的16x16表格,但是游戏几乎停滞了,我无法获得超过10 FPS的数据。

我试图通过不这样做创建图像(TILE_SIZE = 32):

m_tile = new BufferedImage(TILE_SIZE, TILE_SIZE, BufferedImage.TYPE_INT_RGB);

for (int x = 0; x < TILE_SIZE; x++) {
    for (int y = 0; y < TILE_SIZE; y++) {
        if (x == 0 || y == 0 || x + 1 == TILE_SIZE || y + 1 == TILE_SIZE)
             m_tile.setRGB(x, y, 0x4c4a4a);
        else
             m_tile.setRGB(x, y, 0x069dee);
    }
}

这次,我得到60 FPS。 我不知道有什么区别,我曾经使用'ImageBuilder'创建图像,一切都很好,但是这次不行。

ImageBuilder类:

    // Constructor
    public ImageBuilder(int width, int height, int imageType) {
        this.m_width = width;
        this.m_height = height;
        this.m_image = new BufferedImage(m_width, m_height, imageType);
        this.m_pixels = ((DataBufferInt) m_image.getRaster().getDataBuffer()).getData();
        this.m_image_type = imageType;
    }

    public ImageBuilder paint(int color) {
        for (int i = 0; i < m_pixels.length; i++) m_pixels[i] = color;
        return this;
    }

    public ImageBuilder paintBorder(int color, int stroke) {
        for (int x = 0; x < m_width; x++) {
            for (int y = 0; y < m_height; y++) {
                if (x < stroke || y < stroke || x + stroke >= m_width || y + stroke >= m_height) {
                    m_pixels[x + y * m_width] = color;
                }
            }
        }
        return this;
    }

    public BufferedImage build() {
        return m_image;
    }

还有其他方法,但是我不叫它们,所以我认为没有必要写它们

我在做什么错了?

1 个答案:

答案 0 :(得分:0)

我的猜测是问题在于您ImageBuilder访问数据缓冲区的后备数据数组:

this.m_pixels = ((DataBufferInt) m_image.getRaster().getDataBuffer()).getData();

这样做,可能(会)破坏此图像被硬件加速的机会。 getData() API doc记录了这种行为:

请注意,调用此方法可能导致此DataBuffer对象与某些实现所使用的性能优化(例如,将关联的图像缓存在视频内存中)不兼容。

通过在帐单中使用临时图像,然后从build()方法返回尚未被篡改的临时图像的副本,您可能很容易解决此问题。

为获得最佳性能,始终使用兼容的图像(如createCompatibleImage(),在注释中由@VGR提及)也是一个好主意。这应该确保您拥有最快的硬件故障。