最近被公司外派到兄弟公司支援某个app的重构,业务重构过程中,有测试反馈说重构后的版本相比之前的版本出现了严重的卡顿问题,于是开始了View层级的性能优化。本篇文章主要是讲述View性能的发现、调试,不详细介绍View渲染的原理、调试工具如何使用等。不过本文会给出相应知识点的相关链接,大家如需详细了解,可点击进入对应文章。
本文从简略讲述View的渲染原理和三种常用ViewGroup性能分析出发,然后介绍发现APP运行过程中各种View性能检测的工具,并详细介绍如何在过度渲染、频繁渲染、渲染范围、布局层级、UI工作量等方面进行优化。
每个View的渲染都包括Measure、Layout和Draw三个过程,其中Measure用来计算View的大小,Layout用来计算View的位置,Draw用来绘制View,每个步骤的具体流程可参见链接:http://www.cnblogs.com/jycboy/p/6066654.html
View的渲染原理
单个View的渲染
每个View的渲染都包括Measure、Layout和Draw三个过程,其中Measure用来计算View的大小,Layout用来计算View的位置,Draw用来绘制View,每个步骤的具体流程可参见链接:http://www.cnblogs.com/jycboy/p/6066654.html
- 绘制自身背景
- 绘制自身内容
- 绘制子控件
- 控制滚动条、阴影等部分
View的渲染流程
单独为一个View执行刷新操作,并不会仅仅更新该View,而是会逐级上报,一直到rootview,并通过各种条件判断是否需要重新绘制其它View,有此可以看出,稍微使用不当,会很容易导致全屏渲染,而我们发现的性能问题,也即是该原因引起的。为了能更好的了解优化方案,掌握了解View渲染的流程是非常有必要的。
每次对View的刷新都会执行以上流程,详细情况请参见https://www.cnblogs.com/jycboy/p/6219915.html和http://www.cnblogs.com/jycboy/p/6066654.html
ViewGroup的性能分析
我们知道View通常都是依附ViewGroup存在,ViewGroup中存放View的个数以及相互依赖也是影响性能的一个重要原因。我们常用的ViewGroup为FrameLayout、LinearLayout和RelativeLayout,这三种Layout在布局时处理方式不同,所带来的效率也肯定存在差异。本文不详细介绍三种Layout的区别以及在渲染过程