我终于闲下来了 天 真是疯狂的几个月! LZ 刚刚离职 准备换工作了,哈哈哈
今天来解决一下android 中的性能优化相关
首先性能优化 我们可以从这几个方面入手
1 布局优化
2 内存优化
3 使用各类工具优化
第一点 先来谈谈布局优化
1.画面卡顿根本原因
说道布局优化就要先说说 android ui的渲染机制。 人眼看到的流畅 需要画面帧数达到 40到60帧每秒,玩过pc游戏的应该对帧数概念非常了解 最佳fps 在60左右,这也是显卡性能高低评判的标准之一,在android中 系统通过VSYNC信号触发对ui的渲染和重绘 (不知道vsync的可以看这篇文章 http://blog.csdn.net/xiangyuxiangyu123/article/details/66475513);
间隔时间为16ms 其实就是1000ms 显示60帧换面的单位时间,如果系统每次渲染的时间都在这个16ms之内 那么我们看到的ui画面将是非常流畅的 想要实现这样的效果就需要我们所有的程序逻辑都保持在16ms内 如果不能再16ms内完成 会造成丢帧现象 也就是 当前该重绘的帧被未完成的逻辑阻塞,例如一次绘制任务耗时20ms,那么在16ms系统发出vsync信号就无法绘制该帧就被丢弃,等待下次信号才开始绘制,导致16*2ms内部显示同一帧画面 这就是画面卡顿的原因
查看方式 android 系统提供了检测ui渲染时间的工具,打开 开发者选项,选择 Profile GPU Rendering 选中 On screen as bars的选项 屏幕上出现一些条形图() ,如下
蓝色代表 测量绘制displayList的时间 红色代表 OpenGL 绘制displayList的时间 黄色代表 CPU等待GPU处理的时间。 中间绿色线代表 VSYNC 的 16ms 我们需要做的就是将所有条形图 都控制在绿线以下。
2 避免Overdraw
overdraw 过度绘制会浪费很多的cpu Gpu资源 例如系统迷人绘制activity的背景 如果再给布局绘制了重叠的背景, 那么默认activity的背景就属于无效的过度绘制 overdraw android 系统在开发者选项中提供了检测工具 enable GPU overDraw 激活后可以通过界面上的颜色来判断Overdraw的次数
借张图 来演示一下 我们的目标只有一个 增大蓝色区域 减少红色区域!
3 优化布局层级
android 系统对view进行测量、布局、和绘制时 都是通过对view数的遍历来进行操作的 如果一个view树的高度太高 就会严重影响测量布局和绘制的速度 因此优化布局第一个方法就是降低view树的高度 google也在其api文档中建议view树的高度不宜超过10层 在早期版本中 google使用Linerlayout作为跟布局 而现在 使用Relativelayout作为根布局 其原因就是通过扁平的relativelayout来降低通过Linerlayout嵌套所产生的布局树高度,从而提高ui渲染的效率 (不过现在推出的布局constantLayout LZ 正在研究当中!!!) 大家有推荐的评论告诉我!
4 避免嵌套过多无用布局
嵌套布局会使 view树的高度 越来越高 布局时 我们可以根据自身布局的特点来选择不同layout组建 从而避免通过某一种layout组件来实现功能时的局限性,从而造成嵌套过多的情况发生。
5 使用 <include>标签重用layout
在应用界面中 为保证风格的统一 会有很多共通的ui 如果每个界面都复制一份这样的代码 不仅增加了维护的程序的冗余性 也为后期维护带来了不便。
6 使用ViewStub实现View的延迟加载
ViewStub 是一个不可见的,大小为0的View,最佳用途就是实现View的延迟加载,避免资源浪费,在需要的时候才加载View
代码自测,没有技术含量 随便写写就行
<ViewStub
android:id="@+id/pic_stub"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:inflatedId="@+id/pic_view_id_after_inflate"
android:layout="@layout/pic_view" />
有两种方式显示这个view
一种 setVisibility() 另一种 inflate()方法 这两种方式都可以是viewstub重新展开 显示引用的布局 唯一的区别就是
注意 一但viewstub 被显示出来之后 viewstub就不存在了 所以两次调用inflate()方法会报错 或setvisibility();
与view的区别在哪? viewstub只有显示的时候才会渲染布局 view.gone(),初始化布局树时就已经添加在布局树上了 相比之下 viewStub效率更高!
布局优化工具: Hierarchy Viewer 这个不陌生吧 陌生我也没招自己百度看看吧 用法我就不说了 有想了解的朋友自行百度!
内存优化 明天再说!!!