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。



