硬件加速是什么?

Posted by Jfson on 2019-06-15

Android 中的 Hardware Layer 详解

Android硬件加速原理与实现简介

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

1
2
3
4
5
6
7
8
9
CPU更擅长复杂逻辑控制,而GPU得益于大量ALU和并行结构设计,更擅长数学运算。
页面由各种基础元素(DisplayList)构成,渲染时需要进行大量浮点运算。
硬件加速条件下,CPU用于控制复杂绘制逻辑、构建或更新DisplayList;GPU用于完成图形计算、渲染DisplayList。
硬件加速条件下,刷新界面尤其是播放动画时,CPU只重建或更新必要的DisplayList,进一步提高渲染效率。
实现同样效果,应尽量使用更简单的DisplayList(canvans.draw()),从而达到更好的性能(Shape代替Bitmap等)。
  • draw流程执行结束后DisplayList构建完成

理解Android硬件加速的小白文

Android 4.+开始,默认情况下都是支持跟开启了硬件加速的,也存在手机支持硬件加速,但是部分API不支持硬件加速的情况,如果使用了这些API,就需要主关闭硬件加速,或者在View层,或者在Activity层,比如Canvas的clipPath等。

总结

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

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

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

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

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

    https://developer.android.google.cn/guide/topics/graphics/hardware-accel )。

踩坑

之前遇到的一个自定义View, draw的bug,比较经典。bitmap draw的时候透明区域变黑了。android drawBitmap 透明区域 变黑

总结

从上面的六个案例可以看到,相同的动画,在不同的 LayerType 之下,其性能表现差别很大,这还只是简单的属性动画,如果碰到更加复杂的动画,性能差别会更大。

我们对上面几个案例和表现出来的性能数据做一下简单的总结:

  1. 如果只是单纯的做动画,不动态修改 View 的内容,那么性能表现为: Hardware Layer >= Software Layer > Normal Layer。
  2. 如果做动画同时动态修改 View 的内容,那么性能表现: Normal Layer > Software Layer = Hardware Layer。
  3. Hardware Layer 对动画性能确实有很大的提升,但是如果你用不好,那么还不如不用。
  4. 如果通过 Systrace 发现你做动画的时候每一帧都在 buildDrawingCache/SW (主线程) 或者 buildLayer (渲染线程),那么请查看你的代码的逻辑。
  5. 有些情况下是由于系统的原因,比如图片比 Cache 大,invalidate 逻辑问题,可以联系手机厂商进行一起修改。

pv UV: