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

我正在尝试创建一个快速图像生成器,它可以进行大量的2D变换和形状渲染,因此我尝试使用BufferedImage,然后获取Graphics2D对象来执行我的所有绘图。 我现在主要关注的是make非常快,所以我正在创建一个像这样的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来保存,因为我的图像真的很大,我会遇到内存不足的问题……

从我的调查和阅读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轨迹上阅读。

尝试将此添加到您的命令行:

 -Dsun.java2d.accthreshold=0 

编辑

在你说上面没有用之后我对此做了一些阅读。 尝试将OpenGL参数上的True更改为全小写。

 -Dsun.java2d.opengl=true 

下面是它的工作原理:

您创建图像的方式是正确的。 但Java并没有立即加速图像。 渲染调用的阈值需要指向您的图像,之后图像将被加速。 但如果你设置以下内容,

 -Dsun.java2d.accthreshold=0 

您的图像应该在您创建它的那一刻加速。

您可能仍然需要以某种方式使用图像才能加速。 例如,我有以下代码片段用于将加载的图像(通过ImageIO加载将为您提供无法加速的图像)复制到我的新BufferedImage中。

 Graphics2D g2d = bufferedImage.createGraphics(); g2d.drawImage(image,0,0,null); g2d.dispose(); 

在此代码段之前,BufferedImage不会加速,之后就会加速。

但请注意,如果您直接操作图像数据(即不通过Java-2d),您的图像将不再缓存在VRAM中,您必须将其复制到新的托管图像才能重新获得加速。