一尘不染

如何使用Java2D创建硬件加速的映像?

java

我试图创建一个执行大量2D转换和形状渲染的快速图像生成器,所以我试图使用BufferedImage然后获取Graphics2D对象来执行所有绘图。我现在主要关心的是制作速度非常快,因此我正在创建一个BufferedImage,如下所示:

GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsConfiguration gc = ge.getDefaultScreenDevice().getDefaultConfiguration();
BufferedImage bImage = gc.createCompatibleImage(width, height, Transparency.TRANSLUCENT);
Graphics2D graphics = bImage.createGraphics();

但是,如果我这样做:

System.out.println(bImage.getCapabilities(gc).isAccelerated());

输出始终为 false ,即使我使用-Dsun.java2d.opengl = True启动JVM也会显示以下行:

OpenGL pipeline enabled for default config on screen 0

我正在执行BufferedImage,因为最后我想使用ImageIO.write(bImage,“ PNG”,file);将其保存到PNG文件。

我可以创建一个VolatileImage,它会说它被加速了,但是ImageIO在尝试保存时不喜欢它,并说该图像不能转换为RenderedImage。关于如何获取可以存储到磁盘的加速映像的任何想法?另外我也不想创建VolatileImage并将其复制到BufferedImage进行保存,因为我的图像很大,会遇到内存不足的问题…


阅读 290

收藏
2020-12-03

共1个答案

一尘不染

通过我的调查并阅读了Sun / Oracle 2D教程,我发现了以下内容:

要创建加速图像,可以使用易失性图像(将其创建为pbuffer)。有优点也有缺点,在您尝试获取栅格像素数据之前,VolatileImages很快。在那一刻,它们成为普通的bufferedImage。而且它们是易变的,并且不能保证在渲染结束时将可用。为此,您执行:

GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsConfiguration gc = ge.getDefaultScreenDevice().getDefaultConfiguration();
VolatileImage vImage = gc.createCompatibleVolatileImage(width, height, Transparency.TRANSLUCENT);

这将为您提供加速的图像,但是无法使用ImageIO直接将其写入以表示PNG文件。

为了使用普通的BufferedImage,您需要执行以下操作:

GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsConfiguration gc = ge.getDefaultScreenDevice().getDefaultConfiguration();
BufferedImage img = gc.createCompatibleImage(width, height, Transparency.TRANSLUCENT);
img.setAccelerationPriority(1);

这将创建一个BufferedImage,它不会被加速,但是您可以通过在setAccelerationPriority中传递1来向JVM提供提示。您可以在Java
Tutorial
2D路径上阅读此内容。

2020-12-03