安卓系统中的硬件层和硬件加速

6
我刚刚了解了硬件加速并观看了这个视频。现在我有点困惑。 硬件加速意味着绘图操作由GPU执行,并且在Android 3.0+上默认启用。 如果启用了硬件加速,为什么View的层类型默认情况下是LAYER_TYPE_NONE?我认为它应该是LAYER_TYPE_HARDWARE硬件层与保持View在离屏缓冲区中有关。
看起来常量 View.LAYER_TYPE_NONE, View.LAYER_TYPE_HARDWARE, 和 View.LAYER_TYPE_SOFTWARE 并不是关于硬件加速的。它们是为了保持 View 在离屏缓冲区,以避免每次View的透明度和其他属性改变时都要重新绘制。
2个回答

5
View.LAYER_TYPE_HARDWARE 表示视图将由硬件层支持,例如纹理、FBO... 因此,可以轻松/几乎免费地应用颜色效果、半透明和其他 GPU 效果,无需重新绘制视图。当视图具有此类效果或将进行动画处理时,启用硬件层是很好的选择。但是硬件层需要大量的 RAM,请小心使用。
文档在这里: LAYER_TYPE_HARDWARE,以下是其中的一句引用:

表示视图具有硬件层。硬件层由硬件特定纹理(通常是 OpenGL 硬件上的 Frame Buffer Objects 或 FBO)支持,会导致视图使用 Android 的硬件渲染管道进行渲染,但仅在为视图层次结构启用硬件加速时才生效。当关闭硬件加速时,硬件层的行为与软件层完全相同。

硬件层对于将特定的颜色滤镜、混合模式和/或半透明度应用于视图及其所有子项非常有用。

可以使用硬件层将复杂的视图树缓存到纹理中,并减少绘制操作的复杂性。例如,在动画化具有平移的复杂视图树时,可以使用硬件层仅渲染一次视图树。

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

编辑:回答您的问题,图层默认为 NONE,因此不会占用 RAM。硬件加速绘图和硬件层是两个不同的概念。硬件加速绘图表示绘制命令(例如绘制到 Canvas 中)由 GPU 而不是 CPU 完成。硬件层表示绘制结果保存在 GPU 的内存中,以便稍后显示结果(例如纹理),而无需重新绘制视图。 编辑 2:第一个编辑是我自己写的,但我在编辑时被登出了 SO :D

3
简单来说,硬件加速是API 14+默认支持的功能,但并不支持所有2D绘图操作。这意味着一些自定义视图可能不支持它,但由于默认启用了它,可能会导致一些自定义视图渲染问题。
请查看以下链接以获取其中一个问题: http://postimg.org/image/6wzssbdbr/ 关于层类型,在所有版本的Android中,视图都可以通过使用视图的绘制缓存或使用Canvas.saveLayer()将其渲染到离屏缓冲区中。离屏缓冲区或图层有几个用途。您可以在动画复杂视图时使用它们以获得更好的性能,或者应用组合效果。
LAYER_TYPE_NONE:视图正常渲染,没有被离屏缓冲区支持。这是API 1到13的所有默认行为。
LAYER_TYPE_HARDWARE:如果应用程序启用了硬件加速,则视图将在硬件中渲染到硬件纹理中。如果应用程序未启用硬件加速,则此层类型的行为与LAYER_TYPE_SOFTWARE相同。这是API 14+的所有默认行为。
LAYER_TYPE_SOFTWARE:视图在软件中呈现为位图。
如果需要,我们可以通过设置yourViewObject.setLayerType(View.LAYER_TYPE_SOFTWARE, null);来禁用任何视图。
希望这能解释清楚。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接