性能优化
性能优化这个东西是需要慢慢打磨的,甚至有时候投入和产出并不能成正比。但虽说效果没有开发功能那么明显,还是值得我们去做的。一方面需要我们在日常开发中就有良好的习惯,另一方面在遇到相关问题或是瓶颈时能有办法或者思路去分析和解决。
书中介绍了绘制优化和内存优化,其他方面的优化还有电量优化,启动优化,存储优化,流量优化,图片优化和 APK 优化等等。
绘制优化
关于绘制优化,在我的第一印象里是指布局优化,即尽量减少布局时的层级关系,重叠的情况下尽量不要都设置背景。可如果再往深了就不会了,文中恰好从原理角度分析,为什么需要去做绘制优化,以及绘制优化怎么做。
绘制原理
在系统应用层,我们接触到的 View 会做 measure, layout, draw 这三步工作,而经过 Native 层进行渲染时,最终是由 CPU 负责整个过程中的计算,GPU 负责栅格化,渲染(这两个概念简单理解就是会消耗资源),CPU 和 GPU 通过图形驱动层进行连接通信,确保工作的有序进行。(这里实际就是说绘制需要 CPU 和 GPU 资源,当绘制的东西多了,资源开销就大了,性能就会有所下降)
帧数 图形处理器每秒钟刷新的次数。我们知道动画其实就是静态图片一张张的快速变化(gif 图的原理就是这样,如果gif 图用的静态图片很多就会表现的很流畅),不过这个本质原因还是因为人大脑,一旦单位时间内静态图片变化的多了,人就感觉是动的了。
所以为了保证人感觉动画流畅,一秒内刷新 60 次,或者说一秒内静态图片变化 60 次是比较好的效果,也就是帧数 60。换算起来要 16.6667 ms 刷新一次屏幕,Android 系统每隔 16 ms 会发出 VSYNC 信号用来刷新,虽然我们感觉不到,但其实屏幕一直在变。(生活中有个有趣的现象就是用摄像机,手机录像也行拍电视的时候,从视频里能看到电视屏幕会有一条条杠杠在跑,这个就是电视屏幕一直在刷)
假设手机屏幕此时刚好到了刷新点,开始了一轮刷新,正常来说要 16.6667 ms 内结束,不然下次刷新就来了。可如果 16.6667 ms 到了还没刷完,那么下个刷新就不能做,只能等这次做完。这么一来就产生了丢帧,丢的越多,我们感觉越明显,也就越卡顿,所以平时手机表现出来的卡顿就是丢帧现象。
丢帧原因
- 布局过于复杂,嵌套太多
- 同一时间动画执行次数过多
- View 过渡绘制
- 在 UI 线程中做了耗时操作
- 等等
分析绘制性能工具
为了对现有应用的绘制情况进行量化,便于后续的性能分析,我们可以借助以下工具,
-
Profile GPU Rendering
这个就是手机设置里的 GPU 呈现模式分析 -
Systrace
-
Traceview
-
显示 GPU 视图更新
这个也是手机里
布局优化
布局优化主要的内容就是优化 xml 布局的嵌套层级,尽可能的平铺,可以试试用 Merge 标签,不过 Merge 的使用有一定限制。当然在考虑布局复用的时候可以用上 Include 标签。
除此之外,书中还提到了 ViewStub,但我感觉很鸡肋,可以不考虑。
对于已做好优化的布局,我们可以用 Hierarchy Viewer 进行层级验证,这个工具也能直观的描述层级关系。
最后
平常项目里可能不会太严格的去扣绘制优化,除非用多了自定义控件,动画特效又比较多的情况下。另外我觉得平常开发时就注重这方面的考虑会比后续做优化的性价比高很多。
网友评论