Java硬件加速

我一直在花一些时间研究Java的硬件加速功能,但我仍然有些困惑,因为我在网上直接找到的任何站点都没有明确回答我所遇到的一些问题。因此,这是我对Java硬件加速的疑问:

1)在Eclipse版本3.6.0中,具有Mac OS X的最新Java更新(我认为是1.6u10),默认情况下是否启用硬件加速?我在某处读过

someCanvas.getGraphicsConfiguration().getBufferCapabilities().isPageFlipping()

应该指示是否启用了硬件加速,并且当在我的主Canvas实例上运行以进行绘制时,我的程序会报告true。如果现在或默认情况下未启用我的硬件加速功能,我该怎么做才能启用它?

2)我在这里和那里看到了几篇关于BufferedImage和VolatileImage之间的区别的文章,主要是说VolatileImage是硬件加速的图像,并存储在VRAM中以进行快速的复制操作。但是,我还发现了一些实例,据说BufferedImage也可以通过硬件加速。在我的环境中,BufferedImage硬件是否也得到了加速?如果两种类型都是硬件加速的,那么使用VolatileImage有什么好处?我对在两个都有加速的情况下拥有VolatileImage的优势的主要假设是,VolatileImage能够检测何时已转储其VRAM。但是,如果BufferedImage现在也支持加速功能,那么在内存被转储的情况下,它是否也不会内置对用户隐藏的检测类型呢?

3)使用有什么好处

someGraphicsConfiguration.getCompatibleImage/getCompatibleVolatileImage()

相对于

ImageIO.read()

在本教程中,我一直在阅读有关正确设置渲染窗口的一些一般概念(本教程),它使用getCompatibleImage方法(我相信它会返回BufferedImage)来获取其“硬件加速”图像以进行快速绘制,这引起了疑问。

2关于是否硬件加速。

4)这不是硬件加速,但我一直对此感到好奇:是否需要订购绘制哪些图形?我知道,当通过C / C

++使用OpenGL时,最好确保在所有需要一次绘制的位置上绘制相同的图形,以减少需要切换当前纹理的次数。从我所阅读的内容来看,Java似乎会为我照顾这件事并确保以最佳方式绘制事物,但是同样,没有人清楚地说过这样的话。

5)哪些AWT /

Swing类支持硬件加速,应使用哪些?我目前正在使用扩展JFrame的类来创建窗口,并向其添加Canvas,从中创建BufferStrategy。这是一种好习惯吗,还是我应该采用其他方式?

非常感谢您抽出宝贵的时间,希望我提供了明确的问题和足够的信息,以帮助您回答我的几个问题。

回答:

1)到目前为止,默认情况下从未启用硬件加速,据我所知它尚未更改。要激活渲染加速,请在程序启动时将此arg(-Dsun.java2d.opengl =

true)传递给Java启动器,或者在使用任何渲染库之前进行设置。System.setProperty("sun.java2d.opengl",

"true");它是一个可选参数。

2)是BufferedImage封装了管理易失性存储器的一些细节,因为在BufferdImage加速时,将其副本存储为V-

Ram中的VolatileImage

BufferedImage只要您不弄乱它包含的像素,a的好处就是,只需像调用一样复制它们graphics.drawImage(),然后BufferedImage在达到一定的非指定数量的副本后,就会加速,它将VolatileImage为您管理。

a的缺点BufferedImage是,如果您要进行图像编辑,更改中的像素BufferedImage,在某些情况下,它将放弃尝试加速它的操作,这时,如果您要寻找用于编辑的高性能渲染,则需要考虑自行管理VolatileImage。我不知道哪些操作会让您BufferedImage放弃尝试加快渲染速度。

3)使用的优点createCompatibleImage()/createCompatibleVolatileImage()

ImageIO.read()不会对默认支持的图像数据模型进行任何转换。因此,如果导入PNG,它将以PNG阅读器构建的格式表示它。这意味着每次由a呈现时,GraphicsDevice都必须首先将其转换为兼容的Image

Data Model。

BufferedImage image = ImageIO.read ( url );

BufferedImage convertedImage = null;

GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment ();

GraphicsDevice gd = ge.getDefaultScreenDevice ();

GraphicsConfiguration gc = gd.getDefaultConfiguration ();

convertedImage = gc.createCompatibleImage (image.getWidth (),

image.getHeight (),

image.getTransparency () );

Graphics2D g2d = convertedImage.createGraphics ();

g2d.drawImage ( image, 0, 0, image.getWidth (), image.getHeight (), null );

g2d.dispose()

上面的过程会将使用image io api读取的图像转换为BufferedImage,该BufferedImage具有与默认屏幕设备兼容的Image

Data Model,因此在渲染时无需进行转换。最有利的情况是您将非常频繁地渲染图像。

4)您不需要花费精力来批量处理图像渲染,因为Java在大多数情况下都会尝试为您完成此操作。没有理由不能尝试执行此操作,但是总的来说,最好在尝试执行此类性能优化之前,对应用程序进行概要分析并确认图像渲染代码中存在瓶颈。主要缺点是,在每个JVM中实现的方式都略有不同,因此这些增强功能可能一文不值。

5)据我所知,您概述的设计是手动执行Double Buffering并主动呈现应用程序时较好的策略之一。

http://docs.oracle.com/javase/7/docs/api/java/awt/image/BufferStrategy.html

在此链接中,您将找到的描述BufferStrategy。在描述中,它显示了一个代码片段,这是对BufferStrategy对象进行主动渲染的推荐方法。我将这种特殊技术用于我的活动渲染代码。唯一的主要区别是在我的代码中。像您一样,我BufferStrategy在的实例上创建了,Canvas并将其放在上JFrame

以上是 Java硬件加速 的全部内容, 来源链接: utcz.com/qa/412561.html

回到顶部