Android中的Hardware Layer

硬件加速和软件加速

很多人会把 Android 中的硬件加速和 Hardware Layer 搞混,会以为启用了硬件加速,就是启用了 Hardware Layer。所以在说 Hardware Layer 之前,我们先说一下硬件加速。

官方文档:https://developer.android.google.cn/topic/performance/hardware-accel

硬件加速,实际上应该叫 GPU 加速,软硬件加速的区别主要是图形的绘制究竟是 GPU 来处理还是 CPU,如果是 GPU,就认为是硬件加速绘制,反之,则是软件绘制。

目前的 Android 版本, 默认情况下都是开了硬件加速的,如果你的 App 没有特殊声明,那么硬件加速就是默认开启的。

硬件加速App的表现

由于默认情况下就是硬件加速,所以我们以最常见的滑动桌面为例,看一下硬件加速情况下 App 在 Systrace 上的表现。硬件加速情况下,App 存在主线程和渲染线程,一帧的绘制是主线程和渲染线程一起配合执行的。

我们把 Systrace 放大,来看每一帧主线程和渲染线程是怎么工作的,GPU 是什么时候介入工作,实现”加速”的。

GPU 的真正介入是在 RenderThread 中的部分操作中。

软件加速App的表现

对应的,软件加速我们也找一个 App 来进行演示:云闪付。

首先放一张全景图,可以看到软件渲染下,只有主线程,没有渲染线程,所有的渲染工作,都在主线程完成,同时可以看到,软件渲染下,每一帧的执行时间都非常长,超过1个 Vsync 周期,所以滑动的时候会一卡一卡的,非常难受。

我们把 Systrace 放大,来看每一帧主线程是怎么工作的。

总结

通过上面的对比以及推荐的三篇文章的阅读,你应该对硬件渲染和软件渲染的区别了然于胸,这里总结一下:

  1. 硬件渲染情况下,app 存在主线程和渲染线程;软件渲染情况下, app 只有主线程没有渲染线程。

  2. 硬件渲染情况下,app 最终绘制是借助 GPU 来实现 ;软件渲染情况下, app 最终绘制是使用 CPU 来实现(调用 skia 库)。

  3. 硬件渲染情况下,App 的性能是要优于软件渲染的。

  4. 由于部分 api 硬件渲染不支持,所以只能是要软件渲染,做 App 开发的时候,应该尽量避免使用此类 Api(支持情况可以直接在 Android 官方文档里面查看:https://developer.android.google.cn/topic/performance/hardware-accel)。

Software Layer VS Hardware Layer

说完了硬件渲染,我们来说一下 Software Layer 和 Hardware Layer , 这两个概念主要是针对 View 的说的, 与此时 App 是硬件渲染还是软件渲染没有直接关系(但是有依赖关系)。

一个View的LayerType共有三种状态(后面是英文的官方文档):

  1. LAYER_TYPE_NONE : Indicates that the view does not have a layer.

  2. LAYER_TYPE_SOFTWARE :Indicates that the view has a software layer. A software layer is backed by a and causes the view to be rendered using Android’s software rendering pipeline, even if hardware acceleration is enabled.

  3. 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 LAYER_TYPE_SOFTWARE.

LAYER_TYPE_NONE

默认情况下,所有的 View 都是这个 layerType,这种情况下,这个 View 不会做任何的特殊处理,该怎么走怎么走。

LAYER_TYPE_SOFTWARE

Software layerType , 标识这个 View 有一个软件实现的 Layer ,怎么个软件实现法呢,实际上就是把这个 View,根据一定的条件,变成一个 Bitmap 对象。

android/view/View.java
Bitmap bitmap = createBitmap(mResources.getDisplayMetrics(),width, height, quality);

Software layer 的作用如下

  1. When the application is not using hardware acceleration, a software layer is useful to apply a specific color filter and/or blending mode and/or to a view and all its children.(当应用程序不使用硬件加速时,Software layer 可用于将特定的颜色过滤器、混合模式或半透明应用于 View 及其所有子 View)。

  2. When the application is using hardware acceleration, a software layer is useful to render drawing primitives not supported by the hardware accelerated pipeline. It can also be used to cache a complex view tree into a texture and reduce the complexity of drawing operations. For instance, when a complex view tree with a translation, a software layer can be used to render the view tree only once.(当应用程序使用硬件加速时,软件层可用于呈现硬件加速管道不支持的绘图基元。 它还可用于将复杂视图树缓存到纹理中,并降低绘制操作的复杂性。 例如,在使用转换动画复杂视图树时,可以使用软件层仅渲染视图树一次)。

  3. Software layers should be avoided when the affected view tree updates often. Every update will require to re-render the software layer, which can potentially be slow (particularly when hardware acceleration is turned on since the layer will have to be uploaded into a hardware texture after every update.(当受影响的视图树经常更新时,应避免使用软件层。 每次更新都需要重新渲染软件层,这可能会很慢(特别是在打开硬件加速时,因为每次更新后都必须将图层上传到硬件纹理中)。

LAY

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值