我想编制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;
}
}
}
答案 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对象通常也是一种好习惯(如果你在紧密的循环中创建它们可能有帮助。)
以下是一些提供一些提示的其他问题:
答案 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可能对你有所帮助。
编辑:绘制大图像以某种方式(???)慢,然后绘制小图像以填充相同的区域。