Android 上的硬件层和硬件加速

Hardware layers and hardware acceleration on Android

刚刚读到Hardware Acceleration and watched this video.现在有点迷茫

硬件加速表示绘图操作由GPU执行,默认在Android 3.0+上启用。 如果开启了硬件加速,为什么View的图层类型是LAYER_TYPE_NONE by default? I thought it should be LAYER_TYPE_HARDWARE.

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

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

View.LAYER_TYPE_HARDWARE 表示视图将由硬件层支持,例如纹理、FBO...因此可以 easy/almost 自由应用颜色效果、半透明和其他 GPU 效果,而无需重新绘制视图。当视图有这样的效果时或在它被动画之前启用硬件层是很好的。不过硬件层会占用大量内存,所以要小心。

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

Indicates that the view has a hardware layer. A hardware layer is backed by a hardware specific texture (generally Frame Buffer Objects or FBO on OpenGL hardware) and causes the view to be rendered using Android's hardware rendering pipeline, but only if hardware acceleration is turned on for the view hierarchy. When hardware acceleration is turned off, hardware layers behave exactly as software layers.

A hardware layer is useful to apply a specific color filter and/or blending mode and/or translucency to a view and all its children.

A hardware layer can be used to cache a complex view tree into a texture and reduce the complexity of drawing operations. For instance, when animating a complex view tree with a translation, a hardware layer can be used to render the view tree only once.

A hardware layer can also be used to increase the rendering quality when rotation transformations are applied on a view. It can also be used to prevent potential clipping issues when applying 3D transforms on a view.

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

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

用简单的语言来说,就是这样:硬​​件加速是 API 14+ 上默认提供的一项功能,但并非所有 2D 绘图操作都支持。这意味着一些自定义视图可能不支持它,但因为它默认启用,它可能会导致一些自定义视图呈现问题。

检查下方 link 是否存在以下问题: 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); 来禁用它。

希望这能解释清楚。