忙完了双十一,开始看 Android Dev Summit 2018 的一些视频,后面会对这场交流会的几个感兴趣的 Topic 进行学习和分享。博客内容主要是对视频内容的总结和必要的扩展,其实看完视频就应该理解的差不多了。
这个 Topic 主要分析了 TextView 在渲染时(主要是 onMeasure()
阶段)的性能表现,并分析其耗时的原因,以及优化性能的一些方法。
性能分析
经过上面的测试,发现 Text 在渲染的时候非常消耗性能,那么就会有人问两个问题:
- 为什么文字渲染流程这么费时呢?
- 能不能将文字渲染过程放到后台线程中呢?
首先回答第一个问题,为什么文字渲染流程这么费时。要回答这个问题,就需要了解文字渲染的流程是什么样的。
Text 渲染流程
在 TextView
的 onMeasure()
过程中,90% 以上的代码都是 native 代码,
在后台线程计算 Text 渲染
既然 Text 渲染这么耗时,那么能不能将这个耗时流程放到后台线程中呢?如果放到后台线程中,会面临下面几个问题:
- 在 Android P 之前,Text 渲染的 native 代码需要一个非常大的同步代码块,而在 Android P 里面将这个同步代码块的粒度变小,使得多线程渲染效率得到了提高。
- 布局的时候需要
width
参数,但是在onMeasure()
结束之前,是拿不到width
参数的,这就变成了先有鸡还是先有蛋
的问题了。
为了解决上面的问题,于是有了 PrecomputedText 类。
优化方案
- 关闭自动换行功能,性能提升大约 1 倍。
- 在 Android P 和 Android X 上面使用
PrecomputedText
API,性能大约提升 17 倍。 - 如果使用了 Android Support Library 25+ 版本以上的 RecyclerView 控件,那么可以使用 Prefetch 类,并配合 PrecomputedText,以提升性能。