硬件加速,实际上应该叫 GPU 加速,软硬件加速的区别主要是图形的绘制究竟是 GPU 来处理还是 CPU,如果是 GPU,就认为是硬件加速绘制,反之,则是软件绘制。
|
|
- draw流程执行结束后DisplayList构建完成
Android 4.+开始,默认情况下都是支持跟开启了硬件加速的,也存在手机支持硬件加速,但是部分API不支持硬件加速的情况,如果使用了这些API,就需要主关闭硬件加速,或者在View层,或者在Activity层,比如Canvas的clipPath等。
总结
通过上面的对比以及推荐的三篇文章的阅读,你应该对硬件渲染和软件渲染的区别了然于胸,这里总结一下
硬件渲染情况下,app 存在主线程和渲染线程;软件渲染情况下, app 只有主线程没有渲染线程。
硬件渲染情况下,app 最终绘制是借助 GPU 来实现;软件渲染情况下, app 最终绘制是使用 CPU 来实现 (调用 skia 库)。
硬件渲染情况下,App 的性能是要优于软件渲染的。
由于部分 api 硬件渲染不支持,所以只能是要软件渲染,做 App 开发的时候,应该尽量避免使用此类 Api (支持情况可以直接在 Android 官方文档里面查看 :
https://developer.android.google.cn/guide/topics/graphics/hardware-accel )。
踩坑
之前遇到的一个自定义View, draw的bug,比较经典。bitmap draw的时候透明区域变黑了。android drawBitmap 透明区域 变黑
总结
从上面的六个案例可以看到,相同的动画,在不同的 LayerType 之下,其性能表现差别很大,这还只是简单的属性动画,如果碰到更加复杂的动画,性能差别会更大。
我们对上面几个案例和表现出来的性能数据做一下简单的总结:
- 如果只是单纯的做动画,不动态修改 View 的内容,那么性能表现为: Hardware Layer >= Software Layer > Normal Layer。
- 如果做动画同时动态修改 View 的内容,那么性能表现: Normal Layer > Software Layer = Hardware Layer。
- Hardware Layer 对动画性能确实有很大的提升,但是如果你用不好,那么还不如不用。
- 如果通过 Systrace 发现你做动画的时候每一帧都在 buildDrawingCache/SW (主线程) 或者 buildLayer (渲染线程),那么请查看你的代码的逻辑。
- 有些情况下是由于系统的原因,比如图片比 Cache 大,invalidate 逻辑问题,可以联系手机厂商进行一起修改。