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

Pau*_*pes 10 java graphics performance image java-2d

我正在尝试创建一个快速图像生成器,它可以进行大量的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();
Run Code Online (Sandbox Code Playgroud)

但是,如果我这样做:

System.out.println(bImage.getCapabilities(gc).isAccelerated());
Run Code Online (Sandbox Code Playgroud)

输出始终为false,即使我使用-Dsun.java2d.opengl = True启动JVM也会打印该行:

OpenGL pipeline enabled for default config on screen 0
Run Code Online (Sandbox Code Playgroud)

我正在做一个BufferedImage,因为最后我想用ImageIO.write(bImage,"PNG",file)将它保存到PNG文件中;

我可以创建一个VolatileImage,它会说它是加速的但ImageIO在尝试保存时并不喜欢它,并说该图像无法转换为RenderedImage.有关如何获得可存储到磁盘的加速图像的任何想法?此外,我不想创建一个VolatileImage和副本到BufferedImage保存,因为我的图像真的很大,我会遇到内存不足的问题......

Pau*_*pes 6

根据我的调查和阅读 Sun/Oracle 2D 教程,这是我发现的:

要创建加速图像,您可以使用易失性图像,它是作为 pbuffer 创建的。有优点也有缺点,VolatileImages 很快,直到您尝试获取光栅像素数据。在那一刻,它们变成了一个普通的 bufferedImage。此外,它们是不稳定的,不能保证它在渲染结束时可用。为此,您执行:

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

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

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

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

这将创建一个未加速的 BufferedImage,但您应该通过在 setAccelerationPriority 中传递 1 来向 JVM 提供提示。您可以在 Java 教程2D 跟踪中阅读此内容。