java2D中如何使用compatibleImage来更快的绘制图片?
How to use compatibleImage to make drawing images faster in java2D?
我正在用 Java2D 编写游戏,它在我的计算机和我测试过的另一台计算机上运行流畅。然而在另一台具有良好规格和相同 java 设置的计算机上,它非常慢。我很确定我将它缩小到 g.drawImage() 命令。在做了一些研究之后,我发现有人做了一个方法来编译一些他发现可以提高速度的东西,方法是:
public BufferedImage toCompatibleImage(BufferedImage image) {
// obtain the current system graphical settings
GraphicsConfiguration gfx_config = GraphicsEnvironment
.getLocalGraphicsEnvironment().getDefaultScreenDevice()
.getDefaultConfiguration();
//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
BufferedImage new_image = gfx_config.createCompatibleImage(
image.getWidth(), image.getHeight(), Transparency.TRANSLUCENT);
// get the graphics context of the new image to draw the old image on
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
// System.out.println(image.getColorModel());
return new_image;
}
我很困惑你是如何使用这个方法的。我已经搞定了:
1) 仅在使用 Image.IO.
从 png 创建图像时调用它
BufferedImage img = toCompatibleImage(theLoadedImage);
然后在 paintComponent(Graphics g) 方法中简单调用
Graphics2D g2 = (Graphics2D) g;
g.drawImage(img, x, y, null);
2) 像这样在每次重绘中调用它:
Graphics2D g2 = (Graphics2D) g;
g.drawImage(toCompatibleImage(theLoadedImage), x, y, null);
除了 FPS 的名义变化外,这两种方法似乎都没有做任何事情,第一种方法稍快一些。我不知道我是否在使用这个权利,所以帮助和基本解释真的很有帮助。
你应该用第一种方法,转换一次就够了。
兼容图像以与您的视频卡相同的格式在内部存储像素,因此不必在每次绘制时都进行转换。
我正在用 Java2D 编写游戏,它在我的计算机和我测试过的另一台计算机上运行流畅。然而在另一台具有良好规格和相同 java 设置的计算机上,它非常慢。我很确定我将它缩小到 g.drawImage() 命令。在做了一些研究之后,我发现有人做了一个方法来编译一些他发现可以提高速度的东西,方法是:
public BufferedImage toCompatibleImage(BufferedImage image) {
// obtain the current system graphical settings
GraphicsConfiguration gfx_config = GraphicsEnvironment
.getLocalGraphicsEnvironment().getDefaultScreenDevice()
.getDefaultConfiguration();
//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
BufferedImage new_image = gfx_config.createCompatibleImage(
image.getWidth(), image.getHeight(), Transparency.TRANSLUCENT);
// get the graphics context of the new image to draw the old image on
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
// System.out.println(image.getColorModel());
return new_image;
}
我很困惑你是如何使用这个方法的。我已经搞定了: 1) 仅在使用 Image.IO.
从 png 创建图像时调用它BufferedImage img = toCompatibleImage(theLoadedImage);
然后在 paintComponent(Graphics g) 方法中简单调用
Graphics2D g2 = (Graphics2D) g;
g.drawImage(img, x, y, null);
2) 像这样在每次重绘中调用它:
Graphics2D g2 = (Graphics2D) g;
g.drawImage(toCompatibleImage(theLoadedImage), x, y, null);
除了 FPS 的名义变化外,这两种方法似乎都没有做任何事情,第一种方法稍快一些。我不知道我是否在使用这个权利,所以帮助和基本解释真的很有帮助。
你应该用第一种方法,转换一次就够了。
兼容图像以与您的视频卡相同的格式在内部存储像素,因此不必在每次绘制时都进行转换。