【问题标题】:Hardware layers and hardware acceleration on AndroidAndroid 上的硬件层和硬件加速
【发布时间】:2017-09-18 17:06:11
【问题描述】:
【问题讨论】:
标签:
android
drawing
android-canvas
android-view
hardware-acceleration
【解决方案1】:
View.LAYER_TYPE_HARDWARE 表示视图将由硬件层支持,例如纹理、FBO...因此,无需重绘视图即可轻松/几乎免费地应用颜色效果、半透明和其他 GPU 效果。当视图具有此类效果或在动画之前启用硬件层是很好的。不过,硬件层会占用大量 RAM,所以要小心。
此处的文档:LAYER_TYPE_HARDWARE 以及其中的引文:
表示视图有一个硬件层。硬件层由特定于硬件的纹理(通常是帧缓冲区对象或 OpenGL 硬件上的 FBO)支持,并导致使用 Android 的硬件渲染管道渲染视图,但前提是为视图层次结构打开硬件加速。关闭硬件加速后,硬件层的行为与软件层完全相同。
硬件层可用于将特定的颜色过滤器和/或混合模式和/或半透明应用于视图及其所有子项。
硬件层可用于将复杂的视图树缓存到纹理中并降低绘图操作的复杂性。例如,当使用平移动画复杂视图树时,硬件层可用于仅渲染一次视图树。
当对视图应用旋转变换时,也可以使用硬件层来提高渲染质量。它还可用于防止在视图上应用 3D 变换时出现潜在的裁剪问题。
编辑:为了回答您的问题,该层默认为 NONE,因此它不占用 RAM。硬件加速绘图和硬件层是两个不同的东西。硬件加速绘图意味着绘图命令,例如当绘制到Canvas 时,由 GPU 而不是 CPU 完成。 HW 层意味着绘制的结果被保存到 GPU 的内存中,因此可以稍后显示结果(例如纹理),而不是再次重新绘制视图。
编辑 2:第一次编辑是我自己的,但我在编辑时退出了 SO:D
【解决方案2】:
简单地说,硬件加速是 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); 来禁用它。
希望这可以解释。