我正在尝试创建一个快速图像生成器,它可以进行大量的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来保存,因为我的图像真的很大,我会遇到内存不足的问题......
答案 0 :(得分:4)
从我的调查和阅读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。您可以在2D trail of the Java Tutorial上阅读。
答案 1 :(得分:1)
尝试将此添加到命令行:
-Dsun.java2d.accthreshold=0
修改强>
在你说上面没有用之后,我对此做了一些阅读。尝试将OpenGL参数上的 True 更改为全小写。
-Dsun.java2d.opengl=true
答案 2 :(得分:0)
以下是它的工作原理:
您创建图像的方式是正确的。但Java并没有立即加速图像。渲染调用的阈值需要指向您的图像,之后图像将被加速。但如果你设置以下内容,
-Dsun.java2d.accthreshold=0
您的图片应该在您创建的那一刻加速。
您可能仍然需要以某种方式使用图像才能加速。例如,我有以下代码片段用于将加载的图像(通过ImageIO加载将为您提供无法加速的图像)复制到我的新BufferedImage中。
Graphics2D g2d = bufferedImage.createGraphics();
g2d.drawImage(image,0,0,null);
g2d.dispose();
在此代码段之前,BufferedImage不会加速,之后就会加速。
但要注意,如果您直接操作图像数据(即不通过Java-2d),您的图像将不再缓存在VRAM中,您必须将其复制到新的托管图像才能重新获得加速。 / p>