首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java硬件加速

Java硬件加速
EN

Stack Overflow用户
提问于 2011-01-07 23:48:28
回答 1查看 26K关注 0票数 20

我已经花了一些时间研究Java的硬件加速功能,我仍然有点困惑,因为我在网上找到的网站没有一个直接和明确地回答了我的一些问题。下面是我对Java硬件加速的一些问题:

1)在Eclipse 3.6.0版本中,对于Mac OS X的最新Java更新(我认为是1.6u10),硬件加速是默认启用的吗?我在某处读到过

代码语言:javascript
复制
someCanvas.getGraphicsConfiguration().getBufferCapabilities().isPageFlipping()

应该给出是否启用了硬件加速的指示,当在我的主Canvas实例上运行以绘制时,我的程序将报告true。如果现在或默认情况下没有启用硬件加速,我必须执行什么操作才能启用它?

2)我已经看过几篇关于BufferedImage和VolatileImage区别的文章,主要是说VolatileImage是硬件加速的镜像,存储在VRAM中,用于快速复制操作。然而,我也发现了一些实例,据说BufferedImage也是硬件加速的。BufferedImage硬件在我的环境中是否也得到了加速?如果这两种类型都是硬件加速的,使用VolatileImage的优势是什么?我的主要假设是,在两者都有加速的情况下拥有VolatileImage的优势是,VolatileImage能够检测到它的VRAM何时被转储。但是,如果BufferedImage现在也支持加速,它不是也有内置的相同类型的检测,只是对用户隐藏,以防内存被转储?

3)使用

代码语言:javascript
复制
someGraphicsConfiguration.getCompatibleImage/getCompatibleVolatileImage()

而不是

代码语言:javascript
复制
ImageIO.read()

在一个教程中,我已经阅读了一些关于正确设置渲染窗口(tutorial)的一般概念,它使用getCompatibleImage方法,我相信该方法返回一个BufferedImage,以获得用于快速绘制的“硬件加速”图像,这与问题2有关是否它是硬件加速。

4)这是较少的硬件加速,但这是我一直好奇的事情:我需要按顺序绘制哪些图形吗?我知道,当通过C/C++使用OpenGL时,最好确保在所有需要一次绘制的位置绘制相同的图形,以减少当前纹理需要切换的次数。根据我所读到的,Java似乎会为我解决这一问题,并确保以最优的方式绘制,但同样,从来没有人清楚地说过这样的事情。

5)哪些AWT/Swing类支持硬件加速,应该使用哪些?我目前正在使用一个扩展JFrame的类来创建一个窗口,并在其中添加一个画布来创建一个BufferStrategy。这是一种很好的实践吗?或者有没有其他类型的方法来实现它?

非常感谢您的时间,我希望我为您提供了清晰的问题和足够的信息来回答我的几个问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-12-12 12:30:21

1)到目前为止,硬件加速在默认情况下从未开启,据我所知,它还没有改变。要激活渲染加速,请在程序启动时将此参数(-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呈现它时,都必须首先将其转换为兼容的图像数据模型。

代码语言:javascript
复制
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,以便在渲染它时不需要进行转换。最有利的时候是您将非常频繁地渲染图像。

4)你不需要努力批量渲染你的图像,因为在大多数情况下,Java会尝试为你做这件事。您没有理由不能尝试这样做,但一般来说,在尝试执行这样的性能优化之前,最好先分析您的应用程序,并确认图像呈现代码中存在瓶颈。主要的缺点是,它在每个JVM中的实现可能略有不同,因此增强功能可能毫无价值。

5)据我所知,在手动执行双缓冲和主动渲染应用程序时,您概述的设计是较好的策略之一。http://docs.oracle.com/javase/7/docs/api/java/awt/image/BufferStrategy.html在此链接中,您将找到BufferStrategy的描述。在描述中,它显示了一个代码片段,这是使用BufferStrategy对象进行活动呈现的推荐方法。我在我的活动渲染代码中使用了这种特殊的技术。唯一的主要区别是在我的代码中。和您一样,我在Canvas的一个实例上创建了BufferStrategy,并将其放在JFrame上。

票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4627320

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档