java.awt.Graphics - > graphics.drawImage太慢了,有什么不对?

时间:2015-07-09 18:43:51

标签: java opengl graphics 2d game-engine

我想编制2D游戏引擎。我有的问题(我不会使用opengl和类似的东西,所以我使用cpu渲染)是,我只通过graphics.drawImage()得到7fps;您有什么建议可以加快速度或任何替代方案吗?

image = new BufferedImage(gc.getWidth(), gc.getHeight(), BufferedImage.TYPE_4BYTE_ABGR);
canvas.createBufferStrategy(1);
bs = canvas.getBufferStrategy();
g = bs.getDrawGraphics();
g.drawImage(image, 0, 0, canvas.getWidth(), canvas.getHeight(), null);

我的渲染器应该简单地为框架(宽度320高度240像素)青色着色,并且他这样做,但最多只有8fps。渲染器:

private int width, height;
private byte[] pixels;

public Renderer(GameContainer gc){
    width = gc.getWidth();
    height = gc.getHeight();
    pixels = ((DataBufferByte)gc.getWindow().getImage().getRaster().getDataBuffer()).getData();
}

public void clear(){
    for(int x = 0; x < width; x++){
        for(int y = 0; y < height; y++){
            int index = (x + y * width) * 4;
            pixels[index] = (byte)255;
            pixels[index+1] = (byte)255;
            pixels[index+2] = (byte)255;
            pixels[index+3] = 0;
        }
    }
}

2 个答案:

答案 0 :(得分:1)

我不确定如何优化您当前的示例(但使用clear中的数据缓冲区确实只是使用Graphics.fillRect来创建加速?),但我可以给你一些一般的Java2D技巧。

首先,为计算机使用最兼容的图像类型非常重要。 以下是查找兼容图像的方法:

private static final GraphicsConfiguration GFX_CONFIG = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration();

public static BufferedImage toCompatibleImage(final BufferedImage image) {
    /*
     * if image is already compatible and optimized for current system settings, simply return it
     */
    if (image.getColorModel().equals(GFX_CONFIG.getColorModel())) {
        return image;
    }

    // image is not optimized, so create a new image that is
    final BufferedImage new_image = GFX_CONFIG.createCompatibleImage(image.getWidth(), image.getHeight(), image.getTransparency());

    // get the graphics context of the new image to draw the old image on
    final Graphics2D g2d = (Graphics2D) new_image.getGraphics();

    // actually draw the image and dispose of context no longer needed
    g2d.drawImage(image, 0, 0, null);
    g2d.dispose();

    // return the new optimized image
    return new_image;
}

在你完成它们时,处理Graphics对象通常也是一种好习惯(如果你在紧密的循环中创建它们可能有帮助。)

以下是一些提供一些提示的其他问题:

Java2D Performance Issues

Java 2D Drawing Optimal Performance

答案 1 :(得分:1)

我知道我对这个派对来说有点晚了,但是对于未来有这个想法的人来说:

不要尝试将图像作为数组处理!

如果要使用画布为整个屏幕或图像着色,请按上述方法获取Graphics对象,并使用矩形填充屏幕,如下所示:

g.setColor(new Color(REDVALUE,GREENVALUE,BLUEVALUE);
g.fillRect(0,0,canvas.getWidth(),canvas.getHeight());

如果您当前的类扩展了Canvas,那么您显然可以使用:

getWidth() and getHeight()

而不是:

canvas.getWidth() and canvas.getHeight()

如果您在理解Graphics对象的工作方式时遇到问题,可能需要先查看this

如果你想做更复杂的图像处理this可能对你有所帮助。

编辑:绘制大图像以某种方式(???)慢,然后绘制小图像以填充相同的区域。