我一直在花一些时间研究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阅读器html" target="_blank">构建的格式表示它。这意味着每次由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
。
这简直快把我逼疯了,我找不到任何帮助。对于模拟器,我还是个新手,对于Android Studio更是如此。我的问题是:我安装了Android Studio。下载了SDK更新,包括HAXM一个,并建立了我自己的AVD。在尝试启动我的AVD或者甚至是已经存在的starter AVD时,我得到一个错误,说明“emulator:error:x86仿真当前需要硬件加速!” 有没有人对一个完整的Android
在介绍硬件加速合成(hardware accelerated compositing)之前,让我们先大概了解一下基本的做法是如何渲染生成网页内容的。 一个网页通常可以包含很多层,这个我们在WebKit渲染基础中讲过,例如有透明效果的节点, Canvas节点等,这些节点都可以是页面中的一层,这些层的内容最后组成一个可视化的网页内容,如下图所示。 在没有硬件加速的情况下,浏览器通常是依赖于CPU来渲染
这里所说的GPU硬件加速是指应用GPU的图形性能对chromium中的一些图形操作交给GPU来完成,因为GPU是专门为处理图形而设计,所以它在速度和能耗上更有效率。但是,使用GPU加速有些额外开销,并且某些图形操作CPU完成的会更快,因而不是所有的操作都合适交给GPU来做。 Chromium中,GPU加速可以不仅应用于3D,而且也可以应用于2D。这里,GPU加速通常包括以下几个部分:Canvas2
在前面的章节中,笔者介绍了WebKit渲染引擎是如何有HTML网页构建DOM树、RenderObject树到RenderLayer树,以及它们之间的对应关系。这一渲染基础被软件渲染和硬件渲染共享,也就是说不管哪种类型的渲染机制,WebKit渲染引擎都会构建它们。不过对于软件渲染而言,到RenderLayer树就结束了,后面不会建立其它额外的树来对应于RenderLayer树。但是,对于硬件渲染来说
本文向大家介绍理解Android硬件加速原理(小白文),包括了理解Android硬件加速原理(小白文)的使用技巧和注意事项,需要的朋友参考一下 前言 硬件加速,直观上说就是依赖 GPU 实现图形绘制加速,同软硬件加速的区别主要是图形的绘制究竟是 GPU 来处理还是 CPU,如果是GPU,就认为是硬件加速绘制,反之,软件绘制。在 Android 中也是如此,不过相对于普通的软件绘制,硬件加速还做了其
什么是硬件位图(Hardware Bitmaps)? Bitmap.Config.HARDWARE 是一种 Android O 添加的新的位图格式。硬件位图仅在显存 (graphic memory) 里存储像素数据,并对图片仅在屏幕上绘制的场景做了优化。 我们为什么应该使用硬件位图? 因为硬件位图仅储存像素数据的一份副本。一般情况下,应用内存中有一份像素数据(即像素字节数组),而在显存中还有一份副