当前位置: 首页 > 面试题库 >

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

姬飞昂
2023-03-14
问题内容

我试图创建一个执行大量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进行保存,因为我的图像很大,会遇到内存不足的问题…


问题答案:

通过我的调查并阅读了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路径上阅读此内容。



 类似资料:
  • 我正在尝试在运行时使用Java2D和某种像样的抗锯齿插值(如双线性)来扩展backbuffer。我的想法是将场景渲染到此图像,然后在全屏模式下放大图像,以匹配用户具有的任何分辨率。 请注意,全屏模式很重要。这在窗口模式下不会发生。 有没有一种使用硬件扩展的快速方法?Javadocs建议它存在(-Dsun.java2d.ddscale=true),但它对我没有影响。 代码如下: 结果是: 最近邻(约

  • 问题内容: 我一直在花一些时间研究Java的硬件加速功能,但我仍然有些困惑,因为我在网上直接找到的任何站点都没有明确回答我所遇到的一些问题。因此,这是我对Java硬件加速的疑问: 1)在Eclipse版本3.6.0中,具有Mac OS X的最新Java更新(我认为是1.6u10),默认情况下是否启用硬件加速?我在某处读过 应该指示是否启用了硬件加速,并且当在我的主Canvas实例上运行以进行绘制时

  • 这里所说的GPU硬件加速是指应用GPU的图形性能对chromium中的一些图形操作交给GPU来完成,因为GPU是专门为处理图形而设计,所以它在速度和能耗上更有效率。但是,使用GPU加速有些额外开销,并且某些图形操作CPU完成的会更快,因而不是所有的操作都合适交给GPU来做。 Chromium中,GPU加速可以不仅应用于3D,而且也可以应用于2D。这里,GPU加速通常包括以下几个部分:Canvas2

  • 这简直快把我逼疯了,我找不到任何帮助。对于模拟器,我还是个新手,对于Android Studio更是如此。我的问题是:我安装了Android Studio。下载了SDK更新,包括HAXM一个,并建立了我自己的AVD。在尝试启动我的AVD或者甚至是已经存在的starter AVD时,我得到一个错误,说明“emulator:error:x86仿真当前需要硬件加速!” 有没有人对一个完整的Android

  • 在介绍硬件加速合成(hardware accelerated compositing)之前,让我们先大概了解一下基本的做法是如何渲染生成网页内容的。 一个网页通常可以包含很多层,这个我们在WebKit渲染基础中讲过,例如有透明效果的节点, Canvas节点等,这些节点都可以是页面中的一层,这些层的内容最后组成一个可视化的网页内容,如下图所示。 在没有硬件加速的情况下,浏览器通常是依赖于CPU来渲染

  • 现在,我们已经掌握了动画的基础知识,让我们绘制一个在重力作用下向下加速运动的盒子,来尝试稍微复杂一点的动画。 图5-3 创建加速运动 操作步骤 按照以下步骤,在画布的顶部绘制一个盒子,该盒子在重力作用下向下加速运动: 1. 链接到Animation类: <head> <script src="animation.js"> </script> 2. 实例化一个Animation对象,并获取画布上下