Java硬件加速 - 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()

在教程中,我一直在阅读一些有关正确设置渲染窗口的一般概念(tutorial),该概念使用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加速时,它的副本作为VolatileImage存储在V-Ram中。
BufferedImage的好处是,只要您不弄乱它包含的像素,只需像调用graphics.drawImage()一样将它们复制即可,然后在未指定一定数量的副本后BufferedImage将被加速,它将为您管理VolatileImage
BufferedImage的缺点是,如果您正在进行图像编辑,更改BufferedImage中的像素,在某些情况下,它将放弃尝试使其加速的操作,此时,如果您正在寻找用于编辑的高性能渲染,则需要考虑管理您自己的VolatileImage。我不知道哪些操作会使BufferedImage放弃尝试为您加速渲染。

3)
使用createCompatibleImage()/createCompatibleVolatileImage()的优势
ImageIO.read()不对默认支持的图像数据模型进行任何转换。
因此,如果导入PNG,它将以PNG阅读器构建的格式表示它。这意味着每次使用GraphicsDevice渲染图像时,必须首先将其转换为兼容的图像数据模型。

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 Swing SearchBox模型 - java

我需要使用Java Swing的搜索框,如果单击任何建议,当输入字母时它将显示来自数据库的建议,它将执行一些操作。如果有可能在Java swing中,请提供源代码提前致谢 java大神给出的解决方案 您可以使用DefaultComboBoxModel,输出将是这样。Try this在此代码中,您将找到countries数组,因此您需要从数据库中获取此数组。

Java swing-事件触发后,我可以在选项卡上更改名称吗? - java

一,代码:tab_textArea_file.addTab(docLabel, null, scrollPane_textArea, null); 因此,情况是我有一个可供用户选择的文件列表。用户单击文件时,将读取文件的内容并将其加载到textArea中。 “ docLabel”(在上面的代码中)是应该更改为所选文件名的字符串,但并非如此。是否可以通过上面的…

Swing-典型桌面应用程序中的并发 - java

这可能是一个广泛的问题,但我想知道单用户桌面应用程序通常在何处使用并发。您如何发现理想情况下(在设计阶段)并发问题?附注:从操作系统理论上来说,并发问题通常发生在无法共享资源(例如打印机)的情况下。不过,我仍然对在编程级别上可能发生的情况感到迷惑。 java大神给出的解决方案 Event Dispatch thread与其他逻辑之间的Swing中可能存在线程…

Java:线程池如何将线程映射到可运行对象 - java

试图绕过Java并发问题,并且很难理解线程池,线程以及它们正在执行的可运行“任务”之间的关系。如果我创建一个有10个线程的线程池,那么我是否必须将相同的任务传递给池中的每个线程,或者池化的线程实际上只是与任务无关的“工人无人机”可用于执行任何任务?无论哪种方式,Executor / ExecutorService如何将正确的任务分配给正确的线程? 参考方案 …

JAVA:字节码和二进制有什么区别? - java

java字节代码(已编译的语言,也称为目标代码)与机器代码(当前计算机的本机代码)之间有什么区别?我读过一些书,他们将字节码称为二进制指令,但我不知道为什么。 参考方案 字节码是独立于平台的,在Windows中运行的编译器编译的字节码仍将在linux / unix / mac中运行。机器代码是特定于平台的,如果在Windows x86中编译,则它将仅在Win…