Android

时间:2017-09-09 13:04:04

标签: android drawing android-canvas android-view hardware-acceleration

我刚读过Hardware Acceleration并看了this video.现在我感到有些困惑。

硬件加速表示绘图操作由GPU执行,默认情况下在Android 3.0+上启用。 如果启用了硬件加速,为什么View的图层类型默认为LAYER_TYPE_NONE?我认为它应该是LAYER_TYPE_HARDWARE

硬件图层必须将View保留在屏幕外缓冲区中。

因此看起来常量View.LAYER_TYPE_NONEView.LAYER_TYPE_HARDWAREView.LAYER_TYPE_SOFTWARE与硬件加速无关。它们是关于将View保留在屏幕外缓冲区中,以避免每次View的透明度和其他一些属性发生变化时进行绘制。

2 个答案:

答案 0 :(得分:4)

View.LAYER_TYPE_HARDWARE表示视图将由硬件层支持,例如一个纹理,FBO ...因此很容易/几乎可以自由地应用颜色效果,半透明和其他GPU效果,而无需重绘视图。最好在视图具有此类效果时或在动画之前启用硬件层。硬件层需要大量的RAM,所以要小心。

此处的文档:LAYER_TYPE_HARDWARE及其引用:

  

表示视图具有硬件层。硬件层由硬件特定纹理(通常是OpenGL硬件上的帧缓冲对象或FBO)支持,并使视图使用Android的硬件渲染管道进行渲染,但前提是为视图层次结构打开了硬件加速。当关闭硬件加速时,硬件层的行为与软件层完全相同。

     

硬件图层可用于将特定颜色过滤器和/或混合模式和/或半透明度应用于视图及其所有子视图。

     

硬件层可用于将复杂视图树缓存到纹理中,并降低绘制操作的复杂性。例如,在使用转换动画复杂视图树时,可以使用硬件层仅渲染视图树一次。

     

在视图上应用旋转变换时,还可以使用硬件层来提高渲染质量。它还可用于在视图上应用3D变换时防止潜在的剪切问题。

编辑:要回答您的问题,图层默认为NONE,因此不需要RAM。硬件加速绘图和硬件层是两回事。 HW加速绘图意味着绘图命令,例如,绘制到Canvas时,由GPU而不是CPU完成。 HW层意味着绘图的结果被保存到GPU的存储器中,因此可以稍后显示结果(例如纹理),而不是再次重新绘制视图。

编辑2 :第一次编辑是我自己的,但我在编辑时退出了SO:D

答案 1 :(得分:1)

用简单的语言表示:硬件加速是API 14+上默认提供的功能,但不支持所有2D绘图操作。这意味着某些自定义视图可能不支持它,但由于它默认启用,因此可能会导致某些自定义视图呈现问题。

如果问题,请检查以下链接: http://postimg.org/image/6wzssbdbr/

来到图层类型,在Android的所有版本中,视图都可以通过使用视图的绘图缓存或使用Canvas.saveLayer()渲染到屏幕外缓冲区。屏幕外缓冲区或层具有多种用途。在动画复杂视图或应用合成效果时,您可以使用它们来获得更好的性能。

LAYER_TYPE_NONE:视图正常呈现,不受屏幕外缓冲区支持。这是从1到13的所有API的默认行为。

LAYER_TYPE_HARDWARE:如果应用程序是硬件加速的,则视图将在硬件中呈现为硬件纹理。如果应用程序不是硬件加速,则此图层类型的行为与LAYER_TYPE_SOFTWARE相同。这是所有API 14 +的默认行为。

LAYER_TYPE_SOFTWARE:视图在软件中呈现为位图。

如果任何视图需要,我们可以通过设置yourViewObject.setLayerType(View.LAYER_TYPE_SOFTWARE,null);来禁用它。

希望这可以解释。