Android 性能优化

我终于闲下来了 天 真是疯狂的几个月! 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 这个不陌生吧  陌生我也没招自己百度看看吧  用法我就不说了 有想了解的朋友自行百度!

内存优化 明天再说!!!  

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值